javascript - ejemplos - window showmodaldialog firefox
¿Por qué window.showModalDialog está en desuso? ¿Qué usar en su lugar? (4)
Actualmente, si no desea usar los privilegios y desea usar la ventana modal, la mejor manera es usar el diálogo de la interfaz de usuario de jQuery o algo similar.
Estaba desarrollando un script de GreaseMonkey que usaba window.showModalDialog
.
Pero antes de terminarlo, descubrí que Firefox 29 advierte:
El uso de window.showModalDialog () está en desuso. Use window.open () en su lugar. Para obtener más ayuda, https://developer.mozilla.org/en-US/docs/Web/API/Window.open
Pero el problema es que window.open
necesita UniversalBrowserWrite
privilegio UniversalBrowserWrite
para abrir una ventana modal usando window.open
.
Entonces, ¿por qué window.showModalDialog
está en desuso? ¿Hay alguna API que no requiera privilegios?
Nota : no quiero un diálogo modal falso (como el de jQuery), necesito un modal real que detenga la ejecución de JavaScript.
Para bloquear la ejecución del script, use while (true) { }
. El hecho de que este comportamiento sea equivalente a bad showModalDialog
es parte de la razón por la que eliminaron showModalDialog
.
Además, "modal" y "ejecución de secuencia de comandos de bloqueo" no son lo mismo. "Modal" simplemente significa, además de todo lo demás, lo que le impide interactuar con esas cosas. Entonces, los cuadros de diálogo de la interfaz de usuario jQuery son modales, simplemente no bloquean la ejecución del script.
Puede usar mi polyfill showModalDialog usando la etiqueta <dialog>
si desea seguir usando esta solución.
¿Por qué window.showModalDialog está en desuso?
Desde http://tjvantoll.com/2012/05/02/showmodaldialog-what-it-is-and-why-you-should-never-use-it/ ,
En general, la idea de poner una implementación de diálogo nativo en el navegador fue una muy buena idea, pero
window.showModalDialog
fue una mala implementación que está plagada de problemas y un soporte de navegador deficiente. (...)Tenga en cuenta que (...) [un diálogo modal usando
showModalDialog
] es un documento HTML completo, no un fragmento en el que se inyecta. Esta es una característica de caracterización dewindow.showModalDialog
. En realidad, son solo dos ventanas completamente separadas que se comunican entre sí. El hecho de que tenga dos ventanas y DOM por separado significa que no tiene que preocuparse por los conflictos JS y DOM, lo cual es atractivo si tiene muchos JavaScript incorrectos con un ámbito global desordenado. Pero sobre todo esto solo agrega complejidad innecesaria, complica la implementación del navegador y contribuye a una serie de errores. (...)Si bien es importante que los diálogos modales impidan que el usuario interactúe con la ventana de origen, no hay ninguna razón para que el usuario no pueda interactuar con otras pestañas o controles nativos del navegador (atrás / adelante, favoritos, barra de direcciones, etc.). (...) Esto es realmente una gran molestia para el usuario final. (...)
La experiencia de depuración de
window.showModalDialog
es horrible. (...) Básicamente te obligan a alertar como si fuera en 1999 para determinar qué está pasando. (...)Actualmente, ningún navegador móvil principal es compatible con
window.showModalDialog
, por lo que si está buscando cualquier tipo de soporte para tableta / dispositivo móvil, debe mantenerse alejado.
¿Qué usar en su lugar?
HTML5 presenta el nuevo elemento <dialog>
, que se puede usar para mostrar diálogos, incluidos los modales.
Por ejemplo:
<dialog id="myDialog">
Foo bar
<button id="hide">Close</button>
</dialog>
<button id="show">Show Dialog</button>
var dialog = document.getElementById(''myDialog'');
document.getElementById(''show'').onclick = function() { dialog.showModal(); };
document.getElementById(''hide'').onclick = function() { dialog.close(); };
Los problemas son:
- El soporte del navegador es actualmente insignificante, pero hay un polyfill .
- No detiene la ejecución de JS.