Tetszik a bejegyzés? Iratkozz fel, oszd meg!


A DOM defaultValue trükk

Azt hiszem nem sokan ismerik a beviteli elemek (<input/> és <textarea/>) már 2000-ben DOM által specifikált, és a böngészők által is támogatott egyik lehetőségét, a defaultValue (és defaultChecked) tulajdonságát. Ha beviteli mezőkbe szeretnénk példa vagy súgó szöveget elhelyezni amíg azok nem kerülnek szerkesztésre, akkor ezek a tulajdonságok sokat segíthetnek.

"HTML sorcerer"

Az input és textarea elemek defaultValue tulajdonsága azt az értéket tartalmazza, mely a value segítségével eredetileg be volt állítva (vagy pedig amit korábban beállítottunk – írható érték). Ezt tudjuk kihasználni egy súgószöveg elhelyezésére:

<input id="email" type="text" value="ide írjad az email címed" />

Majd pedig hozzárendelünk JavaScript eseménykezelést:

var iEmail = document.getElementById("email");
iEmail.onfocus = function() {
  if (this.value == this.defaultValue) {
    this.value = "";
  }
}
iEmail.onblur = function() {
  if (this.value == "") {
    this.value = this.defaultValue;
  }
}

Ha az input mező fókuszba kerül, és a súgószöveg az értéke, akkor töröljük azt, ha elveszti a fókuszt, és még nem írt bele a felhasználó semmit, akkor pedig visszaállítjuk az eredeti értéket.

Két dolgot lehet még javítani a kódon. Az egyik, hogy alapból adunk egy class="default" osztályt az elemnek, ami felel a szöveg elszürkítéséért (color: #888; – vagy bármilyen más módon jelzi a felhasználó számára, hogy ezt nem ő írta be. Ezután a fókuszkor nem az egyezőséget, hanem ennek az osztálynak a meglétét kell ellenőrizni (JS kódkönyvtártól függő módon vannak erre függvények, pl. this.hasClass("default")), és ha megvan akkor leszedni, fókusz elvesztésekor pedig ha üres volt a mező értéke, akkor az érték visszaállítása mellett visszaállítani az osztályt is (this.removeClass("default") és this.addClass("default")). Ezzel azt a hibalehetőséget is megoldjuk, ha a felhasználó ugyanazt az értéket írja be, mint ami a súgószövegünk volt.

A másik javítási irány a form elküldésekor a súgószövegek eltüntetése az input mezőből, ez kiegészíthető a mező kitöltésének ellenőrzésével, kliens oldali validációval is persze. A szerver oldali validációt lehet, hogy célszerű kiegészíteni a súgószövegre szűréssel is.

A defaultValue mind input, mint textarea esetében működőképes, sőt, a defaultChecked segítségével rádiógombok, checkboxok esetén is lekérdezhető az alapbeállítás (már kérdés, hogy ott nincs sok értelme a fent leírt módszernek).

3 Hozzászólás - “A DOM defaultValue trükk”


  • Jó, trükk köszi :) Annyit tennék hozzá, hogy esetleg a defaultValue értékét is érdemes lehet JavaScripttel megadni domcontentloaded-re, mert sokszor látni olyat, hogy van mondjuk 2 default érték egy login formban, amit submitra elküld (értelmetlenül).
    Egy másik dolog merült fel bennem még – mi történik, ha mondjuk login/password mezőkről van szó és a böngészőben megjegyeztettem az értékeket? Ilyenkor mindig a böngésző “győz”? :)

  • yaanno: A defaultValue állítgatása semmilyen látható változást nem okoz, tehát a felhasználónév+jelszó párosokhoz nincsen köze. Azok kitöltése a tapasztalataim szerint csak akkor történik meg, ha a mező value értéke az oldal betöltődésekor üres.

    Ide passzol még az, amikor kitöltesz egy mezőt, és vagy újratöltöd az oldalt egy sima frissítéssel, vagy elnavigálsz róla, de a Vissza gombbal visszatérsz. Ekkor a mező újratöltés/elnavigálás előtti állapota fog látszódni, de ez sem befolyásolja a defaultValue értéket. Amit bizonyos körülmények között érdemes lehet megtenni, az az oldal betöltődésekor a mező value tulajdonságának felülírása a defaultValue értékkel, megelőzve azt, hogy a frissítés/elnavigálás előtti állapota látszódjon (de ez persze nem mindig célszerű).

  • András: Á igen, így már OK, értem.

Te mit gondolsz?