2009-12-01 3 views
1
$(textBox).focus(function() { 
    $(spans).css({"background-position": "0 100%"}); 
}); 
$(textBox).blur(function() { 
    $(spans).css({"background-position": "0 0"}); 
}); 

déjà court mais il est soit je suis trop parano, ou nous pourrions coder ce court parOptimize code jquery

$(textBox).bind('focus blur', function() { *do toggle here* }); 

ou autre chose.

Toute aide serait grandement appréciée. =)

+1

paranoïaque en effet. haha je plaisante. –

+1

La lecture des esprits n'est pas encore supportée par jQuery, bien que vous puissiez le voir dans un proche avenir. ;) –

Répondre

5

Essayez ceci:

$(textBox).focus(function(){...}).blur(function() {...}); 

Et oui, vous pouvez également utiliser la fonction bind() que vous avez spécifié.

Je trouve ma version plus lisible.

Bonne chance!

+0

chaînage ... mais ne pouvons-nous pas faire quelque chose comme $ (textBox) .bind ('focus blur', function() {* do basculer ici *}); – Jronny

+1

Je pense que ce n'est pas encore 'optimisé' assez pour notre cher ami: P –

+0

=) ... C'est juste qu'il y a un toggleClass, donc y at-il un * toggleCss * ou autre? – Jronny

2

Je pense qu'il y a une limite entre l'optimisation et la clarté du code. Sans autre preuve, je ne crois pas que vous verrez des améliorations majeures en ce qui concerne les optimisations. Garder ces deux éléments séparés permet un balayage très rapide et facile ... Pas de logique à franchir. C'est juste "Quand cela arrive, alors faites-le". Simple et vous perdez probablement, voire rien, très peu.

Edit: Si comme vous l'avez mentionné dans un commentaire que vous voulez activer la classe, vous pourriez

$(textBox).bind('focus blur', function() { 
var currentClass = $(this).attr('class'); 
var newClass = currentClass == 'gotFocus' ? 'noFocus' : 'gotFocus'; 
$(this).removeClass(currentClass).addClass(newClass); }); 
+0

Merci beaucoup pour l'aide ... Mais j'ai besoin d'utiliser des css simples à la place des classes. =) Devinez je vais m'en tenir à mon code + chaînage ... – Jronny

+0

vous pouvez: var currentCss = $ (this) .css ('background-position'); var newCss = currentCss == "0 100%"? "0 0": "0 100%"; $ (ceci).css ('backgroun-position', nouveauCss); –

+0

@ La solution de jerjer est plus propre que la mienne :-) –

2

Si vous souhaitez utiliser la même fonction pour les deux événements, vous devez utiliser un moyen de changer l'effet qui peut être utilisé pour le faire tourner dans les deux sens. Quelque chose comme:

$(textBox).bind('focus blur', function() { $(spans).toggleClass('over'); }); 

S'il y a beaucoup d'éléments que vous souhaitez modifier l'effet, vous devriez envisager d'utiliser l'effet de cascade de CSS au lieu de laisser jQuery changer la classe pour tous les éléments, à savoir changer la classe pour un seul élément parent, et ont un style qui cible tous les éléments de l'enfant que vous souhaitez affecter:

#container span { background-position: 0 0; } 
#container.over span { background-position: 0 100%; } 

Modification de la classe du parent va changer le style de tous les enfants touchés:

$(textBox).bind('focus blur', function() { $('#container').toggleClass('over'); }); 
1
$("#test").bind("focus blur", function (e) { 
    $(spans).css({"background-position": e.type === "focus" ? "0 100%" : "0 0"}); 
}); 
3

Vous pouvez essayer cela aussi:

$(textBox).bind('focus blur', function(e) { 
    var bg = (e.type=='blur') ? '0 0' : '0 100%'; 
    $(spans).css({"background-position": bg}); 

}); 
+0

salamat kababayan! – Jronny