2011-05-10 32 views
9

Necesito vincular la tecla 'enter' en el teclado con un método de JavaScript específico, pero SOLO cuando un determinado campo de texto está en foco.Enlazar el cuadro de texto a la tecla 'enter'

<input id="post" type="text" style="width:400px;"/> 

¿Cómo haré esto?

Sé que puede hacerlo con formularios y cosas que tienen una acción de envío, pero ¿puedo vincular la tecla 'enter' a una función específica cuando este campo de arriba input está enfocado?

Respuesta

18
$("#post").focus(function() { 
    $(this).data("hasfocus", true); 
}); 

$("#post").blur(function() { 
    $(this).data("hasfocus", false); 
}); 

$(document.body).keyup(function(ev) { 
    // 13 is ENTER 
    if (ev.which === 13 && $("#post").data("hasfocus")) { 
     ... 
    } 
}); 

le recomiendo que en vez enlaza el caso ENTER keyup en su entrada $("#post") directamente en lugar de detectar el evento en la página entera.

+0

Si está utilizando una función de hacer algo más como si estuviera recordar lanzar un 'e.preventDefault();' antes de la llamada a la función para evitar que se envíe el formulario. – Pachonk

+1

¿le recomiendas que lo vincules en #post solamente y luego escribas un código para escuchar todo el documento? ni siquiera ... – user151496

12

Simplemente vincula el evento onkeyup a la entrada en cuestión. No necesita preocuparse por verificar el foco en absoluto, porque por definición esa entrada solo recibirá eventos de teclado cuando tenga foco.

Asumo jQuery es bien ya ha incluido la etiqueta en su pregunta, por lo que dentro de su documento manejador listo hacer algo como esto:

$("#IDforyourcontrol").keyup(function(ev) { 
    // 13 is ENTER 
    if (ev.which === 13 && /*whatever other conditions you care about*/) { 
     // do something 
    } 
}); 
+0

"por definición, que la entrada solo recibirá eventos de keyup cuando tiene foco" no es estrictamente cierto. Los eventos también se pueden enviar programatcialmente para que una entrada pueda recibir un evento de tecla cuando no esté enfocado (y para muchos eventos en otros elementos también se deben tener en cuenta las fases de borboteo y captura). Sin embargo, agregar un oyente keyup a la entrada debería ser suficiente para los requisitos del OP. – RobG

+0

Bien, claro, no pensé en los eventos desencadenados programáticamente, aunque parece poco probable que alguien quiera desencadenar una clave para la tecla enter programáticamente y distinguir eso de las acciones del usuario. Aún así, creo que mi punto principal es válido, que para este propósito, normalmente no tendrías que preocuparte por comprobar dónde está el foco. La respuesta de Raynos explica cómo permitir el enfoque también, así que supongo que responde al OP más completamente, aunque no vincularía el evento al document.body (pero, por mi parte, nunca he necesitado verificar el enfoque para ese tipo de cosas). – nnnnnn

+0

buena respuesta, implícita, rendimiento. Lo uso en la entrada misma '' y luego 'myFunction (e) {if (e.which === 13 ....}' –

Cuestiones relacionadas