2010-08-24 7 views
1

J'ai un script jQuery ci-dessous qui efface la valeur d'une entrée sur le focus et le remet sur le flou si l'entrée reste vide. Cela fonctionne très bien, mais voici le problème:Effacement de valeur sur plusieurs entrées?

Disons que j'ai 3 champs de saisie sur la même page. Je clique sur le premier avec la valeur "Nom", defaultValue variable devient "Nom" et le champ efface. Si je clique sur, la valeur retourne à "Nom". Maintenant, si je clique sur le deuxième champ sans actualiser la page, cela disparaît très bien, mais quand je clique à l'extérieur, au lieu d'obtenir la valeur "Initials", il obtient la valeur du premier champ.

Alors, comment puis-je obtenir la variable defaultValue pour se mettre à jour chaque fois que je clique sur un champ?

var adaugaInput = $('form#adauga input:text'); 

adaugaInput.focus(function() { 
    var defaultValue = $(this).val(); 
    if($(this).attr("value") == defaultValue) $(this).attr("value", ""); 
    adaugaInput.blur(function() { 
     if($(this).attr("value") == "") $(this).attr("value", defaultValue); 
    }); 
}); 

Répondre

4

L'explication de pourquoi votre code fonctionne comme il le fait est kind- de compliqué. Pour chaque champ de saisie, vous établissez (et rétablissez, sur chaque événement "focus"!) Les gestionnaires des événements "flou" sur tous les les entrées. C'est déroutant et difficile à penser, alors je vais juste le résumer et dire «ne le faites pas comme ça». Notez que j'utilise ".val()" pour obtenir/définir l'attribut "value" des champs de saisie. En outre, le gestionnaire "flou" est mis en place en dehors de le gestionnaire "focus". Ce code utilise le mécanisme jQuery ".data()" pour conserver la valeur par défaut de l'élément. Non testé mais c'est probablement assez proche.

Avec un mécanisme comme celui-ci, il est parfois agréable de re-style l'entrée afin que (par exemple) la valeur par défaut apparaît avec une couleur de police plus claire. Pour ce faire, vous devez supprimer et ajouter une classe dans le champ de saisie, et affecter le style avec CSS. (. Les entrées devraient commencer avec la classe, ou je suppose que vous pouvez appliquer la classe sur le focus)

+0

+1 C'est probablement la bonne façon de procéder. De plus, j'ai simplement * emprunté * le code d'une page sur mon propre projet. :) – GenericTypeTea

+0

Merci, cela a fonctionné. La seule raison pour laquelle j'ai utilisé le flou interne était à cause de la variable defaultValue, que je ne pouvais pas utiliser si le flou était en dehors. – Norbert

+0

Bon, eh bien, je suis un grand fan de ".data()" :-) – Pointy

0

i utilise habituellement ce code qui fonctionne :)

http://www.eggchops.com/web-stuff/jquery/jquery-clear-focus-function/

est ici le code:

$(document).ready(function(){ 

var clearMePrevious = ”; 

// clear input on focus 
$(’.clearMeFocus’).focus(function() { 
    if($(this).val()==$(this).attr(’title’)) { 
    clearMePrevious = $(this).val(); 
    $(this).val(”); 
    } 
}); 

// if field is empty afterward, add text again 
$(’.clearMeFocus’).blur(function() { 
    if($(this).val()==”) { 
    $(this).val(clearMePrevious); 
    } 
}); 
}); 
+0

Garder juste une variable pour chaque champ est le problème qu'il a déjà. – Pointy

+0

Je suggère simplement qu'il utilise cette fonction. Il suffit d'ajouter une classe clearMeFocus sur le champ de texte et cela fonctionne, peu importe combien il est – corroded

+0

Je vois ce que vous voulez dire. Eh bien, je ne le ferais pas de cette façon, mais cela fonctionnerait probablement bien. C'est certainement mieux que l'original. – Pointy

-1

J'irais l'inverse, d'économie defaultValue d'abord, puis mise au point de liaison:

var adaugaInput = $('form#adauga input:text'); 

adaugaInput.each(function(){ 
    var defaultValue = $(this).val(); 
     $(this).focus(function() { 

     if($(this).attr("value") == defaultValue) $(this).attr("value", ""); 
    }); 
    $(this).blur(function() { 
     if($(this).attr("value") == "") $(this).attr("value", defaultValue); 
    }); 
}); 

Des clauses de non-responsabilité standard s'appliquent, le code ci-dessus n'est pas testé. (edit: fixed mulitple blur binds)

+1

Je ne pense pas que vous devriez ré-appliquer le gestionnaire "flou" sur chaque appel au gestionnaire "focus"! – Pointy

Questions connexes