⊗jsPmPrEHT 478 of 505 menu

Piilotetaan teksti elementtiä muokatessa JavaScriptillä

Tehdään nyt niin, että muokkauksen aikana input-kenttä ilmestyy itse kappaleen sisään - tekstin tilalle tässä kappaleessa. Olkoon sitten muokkauksen päätyttyä input-kenttä poistuu, ja sen tilalle ilmestyy taas kappaleen teksti.

Ryhdytään toteuttamaan.

Aluksi tehdään niin, että klikatessa kappaletta sen loppuun lisätään input-kenttä tämän kappaleen tekstillä:

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

Koodimme on kuitenkin erittäin epätäydellinen - joka kerta kun kappaleeseen klikataan, siihen lisätään uusi input-kenttä.

Samaan aikaan, jos ensimmäisessä input-kentässä on kappaleen teksti, niin toisessa input-kentässä on jo kappaleen teksti yhdessä ensimmäisen input-kentän kanssa, ja kolmannessa input-kentässä on jo kappaleen teksti yhdessä kahden input-kentän kanssa ja niin edelleen.

Huomaa myös, että klikatessa lisättyyn input-kenttään se tulkitaan kappaleeseen klikkaamiseksi: asiassa on kyse siitä, että input-kenttä sijaitsee kappaleessa, ja klikkaus input-kenttään yksinkertaisesti kupluu ylös tähän kappaleeseen.

Tämä johtaa siihen, että ensimmäisen input-kentän ilmestyttyä yrityksessä painaa sitä aloittaaksesi muokkaamisen, me teemme automaattisesti klikkauksen kappaleeseen kaikkine seuraamuksineen.

Niin, ongelma on hahmoteltu. Korjataan nyt se.

Tätä varten yksinkertaisesti input-kentän ilmestyessä irrotetaan kappaleesta klikkauksen käsittelijä. Tässä tapauksessa vain ensimmäinen klikkaus kappaleeseen johtaa input-kentän ilmestymiseen, ja muut klikkaukset, jotka on tehty input-kentän ilmestymisen jälkeen, jätetään huomiotta.

Toteutetaan:

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); // irrotetaan tapahtuma });

Tehdään nyt niin, että input-kentän ilmestyessä itse kappaleen teksti katoaa. Tätä varten ennen input-kentän lisäämistä textContent kappaleesta asetetaan tyhjäksi merkkijonoksi:

let elem = document.querySelector('#elem'); elem.addEventListener('click', function func() { let input = document.createElement('input'); input.value = elem.textContent; // ensin kirjoitetaan kappaleen teksti input-kenttään elem.textContent = ''; // sitten poistetaan kappaleen teksti elem.appendChild(input); // sitten lisätään input-kenttä elem.removeEventListener('click', func); });

Tehdään nyt niin, että kun input-kenttä menettää fokuksinsa, tämän input-kentän teksti kirjoitetaan kappaleeseen:

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

Huomaa, että meidän ei tarvitse poistaa input-kenttää - se poistaa itsensä, kun kirjoittaa tekstinsä kappaleeseen: koska input-kenttä on osa kappaleen tekstiä, niin minkä tahansa tekstin kirjoittaminen tähän kappaleeseen yksinkertaisesti poistaa meidän input-kenttämme, ja siinä se.

Meillä on kuitenkin vielä yksi ongelma: kappaleen teksti muokkautuu vain ensimmäisen kerran. Ensimmäisen muokkauksen jälkeen toistuva painallus kappaleen tekstiin ei johda mihinkään.

Asiassa on kyse siitä, että input-kentän ilmestyessä me irrotimme tapahtuman kappaleesta yllä kuvattujen syiden vuoksi. Nyt meidän on tarpeen muokkauksen päätyttyä kiinnittää tapahtuma takaisin.

Tehdään tämä:

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); // kiinnitetään tapahtuma takaisin }); elem.removeEventListener('click', func); });

Itsenäisesti, katsomatta koodiini, ratkaiskaa kuvattu tehtävä.

Suomi
AfrikaansAzərbaycanБългарскиবাংলাБеларускаяČeštinaDanskDeutschΕλληνικάEnglishEspañolEestiFrançaisहिन्दीMagyarՀայերենIndonesiaItaliano日本語ქართულიҚазақ한국어КыргызчаLietuviųLatviešuМакедонскиMelayuမြန်မာNederlandsNorskPolskiPortuguêsRomânăРусскийසිංහලSlovenčinaSlovenščinaShqipСрпскиSrpskiSvenskaKiswahiliТоҷикӣไทยTürkmenTürkçeЎзбекOʻzbekTiếng Việt
Käytämme evästeitä verkkosivuston toiminnalle, analytiikalle ja personoinnille. Tietojen käsittely tapahtuu Tietosuojakäytännön mukaisesti.
hyväksy kaikki mukauta hylkää