Обнаружение браузеров, которые не поддерживают onunload/onbeforeunload
Похоже, что из всех браузеров только Opera не поддерживает события onunload/onbeforeunload. (Уже пятнадцать лет, Opera!) Решения для этой проблемы освещались много раз, например, здесь: обнаружение поддержки onbeforeunload
К сожалению, с Opera 11.51, ("onbeforeunload" in window) == true
, но фактическое событие onbeforeunload никогда не выполняется!
Мое веб-приложение должно отправлять данные на сервер, когда пользователь покидает страницу; Я использую синхронный запрос AJAX для этого. Похоже, мне приходится прибегать к использованию кнопки "Сохранить" где-то на странице, чтобы скрыть проблемы Opera. Однако я не хочу, чтобы эта кнопка вводила пользователей в заблуждение, чьи браузеры способны автоматически сохранять данные через ajax, поэтому мне бы очень хотелось, чтобы эта кнопка отображалась только в Opera.
Является ли мой единственный выбор браузером обнаружения? Проблема в том, что у Opera есть возможность маскироваться под другие браузеры.
4 ответа
Я не могу воспроизвести ваш вывод, что 'onbeforeunload' in window
является true
в опере 11,5х. Это лучший способ сделать это и должен работать. Вы уверены, что не оставили где-то определения, например, написали
onbeforeunload = function (){ ... }
позже в том же сценарии, что делает функцию обнаружения? Если вы делаете alert(window.onbeforeunload)
, что ты видишь? Не могли бы вы поделиться ссылкой на страницу с проблемой?
Опера привязала дворняжку к этому. Я обнаруживаю Opera, ища window.opera, и если она существует, я отрицаю Opera, с чем она не может справиться.
Думаю, использование unload не годится, потому что в игре это происходит слишком поздно. Иногда onbeforeunload - единственное, что поможет. Еще раз, я просто ищу оперу на объекте окна, и, если он существует, отрицаю то, чего он не может сделать.:)
ППК говорит об этом здесь: http://www.quirksmode.org/js/detect.html
Смотрите мой ответ на похожий / дублированный вопрос. По сути, он устанавливает обнаружение на самой первой странице вашего домена и сохраняет результат обнаружения для всех последующих страниц в localStorage
, Включая рабочий пример кода.
Для любого, кто наткнулся на этот пост, это фрагмент кода, который я использую для обнаружения поддержки 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.');
});
}