Подтвердить что ты не робот

Почему window.showModalDialog устарел? Что использовать вместо этого?

Я разрабатывал GreaseMonkey script, который использовал window.showModalDialog.

Но прежде чем закончить его, я обнаружил, что Firefox 29 предупреждает:

Использование window.showModalDialog() устарело. Использовать window.open() вместо. Для получения дополнительной информации https://developer.mozilla.org/en-US/docs/Web/API/Window.open

Но проблема в том, что window.open нуждается в привилегии UniversalBrowserWrite, чтобы открыть модальное окно с помощью window.open.

Тогда почему window.showModalDialog устарел? Есть ли API, который не требует привилегий?

Примечание. Мне не нужен модальный диалог поддельный (например, jQuery one), мне нужен мода реальный, который приостанавливает выполнение JavaScript.

4b9b3361

Ответ 1

Почему window.showModalDialog устарел?

От http://tjvantoll.com/2012/05/02/showmodaldialog-what-it-is-and-why-you-should-never-use-it/,

В общем, идея размещения встроенной реализации диалога в браузер был действительно хорошей идеей, но window.showModalDialog был плохим реализация, которая пронизана проблемами и плохой поддержкой браузера. (...)

Обратите внимание, что (...) [модальное диалоговое окно с использованием showModalDialog] - это полный HTML-код документ, а не фрагмент, который вводится. Это характеризующий функции window.showModalDialog. Его действительно всего две отдельные окна взаимодействуют друг с другом. Тот факт, что у вас есть два отдельных окна и DOM означают, что вам не нужно беспокоиться о JS & DOM, что привлекательно, если у вас много плохого JavaScript с загроможденным глобальным охватом. Но в основном это просто лишний раз добавляет сложность, усложняет реализацию браузера и способствует количество ошибок. (...)

В то время как важно, чтобы модальные диалоги не позволяли пользователю взаимодействуя с исходным окном, нет причин для пользователя не должно быть разрешено взаимодействовать с другими вкладками или собственным браузером элементы управления (назад/вперед, избранное, адресная строка и т.д.). (...) Это на самом деле большое раздражение для конечного пользователя. (...)

Опыт отладки для window.showModalDialog ужасен. (...) Вы в основном вынуждены предупреждать, как в 1999 году, для определения что происходит. (...)

В настоящее время основные мобильные браузеры не поддерживают window.showModalDialog, поэтому, если вы ищете какую-либо поддержку планшета/мобильного телефона, вам нужно держаться подальше.

Что использовать вместо этого?

В HTML5 представлен новый элемент <dialog>, который можно использовать для отображения диалогов, в том числе модальных.

Например:

<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();      };

Демо

Проблемы:

  • Поддержка браузера в настоящее время незначительна, но есть polyfill.
  • Это не pause выполнение JS.

Ответ 2

Вы можете использовать showModalDialog polyfill с помощью тега <dialog>, если вы хотите использовать это решение.

Ответ 3

В настоящее время, если вы не хотите использовать привилегии и хотите использовать модальное окно, лучший способ - использовать jQuery UI Dialog или что-то еще аналогичный.

Ответ 4

Чтобы заблокировать выполнение script, используйте while (true) { }. Тот факт, что это эквивалентно плохое поведение для showModalDialog, является частью причины, по которой они удалили showModalDialog.

Кроме того, "модальные" и "блокирующие script выполнение" - это не одно и то же. "Модальное" просто означает все, что угодно, что мешает вам взаимодействовать с этими вещами. Поэтому диалоги jQuery UI являются модальными, они просто не блокируют выполнение script.