javascript location.href слушатель события onchange? - PullRequest
2 голосов
/ 24 октября 2010

Я хочу показывать сообщение всякий раз, когда вы покидаете страницу (не надоедливое предупреждение, просто какой-то html, говорящий вам ждать), думая об этом, я сталкиваюсь с некоторыми трудностями:

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

  • всякий раз, когда нажимается какая-либо ссылка, должно появиться сообщение.

  • он не должен захватывать, когда по нажатой ссылке просто открывается другая вкладка (игнорировать цель _blank)

как говорится, запустить событие довольно просто, просто что-то вроде

$(document).unload(function()
{
    // display message
});

проблема в том, что если пользователь отменяет, сообщение не исчезнет.

возможное исправление будет:

$(window).unload(function()
{
    // display message

    setTimeout(function()
    {
        // hide message
    },5000);
});

но я хотел знать, есть ли более понятный способ, что только когда пользователь отменяет навигацию (или она перестает работать по любой другой причине), я могу скрыть сообщение.

Редактировать # 2:

Я только что заметил, что с приведенным выше кодом, в FF сообщение не отображается, пока страница не покинет страницу, и в этот момент, если пользователь нажимает Стоп, он получает около: blank. Если он нажимает Стоп до этого, то сообщение никогда не отображается. Что именно то, что я хотел.

В Internet Explorer сообщение никогда не отображается, я полагаю, это потому, что IE обрабатывает вещи по-разному. Интересно, что происходит в хроме?

Ответы [ 2 ]

2 голосов
/ 24 октября 2010

По первому пункту:

когда пользователь нажимает кнопку "Стоп" в браузере, отменяя действие навигации, я хочу, чтобы сообщение исчезло.

У меня был тот же вопрос некоторое время назад, и громкий ответ - также подкрепленный моими последующими исследованиями - заключался в том, что это невозможно. Как только вы начинаете запрос на новую страницу, невозможно надежно «вернуться» с нее программно. Тайм-аут действительно может быть единственным выходом.

Две другие точки, тем не менее, должны быть относительно простыми: пройтись по каждой ссылке (например, с помощью jQuery) и добавить событие click, которое открывает окно подтверждения и возвращает false, чтобы исходный href не был ' т открыл. Это также должно быть относительно легко сделать это только для внутренних ссылок (проверьте свойство target, если оно _blank, оставьте ссылку в покое.)

Однако может быть сложно работать со ссылками, в которых уже есть события click, а также с другими событиями, ведущими к другой странице, такой как отправка форм.

1 голос
/ 25 октября 2010

Вот решение, которое работает во всех браузерах.Он использует атрибут document.readyState , который работает во всех браузерах, кроме ранних версий FireFox (работает в версии 3.6.8).Если браузер поддерживает атрибут readyState, он проверит, загружен ли readyState (браузер переходит на другую страницу) или завершен (или что-то еще, указывающее, что страница никуда не уходит).Если браузер не поддерживает readyState, он по умолчанию будет вашим решением.

(function(){
    var hideMessage=document.readyState?function(){
        setTimeout(function(){
            if(document.readyState=='loading'){
                hideMessage();
            }else{
                //hide message
            }
        },500);
    }:function(){
        // hide message
    }
    function displayMessage(){
        // display message
    }
    window.onbeforeunload=function(){
        displayMessage();
        setTimeout(hideMessage,document.readyState?10:5000);
    };
}());
...