2010-07-12 12 views
6

Tengo dos campos de entrada. Quiero forzar el enfoque en #area sin importar dónde haga clic en a menos que esté en #input. Intenté algo como esto, pero como la entrada es parte del documento, no funciona.Forzar el enfoque en un elemento con una excepción. (jQuery)

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

¿Pensamientos?

Respuesta

10

cambio a

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

Esto detendrá el caso de que brotará para el documento, y sólo se ha caído en la #input

+1

$ (document) .click (function() {. $ ("# área") enfocar()}; debería ser $ (document) .click (function() {$ ("#area"). focus()}); –

1

Es necesario cancelar la propagación de eventos cuando se hace clic sobre la normal entradas, ya sea devolviendo false en su controlador de eventos, o llamando al e.stopPropagation().

No estoy seguro de si el orden en el que asigna los controladores de eventos importa, pero puede tratar de poner el evento #input primero.

1

La solución stopPropogation es más simple de lo que estoy por sugerir, pero probablemente valga la pena discutir esta otra opción. En esa primera función que tenga, es posible que trate de tomar el primer argumento de la función, que es un objeto de evento jQuery normalizada:

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

y probarlo para ver si la propiedad target del evento es su opinión :

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

+1, el beneficio adicional de esto es que solo necesita una función para manejar ambos casos ... El inconveniente añadido es que para IE debes probar contra 'event.srcElement', que agrega complejidad. –

+1

Ten en cuenta que' event' es una palabra clave reservada en IE, y dará un error cuando uses esto como variable. Además, el cheque que proporcionó puede escribirse más simple (y más corto) como 'if ($ (event.target) .is ('# input'))' –

Cuestiones relacionadas