2009-11-09 6 views
102

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

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

Gmail делает это очень похоже. Например, составьте новое письмо, начните вводить текст в тело сообщения и введите новое местоположение в адресной строке (скажем, twitter.com или что-то еще). Он спросит: «Вы уверены?»

Идеи, как копировать это? Я нацелен на IE8, но хотел бы быть совместимым с FF & Chrome.

+6

http://stackoverflow.com/questions/147636/best-way-to-detect-when-user-leaves-a-web-page –

ответ

127

Подобный ответ Ghommey, но это также поддерживает старые версии IE и Firefox.

window.onbeforeunload = function (e) { 
    var message = "Your confirmation message goes here.", 
    e = e || window.event; 
    // For IE and Firefox 
    if (e) { 
    e.returnValue = message; 
    } 

    // For Safari 
    return message; 
}; 
+1

Не могли бы вы объяснить первую строку (var message = ...)? Я не знаю, что делает эта запятая и второе выражение. – mtmurdock

+7

@mtmurdock Это просто синтаксис Javascript для объявления нескольких переменных. 'вар Foo, бар;' такое же, как 'вар Foo;' ' вар бар;' –

+4

@mtmurdock, Второе выражение "_var_ е = е || window.event;" означает набор ** e **, равный параметру _e_ (если он правдивый) или window.event, если не правдивый. Это не будет правдой, если параметр _e_ равен null. –

21

См. Эту статью. Функция вы ищете является onbeforeunload

Пример кода:

<script language="JavaScript"> 
    window.onbeforeunload = confirmExit; 
    function confirmExit() 
    { 
    return "You have attempted to leave this page. If you have made any changes to the fields without clicking the Save button, your changes will be lost. Are you sure you want to exit this page?"; 
    } 
</script> 
+2

Есть ли способ, чтобы определить, что пользователь выбрал " Оставьте эту страницу ", а не" Оставайтесь на этой странице "? –

3

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

window.onbeforeunload=function(e){ 
    // only take action (iterate) if my SCHEDULED_REQUEST object contains data   
    for (var key in SCHEDULED_REQUEST){ 
    postRequest(SCHEDULED_REQUEST); // post and empty SCHEDULED_REQUEST object 
    for (var i=0;i<1000;i++){ 
     // do something unnoticable but time consuming like writing a lot to console 
     console.log('buying some time to finish saving data'); 
    }; 
    break; 
    }; 
}; // no return string --> user will leave as normal but data is send to server 

Edit: Смотрите также Synchronous_AJAX и как сделать это с jquery

+0

Мне нравится эта альтернатива всплывающему окну , Спасибо за предложение, Реми. –

+1

это не делает абсолютно никакого смысла -1.javascript не является потоковым, что вы делаете, делает postRequest, а затем приостанавливает вычисление сайта, не позволяя никому ничего не делать (включая ваш postRequest, который тем временем был отправлен до паузы вычисления). – fmsf

+0

И именно поэтому он работает: действительно, пост-запрос был отправлен до паузы вычисления, но эта небольшая блокировка страницы до того, как она фактически оставлена, гарантирует достаточное время для клиента браузера (а не javascript), чтобы действительно завершить отправку этого запроса должным образом. Я заметил, что когда я отправляю запрос (без блокировки) и оставляю страницу сразу после этого, запрос не всегда отправляется. – Remi

0

У меня есть пользователи, которые не заполняют все необходимые данные.

<cfset unloadCheck=0>//a ColdFusion precheck in my page generation to see if unload check is needed 
var erMsg=""; 
$(document).ready(function(){ 
<cfif q.myData eq ""> 
    <cfset unloadCheck=1> 
    $("#myInput").change(function(){ 
     verify(); //function elsewhere that checks all fields and populates erMsg with error messages for any fail(s) 
     if(erMsg=="") window.onbeforeunload = null; //all OK so let them pass 
     else window.onbeforeunload = confirmExit(); //borrowed from Jantimon above; 
    }); 
}); 
<cfif unloadCheck><!--- if any are outstanding, set the error message and the unload alert ---> 
    verify(); 
    window.onbeforeunload = confirmExit; 
    function confirmExit() {return "Data is incomplete for this Case:"+erMsg;} 
</cfif> 
Смежные вопросы