He tenido un problema similar anteriormente. Hasta donde yo sé, el navegador no emite eventos cuando el usuario pega con un clic derecho, ni cuando seleccionan de la lista de valores usados previamente.
Terminé resolviéndolo de una manera suficientemente buena vinculando además mi controlador de eventos al evento de desenfoque. El único caso que esto no captó fue cuando pegaron un valor con el mouse, luego presionaron la tecla Enter para enviar. Yo era capaz de moverse a través de una pequeña hackery:
$(element)
.bind('keydown blur', handlerFunction)
.keydown(function(event) {
if (event.keyCode === 13 /* Enter Key */) {
event.preventDefault();
event.stopPropagation();
}
})
.keyup(function(event) {
if (event.keyCode === 13 /* Enter Key */) {
$(this).closest('form').submit();
}
});
Esencialmente, esto funciona porque jQuery ejecutará los acontecimientos en el orden en que fueron obligados. Normalmente, la presentación del formulario tiene lugar en el teclado de una tecla Enter. Con el fin de darle tiempo al manejador de keyup para que haga su magia, debe retrasar el envío del formulario hasta que ocurra el evento de keyup, para que el otro manejador de keyup pueda ejecutarse primero.
Ahora, dijo que estaba usando un complemento que agrega un retraso antes de reaccionar ante el evento de los usuarios. Eso significa que quizás no puedas usar esta técnica textualmente. Una cosa que podría funcionar en su lugar sería llamar a la función del controlador directamente antes de permitir que el formulario se envíe. Para hacer eso, tendría que cambiar el último controlador de keyup a:
.keyup(function(event) { // Part 2
if (event.keyCode === 13 /* Enter Key */) {
handlerFunction.call(this, event); // force it to happen now
$(this).closest('form').submit();
}
});
Como Josh K mencionó antes, simplemente podría obligar a algo que el evento presentará en su forma de hacer algo similar. Sin embargo, si está haciendo Ajax allí, asegúrese de establecer async: false
en las opciones aprobadas, ya que de lo contrario el formulario continuará y se enviará sin esperar a que se complete la llamada.