История диалогов JavaScript
JavaScript был представлен в 1995 году, и в самой первой версии JavaScript были методы для объекта окна с именами alert()
, confirm()
и prompt()
.
Хотя они вписываются в JavaScript того времени, их синхронный API проблематичен для современных браузеров. Поскольку механизму JavaScript необходимо приостанавливать работу до тех пор, пока не будет получен ответ пользователя, диалоговые окна JavaScript являются модальными для приложения. А поскольку диалоги являются модальными для приложения, они обычно (и, к сожалению) используются во вред нашим пользователям .
По этой причине команда Chromium настоятельно рекомендует не использовать диалоговые окна JavaScript.
Альтернативы
Вариантов замены диалогов множество.
Существует несколько вариантов alert()/confirm()/prompt()
. Для уведомления пользователя о событиях (например, сайтах календарей) следует использовать API уведомлений . Для получения пользовательского ввода следует использовать элемент HTML <dialog>
. Для проверки концепции XSS можно использовать console.log(document.origin)
devtool.
Что касается onbeforeunload
, то следует отметить, что он уже ненадежен. Как отмечает Илья Григорик: «Вы не можете полагаться на события pagehide
, beforeunload
и unload
для запуска на мобильных платформах». Если вам нужно сохранить состояние, вам следует использовать API видимости страницы .
Изменения
Возможность для страницы указывать строку onbeforeunload
была удалена в Chrome 51 . (Он также был удален из Safari, начиная с Safari 9.1 и Firefox 4.)
Диалоговые окна alert()/confirm()/prompt()
теперь не модальные и закрываются при переключении их вкладки с . Это изменение произошло по всем каналам в начале мая 2017 года.
Диалоговые окна beforeunload
требуют жеста пользователя на странице, чтобы они могли отображаться , начиная с Chrome 60 . (Это не меняет отправку события beforeunload
.) Это выравнивает Chromium с Firefox, который внес это изменение в Firefox 44 .
Отображение диалогового окна alert()/confirm()/prompt()
в полноэкранном режиме приведет к потере полноэкранного режима , начиная с Chrome 61 .
Диалоги prompt()
не активируют свою вкладку. Если prompt()
вызывается из фоновой вкладки, вызов возвращается немедленно, и диалоговое окно не отображается. Это изменение произошло по всем каналам в начале мая 2017 года.
Диалоги alert()
не активируют свою вкладку. Если alert()
вызывается из фоновой вкладки, вызов возвращается немедленно. Вкладка отмечена индикатором, и пользователь увидит диалоговое окно при переключении на вкладку. Это изменение поведения наблюдается начиная с Chrome 64 .
Диалоги confirm()
не активируют свою вкладку. Если confirm()
вызывается из фоновой вкладки, вызов возвращается немедленно, и диалоговое окно не отображается. Это изменение поведения наблюдается начиная с Chrome 69 .
Из-за этих изменений, если на вашем сайте используются диалоги, настоятельно рекомендуется перейти к использованию ранее упомянутых альтернатив, чтобы это не повлияло на вас.