2010-07-12 7 views
6

J'ai deux champs d'entrée. Je veux forcer le focus sur #area, peu importe où l'utilisateur clique à moins que il est sur #input. J'ai essayé quelque chose comme ça, mais comme l'entrée fait partie du document, ça ne marche pas.Force le focus sur un élément avec une exception. (jQuery)

$("#area").focus(); 
$(document).click(function() { $("#area").focus() }; 
$("#input").click(function() { $("#input").focus() }; 

Pensées?

Répondre

10

changement à

$("#area").focus(); 
$(document).click(function() { $("#area").focus() }); 
$("#input").click(function(e) { e.stopPropagation(); $("#input").focus() }); 

Cela arrêtera l'événement de bouillonnement du document, et ne sera pris par le #input

+1

$ (document) .cliquez (function() {. $ ("zone #") mise au point()}; devrait être $ (document) .cliquez (function() {$ ("#area"). focus()}; –

1

Vous devez annuler l'événement bouillonnant en cliquant sur la normale entrées, soit en renvoyant false dans votre gestionnaire d'événements, soit en appelant le e.stopPropagation(). Je ne suis pas sûr si l'ordre dans lequel vous affectez des gestionnaires d'événements est important, mais vous pouvez essayer de placer l'événement #input en premier.

1

La solution stopPropogation est plus simple que ce que je vais suggérer, mais cela vaut probablement la peine de discuter de cette autre option. Dans cette première fonction que vous avez, vous pouvez essayer de prendre le premier argument de la fonction, qui est un objet événement normalisé jQuery:

$(document).click(function(event) { ... 

et de le tester pour voir si la propriété target de l'événement est votre entrée :

$(document).click(function(event) { 
    if(! (event.target == $("#input").get(0))) 
     $("#area").focus(); 
} 
+1

+1, l'avantage supplémentaire de ceci est que vous n'avez besoin que d'une seule fonction pour gérer les deux cas .. L'inconvénient supplémentaire est que pour IE, vous devez tester sur 'event.srcElement' qui ajoute de la complexité. –

+1

Attention,' event' est un mot-clé réservé dans IE, et il y aura une erreur quand vous l'utiliserez comme variable. En outre, la vérification que vous avez fournie peut être écrite plus simplement (et plus courte) que si ($ (event.target) .is ('# entrée')) ' –

Questions connexes