No se puede cerrar un cuadro de diálogo de alert() en un evento de cambio con jQuery (hago clic en "Aceptar" pero no sucede nada *) en la última versión de Firefox. En Internet Explorer, la alerta aparece una vez y se puede cerrar.
Parece que al hacer clic en la alerta (re)activa un evento de cambio en el campo de entrada de Firefox, pero no estoy seguro, ya que el mensaje de registro de la consola no aparece.
$('input#i').on('keyup change', function(e) { e.preventDefault(); console.log('alert ...'); alert(1); // can't be closed on Firefox return false; });Violín de JavaScript completo: https://jsfiddle.net/powtac/w1md0bdd/
Probado en Firefox 52.0.1 (64 bits) en Win 7 e IE 11 en Win 7.
* = Al menos no puedo decir si pasa algo. La ventana emergente permanece en la misma posición. se puede hacer clic en el botón, su estilo cambia. Probé para descartar la alerta con el teclado (Enter) y el mouse haciendo clic en "Ok". Ambos casos no eliminaron la ventana de alerta.
Actualizar:
Al.G. en esta respuesta https://stackoverflow.com/a/43052301/22470 encontré una solución y explicación. En resumen: keydown en lugar keyup . Dado que esto todavía no explica el comportamiento al usar el mouse, solo hice algunas pruebas adicionales y noté que las alertas se ven diferentes:
En mi mal caso de uso donde la ventana emergente no se puede eliminar, parece:
Al usar la corrección de Al.G, o eliminar uno de los eventos que el código está escuchando, se ve así:
Esto podría ser un indicio de que la alerta aún no está completamente dibujada y ya muestra otra ventana emergente o algo está bloqueando la representación.
Poniendo mi comentario como respuesta:
En realidad, el botón Ok no está deshabilitado. Puede hacer clic en él y el aviso se cierra, pero:
Cierra la alerta, por lo que el enfoque clave vuelve al elemento anterior que lo contenía, es decir, el elemento de entrada.
Justo después de eso, sueltas la tecla.
Dado que el elemento de entrada tiene el foco, desencadena un evento keyup en él.
Esa misma función de evento keyup que adjuntó se vuelve a ejecutar. Ir al paso 1 :)
Una forma de resolver esto es usar un evento que no se activará después de soltar una tecla. Lo que necesitas aquí es keydown .
En cuanto a por qué el console.log no se imprime dos veces :
probablemente lo sea, solo que el navegador no agrega una nueva línea en la consola, sino que muestra un pequeño número junto a su mensaje con la cantidad de veces que se envió el mensaje.
Para rastrear qué tipos de eventos se activaron : console.log('alert ...' + e.type + Math.random());
Agregué un número aleatorio para que su navegador no aplaste sus mensajes en uno.
Por qué las letras no aparecen en el cuadro de entrada cuando se usa keydown : porque preventDefault() y return false; en el evento Cualquier desencadenante de evento adicional se ignora.
Parece ser algún tipo de error de Firefox...
Supongo que puedes solucionar el problema con este código...
var popupOpen = false; $('input#i').on('keyup change', function(ev) { ev.preventDefault(); if (popupOpen == false) { popupOpen = true; console.log('alert ...'); alert(1); // can't be closed on Firefox popupOpen = false; } return false; });Entonces, en FF44.0.2, funciona como se indica. Sin embargo, es posible que obtenga algunos resultados inesperados porque está disparando dos veces. El teclado se apaga y aparece la alerta. La alerta que se muestra elimina el foco de la entrada, lo que luego activa el evento de cambio en ese mismo elemento, volviendo a mostrar la alerta. Solo lo obtengo dos veces por cada tecla, no un bucle infinito.