Política de Chromium sobre los diálogos de JavaScript

Historial de diálogos de JavaScript

JavaScript se introdujo en 1995 y, en su primera versión, eran métodos en el objeto de ventana denominados alert(), confirm() y prompt().

Si bien se ajustan al JavaScript de la época, su API síncrona es un problema para los navegadores modernos. Debido a que el motor de JavaScript debe pausarse hasta que se obtenga una respuesta del usuario, los diálogos de JavaScript son modales en la app. Además, debido a que los diálogos son modales en una app, por lo general (y, lamentablemente) se usan para dañar a nuestros usuarios.

Por este motivo, el equipo de Chromium recomienda que no uses diálogos de JavaScript.

Alternativas

Hay muchas opciones para el reemplazo de diálogo.

Hay varias opciones para alert()/confirm()/prompt(). Para notificar al usuario sobre eventos (p.ej., sitios de calendario), se debe usar la API de Notifications. Para obtener entradas del usuario, se debe usar el elemento HTML <dialog>. Para las pruebas de concepto de XSS, se puede usar console.log(document.origin) de devtool.

En cuanto a onbeforeunload, se debe tener en cuenta que ya no es confiable. Como señala Ilya Grigorik: "No puedes confiar en los eventos pagehide, beforeunload y unload para que se activen en plataformas móviles". Si necesitas guardar el estado, debes usar la API de visibilidad de páginas.

Cambios

La capacidad de una página para especificar la cadena onbeforeunload se quitó en Chrome 51. (También lo quitó Safari a partir de Safari 9.1 y Firefox 4).

Los diálogos de alert()/confirm()/prompt() cambiaron de modal de apps a se descartaron cuando se cambia la pestaña. Este cambio se realizó en todos los canales a principios de mayo de 2017.

Los diálogos de beforeunload requieren un gesto del usuario en la página para que se muestren a partir de Chrome 60. (esto no cambia el envío del evento beforeunload). Esto alinea Chromium con Firefox, que realizó este cambio con Firefox 44.

Si se muestra un diálogo alert()/confirm()/prompt() en pantalla completa, se perderá la pantalla completa a partir de Chrome 61.

Los diálogos de prompt() no activan su pestaña. Si se llama a prompt() desde una pestaña en segundo plano, la llamada se muestra inmediatamente y no se muestra ningún diálogo. Este cambio se implementó en todos los canales a principios de mayo de 2017.

Los diálogos de alert() no activan su pestaña. Si se llama a alert() desde una pestaña en segundo plano, la llamada se muestra de inmediato. La pestaña está marcada con un indicador y el usuario verá el diálogo cuando cambie a la pestaña. Este cambio en el comportamiento se observa a partir de Chrome 64.

Los diálogos de confirm() no activan su pestaña. Si se llama a confirm() desde una pestaña en segundo plano, la llamada se muestra inmediatamente y no se muestra ningún diálogo. Este cambio en el comportamiento se observa a partir de Chrome 69.

Debido a estos cambios, si tu sitio usa diálogos, te recomendamos que uses las alternativas mencionadas anteriormente para que esto no te afecte.