Обнаружение браузеров, которые не поддерживают onunload / onbeforeunload - PullRequest
5 голосов
/ 23 сентября 2011

Похоже, что из всех браузеров только Opera не поддерживает события onunload / onbeforeunload. (Уже пятнадцать лет, Opera!) Решения для этой проблемы освещались много раз, например, здесь: обнаружение поддержки перед загрузкой

К сожалению, в Opera 11.51 ("onbeforeunload" in window) == true, но фактическое событие onbeforeunload никогда не выполняется!

Мое веб-приложение должно отправлять данные на сервер, когда пользователь покидает страницу; Я использую синхронный запрос AJAX для этого. Похоже, мне приходится прибегать к использованию кнопки «Сохранить» где-то на странице, чтобы скрыть проблемы Opera. Однако я не хочу, чтобы эта кнопка вводила пользователей в заблуждение, чьи браузеры способны автоматически сохранять данные через ajax, поэтому мне бы очень хотелось, чтобы эта кнопка отображалась только в Opera.

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

Ответы [ 4 ]

3 голосов
/ 26 сентября 2011

Я не могу воспроизвести ваш вывод о том, что 'onbeforeunload' in window равно true в Opera 11.5x. Это лучший способ сделать это и должен работать. Вы уверены, что не оставили в каком-то определении, например, Вы написали

onbeforeunload = function (){ ... }

позже в том же скрипте, что делает обнаружение функции? Если вы делаете alert(window.onbeforeunload), что вы видите? Не могли бы вы поделиться ссылкой на страницу с проблемой?

1 голос
/ 24 сентября 2011

Опера привязала дворняжку к этому.Я обнаруживаю Opera, ища window.opera, и если она существует, я отрицаю Opera, с чем она не может справиться.

Использование unload не годится, я думаю, потому что это происходит слишком поздно в игре.Иногда onbeforeunload - единственное, что поможет.Еще раз, я просто ищу оперу на объекте окна и, если он существует, отрицаю то, чего он не может сделать.:)

ППК говорит об этом здесь: http://www.quirksmode.org/js/detect.html

0 голосов
/ 09 августа 2013

См. Мой ответ на аналогичный / дублированный вопрос .По сути, он устанавливает обнаружение на самой первой странице вашего домена и сохраняет результат обнаружения для всех последующих страниц в localStorage.Включая рабочий пример кода.

0 голосов
/ 16 сентября 2012

Для тех, кто наткнулся на этот пост, это фрагмент кода, который я использую для обнаружения поддержки onbeforeunload, и если браузер не поддерживает его, я переключаюсь на onunload (обратите внимание на использование jquery, очевидно, не требуется).В моем случае я использую этот код (и немного больше), чтобы проверить, все ли активные AJAX-запросы все еще активны, и остановить навигацию пользователя.Имейте в виду, что использование onunload не идеально, поскольку браузер по-прежнему будет перемещаться в сторону от страницы, но, по крайней мере, он дает вам возможность предупредить пользователя о том, что данные могут быть потеряны, и они должны вернуться и проверить.

Вы заметите, что я использую функцию isEventSupported (), доступную в https://github.com/kangax/iseventsupported для поддержки кросс-браузерного обнаружения доступных событий.

// If the browser supports 'onbeforeunload'
if (isEventSupported('beforeunload', window)) {
  $(window).on('beforeunload', function(){
    return 'This page is still sending or receiving data from our server, if you recently submitted data on this page please wait a little longer before leaving.';
  });
} 
// The browser doesn't support 'onbeforeunload' (Such as Opera), do the next best thing 'onunload'.
else {
  $(window).on('unload', function(){
    alert('This page was still sending or receiving data from our server when you navigated away from it, we would recommend navigating back to the page and ensure your data was submitted.');
  });
}
...