2010-09-24 11 views
6

mi script funciona pero no entiendo cómo hacerlo NO ejecutar las funciones cuando está en un área de texto/entrada y esas teclas están presionadas. aka: inicia el evento cuando el usuario presiona esa tecla, a menos que el usuario esté en un área de texto/entrada.jquery: haga esto en la tecla, a menos que la persona esté en un área de texto o ingrese

$('body').keyup(function (event) { 

var direction = null; 
if (event.keyCode == 37) { 
    $('#wrapper').fadeOut(500) 
} else if (event.keyCode == 39) { 
     $('html,body').animate({scrollTop: $('body').offset().top}, {duration: 1500, easing: 'easeInOutQuart'} 
     ) 
return false;  
} 
    }) 

Respuesta

10

Sólo echa event.target:

$('body').keyup(function(event) { 
    if ($(event.target).is(':not(input, textarea)')) { 
     ... 
    } 
}); 

En en este caso, solo tendrá un controlador de eventos (adjunto al cuerpo) pero filtrará los elementos que reciban el evento

+0

¿Por qué asignar el evento a la entrada en primer lugar si nunca quiere manejarlo? – GenericTypeTea

+1

Aquí asignamos evento al cuerpo, no a la entrada. Y luego solo filtra con entrada y área de texto. Es mucho mejor que asignar evento a todos los elementos, excepto las entradas – fantactuka

+1

+1 hecho de manera eficiente – Thariama

1

Probar:

$('body *:not(textarea,input)').keyup(function (event) { 

}); 
+1

Dicha selección es incorrecta ya que agregará tantos controladores de eventos como tantos elementos tenga en la página. – fantactuka

+0

casi a la derecha (textareas no están incluidas), pero esto funcionará – Thariama

1
$('body :not(textarea,input[type=text])').keyup(function (event) { 

o

$('body').not('textarea,input[type=text]').keyup(function (event) { 
+0

Este tiene el mismo problema que la solución de Thariama – fantactuka

+0

que es lo que él pidió. –

+0

Solo imagine que la página tiene 10000 elementos (no demasiado). ¿Asignarás evento a cada elemento? No tiene sentido – fantactuka

Cuestiones relacionadas