U bevindt zich hier: Forum » Tutorials » [JavaScript] Standaard-waarde in een text-input
   Actief Topic: [JavaScript] Standaard-waarde in een text-input

Vorige ( 1 ) Volgende

superkluns
Tester
avatar
# Gepost op 02-04-2010 00:32
Bewerkt door superkluns op 11-07-2010 12:42


Soms kan het best handig zijn om een standaard-waarde in een text-input te hebben. Je kun bijvoorbeeld bij een formulier om je aan te melden voor een nieuwsbrief dit gebruiken:
Plain | Plain new window | HTML code:
  1. <input type="text" name="naam" value="Vul je naam in" /><br />
  2. <input type="text" name="email" value="Vul je email-adres in" /><br />
  3. <input type="submit" value="verzenden" />
  4. </form>

Maar als je nu op het input-veld klikt, moet je eerst nog handmatig de standaardtekst verwijderen. En als je dat heb gedaan en je laat het veld leeg achter, dan blijft ie ook leeg. Allemaal dingen die niet heel gebruiksvriendelijk zijn.

Eerst gaan we de html maar eens veranderen. We gaan er dit van maken:
Plain | Plain new window | HTML code:
  1. <input type="text" name="naam" standaard="Vul je naam in" /><br />
  2. <input type="text" name="email" standaard="Vul je email-adres in" /><br />
  3. <input type="submit" value="verzenden" />
  4. </form>

Het attribuut 'standaard' bestaat helemaal niet (is is dus officeel ook niet valide). Dat heb ik zelf verzonnen. Dit alleen zal dus ook niks doen. Daar is een javascript voor nodig. In dez javascript kun je ook de attribuutnaam wijzigen. Dus je kunt ervoor kiezen om bv. 'title' te nemen. Een valide oplossing:
Plain | Plain new window | Javascript code:
  1. // vul hier de attribuutnaam in die je wil gebruiken.
  2. var standaard_attr = 'standaard';
  3.  
  4. $(document).ready(function(){
  5.     $("input[" + standaard_attr + "]").each(function(){
  6.         $(this).focus(function(){
  7.             if($(this).is(".standaard")) {
  8.                 $(this).removeClass('standaard').val('');
  9.             }
  10.         }).blur(function(){
  11.             if($(this).val() == '' || $(this).val()==$(this).attr(standaard_attr)) {
  12.                 $(this).addClass('standaard').val($(this).attr(standaard_attr));
  13.             }
  14.         }).blur();
  15.     });
  16.     $("form").submit(function(){
  17.         $(this).find("input[class='standaard']").each(function(){
  18.             $(this).val('');
  19.         });
  20.     });
  21. });

LET OP!!
Ik maak gebruik van jQuery, zorg ervoor dat je in je html-document ook een verwijzing maakt naar jquery.js, te downloaden op http://jquery.com/

Als je net als Erwin een code zonder jQuery wil gebruiken, dan verwijs ik je door naar 2 postst naar beneden.

Update's code:
11-7-2010: bugje gefixed bij het wissen van de standaard-waardes bij het verzenden van het formulier. (jQuery-functie 'children' vervangen door 'find')

Wat deze javascript doet is het volgende:
- Ieder input-veld met een standaardwaarde krijgt, als de pagina geladen is, die waarde als value en de class 'standaard' wordt toegevoegd. Hierdoor kan je de standaard-waarde bv. een lichter kleurtje geven. Ik heb dit in mijn css staan:
Plain | Plain new window | CSS code:
  1. input.standaard {
  2. color:#999999;
  3. }

- als je dan op het veld klikt (of er naartoe 'tabt') dan verdwijnt de standaardwaarde en de class 'standaard' verdwijnt als de class 'standaard' aanwezig is. Als die namelijk niet aanwezig is, dan staat er een input van de gebruiker, en die moet natuurlijk niet weggehaald worden.
- als je dan van het veld weg gaat, dan kijk ie of het veld leeg is, of de standaardwaarde bevat. Zo ja: dan de standaardwaarde erin zetten en de class standaard toevoegen, zo nee: dan doet ie niks. het inputveld heeft dan niet de class standaard, ziet er dus ook normaal uit, en hij wordt niet gewist als er op geklikt wordt.
- nog een belangrijk iets. Als het formulier verzonden wordt, dan moeten natuurlijk niet de standaardwaardes verzonden worden. Wat de deze javascript ook doet is als er een formulier verzonden wordt, alle waardes van alle inputs met de class 'standaard' (dus die bevat de standaardwaarde) leeg gemaakt.

Een online voorbeeld: http://moehahahaha.netau.net/voorbeeld/js_standaard_tekst.php

Erwin
Moderator
avatar
# Gepost op 03-04-2010 03:03


Ik heb een paar opmerkingen bij dit artikel:

-Allereerst: Ik zie het nut van het gebruiken van jQuery hier niet helemaal. Als je het gewoon 'zelf' in javascript schrijft, ben je korter uit (nog excl. de jQuery js!). En je code is nu veel lastiger dan gewone simpele regeltjes.
-Je gebruikt een zelf verzonnen attribuut. Dan is je html niet meer valid... Je kan toch veel beter iets als title of rel gebruiken? :O

DNA is een zeiksnor

superkluns
Tester
avatar
# Gepost op 03-04-2010 13:01
Bewerkt door superkluns op 03-04-2010 13:11


Speciaal voor Erwin dan maar een code zonder jQuery:
Plain | Plain new window | Javascript code:
  1. // vul hier de attribuutnaam in die je wil gebruiken.
  2. var standaard_attr = 'standaard';
  3.  
  4. window.onload = function(){
  5.     var inputs = document.getElementsByTagName('input');
  6.     for(i=0; i<inputs.length; i++) {
  7.         if(inputs[i].getAttribute(standaard_attr)) {
  8.             inputs[i].onfocus = function(){
  9.                 if(this.className == 'standaard') {
  10.                     this.className = '';
  11.                     this.value = '';
  12.                 }
  13.             }
  14.             inputs[i].onblur = function(){
  15.                 if(this.value == '' || this.value == this.getAttribute(standaard_attr)) {
  16.                     this.className = 'standaard';
  17.                     this.value = this.getAttribute(standaard_attr);
  18.                 }
  19.             }
  20.             inputs[i].className = 'standaard';
  21.             inputs[i].value = inputs[i].getAttribute(standaard_attr);
  22.         }
  23.     }
  24.    
  25.     var forms = document.getElementsByTagName('form');
  26.     for(f=0; f<forms.length; f++) {
  27.         forms[f].onsubmit = function(){
  28.             var form_inputs = this.getElementsByTagName('input');
  29.             for(f_i=0; f_i<form_inputs.length; f_i++) {
  30.                 if(form_inputs[f_i].className == 'standaard') {
  31.                     form_inputs[f_i].value = '';
  32.                 }
  33.             }
  34.         }
  35.     }
  36. }

Als ik nog een reden moet geven waarom ik jQuery gebruik: Ik zelf vind het erg fijn werken, dus ik doe tegenwoordig bijna alles met jQuery. Dus automatisch deze tutorial ook. En daarbij komt ook nog eens dat de jQuery-code korter is dan de "normale" js-code.
En de belangrijkste reden: jQuery werkt in iedere browser. Van deze code weet ik dat niet zeker!

En om Erwin weer helemaal gerust te stellen heb ik een regel erbij gezet waarmee je de attribuut-naam kan wijziging. Je kun dus nu in principe iedere naam nemen die je wil.
EDIT: ik heb ff gecontroleerd: rel is ook geen valide attribuut!

Zo goed?

Erwin
Moderator
avatar
# Gepost op 03-04-2010 14:40


Citaat van superkluns
EDIT: ik heb ff gecontroleerd: rel is ook geen valide attribuut!

Oke, dan heb ik rel niet genoemd. :P Voor input heb je nog wel het name attribuut dat gebruikt kan worden :)

Je code is wel iets anders dan ik dacht. Ik dacht dat je het gewoon met onfocus/onblur in de html deed.

Ik heb toevallig pas iets gemaakt met mijn beperkte javascript kennis dat één input moest handelen.
code:
Plain | Plain new window | Javascript code:
  1. function change(input){
  2.     input.style.backgroundPosition = '0px 0px';
  3.     input.style.color = '#777487';
  4.     if(input.value == '010-123456789'){
  5.         input.value= '';
  6.     }
  7. }
  8. function changeBack(input){
  9.     input.style.backgroundPosition = 'bottom left';
  10.     input.style.color = '#cec3c3';
  11.     if(input.value == ''){
  12.         input.value = '010-123456789';
  13.     }
  14. }


Dit verplaatst dus de background, veranderd de value en font color.

DNA is een zeiksnor

superkluns
Tester
avatar
# Gepost op 03-04-2010 15:04
Bewerkt door superkluns op 03-04-2010 15:04


Citaat van Erwin
Voor input heb je nog wel het name attribuut dat gebruikt kan worden

Lijkt me niet heel handig, aangezien die gebruikt wordt als naam in de verwerking van het formulier. Als je het per se valide wil houden, zou ik 'title' gebruiken

Citaat van Erwin
Ik dacht dat je het gewoon met onfocus/onblur in de html deed

Das niet heel gebruiksvriendelijk, moet je bij iedere input een onfocus en onblur erbij schrijven. Ook is het veel mooier om je html-pagina javascript vrij te houden.

En als ik zo 1 blik werp op dat javascriptje van jou, dan ziet dat er wel redelijk uit. Maar zoals je zelf al zei: t is voor maar 1 input. Die van mij is in het algemeen te gebruiken.

Erwin
Moderator
avatar
# Gepost op 03-04-2010 20:43


Daar heb je natuurlijk wel volledig gelijk in.

DNA is een zeiksnor

Vorige ( 1 ) Volgende

U moet aangemeld zijn om een reactie te kunnen plaatsen.

Indien u nog geen account heeft kunt u zich hier registreren.



© copyright 2009/2010 WebProjects 1.02 - Template van Sebastaan Franken