Перехватить событие выхода из страницы - PullRequest
112 голосов
/ 10 ноября 2009

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

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

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

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

Ответы [ 4 ]

140 голосов
/ 10 ноября 2009

Аналогично ответу 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;
};
23 голосов
/ 10 ноября 2009

См. Эту статью. Функция, которую вы ищете: 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>
5 голосов
/ 08 января 2012

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

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 голосов
/ 09 января 2015

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

<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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...