2010-10-24 6 views
2

Я хочу, чтобы показать сообщение, когда вы уезжаете страницу (не раздражает предупреждения, только некоторые HTML, говоря вам ждать), думая об этом, я столкнулся с определенными трудностями:javascript location.href onchange прослушиватель событий?

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

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

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

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

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

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

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

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

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

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

Edit # 2:

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

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

ответ

1

Это решение, которое работает во всех браузерах.Он использует атрибут 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); 
    }; 
}()); 
+0

hmmm ... Мне это нравится, хотя IE никогда не отображает сообщение. Я предполагаю, что функция $ (window) .unload никогда не срабатывает в IE? – bevacqua

+0

$ (window) .unload будет срабатывать, если вы загрузили jQuery, а страница фактически выгрузится, так как на другой странице загружается эта страница. Я скопировал $ (window) .unload из вопроса, что было неправильным событием для использования. Я изменил код выше, и теперь он должен работать. – Eric

2

Что касается первого пункта:

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

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

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

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

+0

проверить мои правки! – bevacqua

Смежные вопросы