Несколько обработчиков перед выгрузкой в ​​jQuery

Я пишу 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 обрабатывает назначение нескольких обработчиков за кулисами?


person Mark Amery    schedule 11.04.2013    source источник
comment
@mplungjan Ну, во-первых, это должно быть return oldBeforeUnload(), а не только oldBeforeUnload(), иначе вы нарушите существующую функциональность. Во-вторых, я не знаю, нужен ли такой подход или добавление обработчиков с помощью jQuery уже ведет себя как-то так - отсюда и вопрос. Я также не знаю, если клиент использует jQuery, ваш подход нарушит их способность удалять обработчик с помощью метода jQuery .off - я подозреваю, что да.   -  person Mark Amery    schedule 11.04.2013
comment
Это было просто, чтобы дать идею. Возможно, вам придется сделать оба   -  person mplungjan    schedule 11.04.2013
comment
Вы должны просто задокументировать, что добавляете материал в onbeforeunload, и клиенты, которые используют вашу библиотеку, должны позаботиться об этом, если у него есть собственные события для добавления. Я обещаю вам, что вы не можете представить себе все способы, которыми клиент будет злоупотреблять вашей библиотекой или DOM :)   -  person TheBrain    schedule 11.04.2013
comment
@TheBrain Конечно, я не могу справиться со всеми случаями, но меня беспокоит то, что я могу непреднамеренно взорвать что-то даже в том случае, когда клиент добавляет обработчики перед выгрузкой стандартным разумным способом.   -  person Mark Amery    schedule 11.04.2013


Ответы (1)


что если сделать вот так

 var x = window.onbeforeunload
 window.onbeforeunload = function() { 
       // do your stuf
       if (x) return x();
 }

таким образом, вы вернете все, что должен был вернуть первоначальный обработчик событий.

person TheBrain    schedule 11.04.2013