Я пишу JavaScript для плагина, который будет использоваться на сайтах клиентов, и мне нужно использовать обработчик beforeunload
для хранения некоторой информации в файлах cookie пользователя или локальном хранилище для целей отслеживания.
Однако, поскольку я не контролирую сайты клиентов, меня беспокоит сценарий, когда страница клиента уже определила обработчик перед выгрузкой до того, как мы настроим наш. В частности, меня беспокоит случай, когда клиентский JavaScript создает обработчик «перед выгрузкой», который возвращает строку для создания всплывающего окна в стиле 'Are you sure you want to leave this page?'
, и возможность того, что добавление нашего обработчика после этого может разрушить или иным образом помешать этой функциональности.
Основываясь на небольшом эксперименте с консолью в Chromium, похоже, что если я добавляю обработчики с помощью jQuery(window).on('beforeunload', handler)
, то все обработчики выполняются в том порядке, в котором они были добавлены, а затем наличие и содержание любого диалогового окна подтверждения определяется исключительно окончательным неundefined
возвращаемым значением. Таким образом, если последний добавленный обработчик с явным возвратом возвращает null
, сообщение не отображается, а если он возвращает строку, то отображается диалоговое окно подтверждения с этой строкой в качестве ее содержимого. Это то поведение, которое я хочу; это означает, что пока я возвращаю undefined
из обработчика beforeunload
, который я добавляю, я не должен ломать код наших клиентов.
Могу ли я полагаться на это поведение во всех браузерах? А что, если клиент добавил свой исходный обработчик beforeunload
с помощью механизма, отличного от jQuery, например, явно присвоив window.onbeforeunload
или используя window.addEventListener
? Как jQuery обрабатывает назначение нескольких обработчиков за кулисами?
return oldBeforeUnload()
, а не толькоoldBeforeUnload()
, иначе вы нарушите существующую функциональность. Во-вторых, я не знаю, нужен ли такой подход или добавление обработчиков с помощью jQuery уже ведет себя как-то так - отсюда и вопрос. Я также не знаю, если клиент использует jQuery, ваш подход нарушит их способность удалять обработчик с помощью метода jQuery.off
- я подозреваю, что да. - person Mark Amery   schedule 11.04.2013onbeforeunload
, и клиенты, которые используют вашу библиотеку, должны позаботиться об этом, если у него есть собственные события для добавления. Я обещаю вам, что вы не можете представить себе все способы, которыми клиент будет злоупотреблять вашей библиотекой или DOM :) - person TheBrain   schedule 11.04.2013