Szöveg elrejtése elem szerkesztésekor JavaScript nyelven
Most tegyük úgy, hogy szerkesztéskor a beviteli mező magában a bekezdésben jelenjen meg - a bekezdés szövege helyett. Legyen ezután a szerkesztés befejeztekor a beviteli mező eltávolítva, és helyette ismét a bekezdés szövege jelenjen meg.
Lássuk a megvalósítást.
Kezdetként tegyük úgy, hogy a bekezdésre kattintáskor a végéhez hozzáadódik egy beviteli mező a bekezdés szövegével:
let elem = document.querySelector('#elem');
elem.addEventListener('click', function() {
let input = document.createElement('input');
input.value = elem.textContent;
elem.appendChild(input);
});
A kódunk azonban nagyon tökéletlen - minden egyes alkalommal, amikor a bekezdésre kattintunk, új beviteli mező fog hozzáadódni.
Eközben, ha az első beviteli mezőben a bekezdés szövege áll, akkor a második beviteli mezőben már a bekezdés szövege fog állni az első beviteli mezővel együtt, a harmadik beviteli mezőben pedig már a bekezdés szövege fog állni két beviteli mezővel együtt, és így tovább.
Figyeljünk arra is, hogy a hozzáadott beviteli mezőre kattintás a bekezdésre kattintásként értékelődik ki: az történik, hogy a beviteli mező benne van a bekezdésben, és a rá kattintás egyszerűen felbuborékolt ehhez a bekezdéshez.
Ez ahhoz vezet, hogy az első beviteli mező megjelenése után az rá kattintás próbálkozásakor annak érdekében, hogy szerkesztésbe kezdjünk, mi automatikusan kattintást végzünk a bekezdésen minden ebből fakadó következménnyel.
Tehát, a probléma körvonalazva. Most javítsuk ki.
Ehhez egyszerűen a beviteli mező megjelenésekor oldjuk le a kattintás kezelőjét a bekezdésről. Ebben az esetben csak az első kattintás a bekezdésre fog vezetni a beviteli mező megjelenéséhez, a többi kattintás, amely a beviteli mező megjelenése után történik, figyelmen kívül lesz hagyva.
Valósítsuk meg:
let elem = document.querySelector('#elem');
elem.addEventListener('click', function func() {
let input = document.createElement('input');
input.value = elem.textContent;
elem.appendChild(input);
elem.removeEventListener('click', func); // levesszük az eseményt
});
Most tegyük úgy, hogy a beviteli mező megjelenésekor,
maga a bekezdés szövege eltűnjön. Ehhez
a beviteli mező beszúrása előtt a bekezdés textContent
értékét adjuk üres sztringnek:
let elem = document.querySelector('#elem');
elem.addEventListener('click', function func() {
let input = document.createElement('input');
input.value = elem.textContent; // először a bekezdés szövegét írjuk a beviteli mezőbe
elem.textContent = ''; // majd eltávolítjuk a bekezdés szövegét
elem.appendChild(input); // majd beillesztjük a beviteli mezőt
elem.removeEventListener('click', func);
});
Most tegyük úgy, hogy a beviteli mező fókuszvesztésekor a beviteli mező szövege beírásra kerüljön a bekezdésbe:
let elem = document.querySelector('#elem');
elem.addEventListener('click', function func() {
let input = document.createElement('input');
input.value = elem.textContent;
elem.textContent = '';
elem.appendChild(input);
input.addEventListener('blur', function() {
elem.textContent = this.value;
});
elem.removeEventListener('click', func);
});
Figyeljünk arra, hogy nem kell eltávolítanunk a beviteli mezőt - az magától eltávolítja, amikor beírja a saját szövegét a bekezdésbe: mivel a beviteli mező a bekezdés szövegének része, ezért valamilyen szöveg beírása ebbe a bekezdésbe egyszerűen eltávolítja a beviteli mezőnket, és ennyi.
Van azonban még egy problémánk: a bekezdés szövege csak az első alkalommal fog szerkeszthető lenni. Az első szerkesztés után a bekezdés szövegére történő ismételt kattintás nem fog semmihez sem vezetni.
Az történik, hogy a beviteli mező megjelenése pillanatában levettük az eseményt a bekezdésről a fent leírt okok miatt. Most szükséges, hogy a szerkesztés befejezése pillanatában visszaadjuk az eseményt.
Végezzük ezt el:
let elem = document.querySelector('#elem');
elem.addEventListener('click', function func() {
let input = document.createElement('input');
input.value = elem.textContent;
elem.textContent = '';
elem.appendChild(input);
input.addEventListener('blur', function() {
elem.textContent = this.value;
elem.addEventListener('click', func); // visszaadjuk az eseményt
});
elem.removeEventListener('click', func);
});
Önállóan, be nem nézve a kódomba, oldja meg az ismertetett feladatot.