⊗jsPmPrEHT 478 of 505 menu

Skrytí textu při editaci prvku v JavaScriptu

Nyní uděláme to, aby se při editaci input objevil přímo v odstavci - místo textu tohoto odstavce. Ať se poté po ukončení editace input odstraní a místo něj se znovu objeví text odstavce.

Pusťme se do implementace.

Pro začátek uděláme to, aby se kliknutím na odstavec na jeho konec přidal input s textem tohoto odstavce:

let elem = document.querySelector('#elem'); elem.addEventListener('click', function() { let input = document.createElement('input'); input.value = elem.textContent; elem.appendChild(input); });

Náš kód je však velmi nedokonalý - pokaždé po kliknutí na odstavec se do něj přidá nový input.

Přičemž, pokud v prvním inputu bude text odstavce, tak ve druhém inputu již bude text odstavce spolu s prvním inputem, a ve třetím inputu již bude text odstavce spolu se dvěma inputy a tak dále.

Všimněte si také toho, že kliknutí na přidaný input bude považováno za kliknutí na odstavec: je to tím, že input se nachází v odstavci, a kliknutí na input jednoduše probublá nahoru k tomuto odstavci.

To povede k tomu, že po objevení se prvního inputu při pokusu kliknout na něj za účelem zahájení editace, my automaticky provedeme kliknutí na odstavec se všemi z toho vyplývajícími důsledky.

Takže, problém je načrtnut. Nyní jej opravme.

K tomu jednoduše při objevení se inputu odvažme z odstavce obslužnou rutinu kliknutí. V tomto případě povede pouze první kliknutí na odstavec k objevení se inputu, a ostatní kliknutí, provedená po objevení se inputu, budou ignorována.

Implementujme:

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); // odvážeme událost });

Nyní uděláme to, aby při objevení se inputu, text samotného odstavce zmizel. K tomu před vložením inputu textContent odstavce přiřaďme prázdnému řetězci:

let elem = document.querySelector('#elem'); elem.addEventListener('click', function func() { let input = document.createElement('input'); input.value = elem.textContent; // nejprve zapíšeme text odstavce do inputu elem.textContent = ''; // poté odstraníme text odstavce elem.appendChild(input); // poté vložíme input elem.removeEventListener('click', func); });

Nyní uděláme to, aby při ztrátě fokusu v inputu se text tohoto inputu zapsal do odstavce:

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); });

Všimněte si, že nemusíme mazat input - ten se smaže sám, když zapíše svůj text do odstavce: protože input je součástí textu odstavce, tak zápis jakéhokoli textu do tohoto odstavce jednoduše smaže náš input, a to je vše.

Máme však ještě jeden problém: text odstavce bude editován pouze poprvé. Po první editaci opakované kliknutí na text odstavce k ničemu nepovede.

Je to tím, že v momentě objevení se inputu jsme odváželi událost od odstavce z výše popsaných důvodů. Nyní musíme v momentě ukončení editace událost znovu připnout.

Udělejme to:

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); // připneme událost zpět }); elem.removeEventListener('click', func); });

Samostatně, bez nahlížení do mého kódu, vyřešte popsaný úkol.

Čeština
AfrikaansAzərbaycanБългарскиবাংলাБеларускаяDanskDeutschΕλληνικάEnglishEspañolEestiSuomiFrançaisहिन्दीMagyarՀայերենIndonesiaItaliano日本語ქართულიҚазақ한국어КыргызчаLietuviųLatviešuМакедонскиMelayuမြန်မာNederlandsNorskPolskiPortuguêsRomânăРусскийසිංහලSlovenčinaSlovenščinaShqipСрпскиSrpskiSvenskaKiswahiliТоҷикӣไทยTürkmenTürkçeЎзбекOʻzbekTiếng Việt
Používáme soubory cookie pro fungování webu, analýzu a personalizaci. Zpracování údajů probíhá v souladu s Zásadami ochrany osobních údajů.
přijmout vše přizpůsobit odmítnout