2009-08-07 38 views
19

我有一个聊天应用程序,我希望每当用户意外或手动关闭浏览器时,他都应该得到一个警报,以便进行各种清理操作。我有更多的事情要在事件之前使用,但我希望将其用于特定的网页,因为所有其他网页也在加载前被调用。请帮助浏览器窗口意外关闭时的警报

回答

22

我们应该防止或提示用户在执行这些操作时会丢失数据。

  1. 点击后面的浏览按钮。
  2. 点击刷新浏览器按钮。
  3. 点击浏览器的关闭按钮。
  4. 点击转发浏览器按钮。
  5. 键盘卒中Alt键 + F4(关闭)
  6. 键盘卒中F5(刷新)
  7. 键盘卒中CTRL + F5 (刷新)
  8. 键盘卒中Shift + F5(刷新)
  9. 更改网址
  10. 或者任何导致回发的东西,除了您的特定提交按钮。

为了解释我已经使用了两个文本框,一个Asp.net提交带有TestButton ID的按钮。 我采取的其他回发控件是 另一个asp.net按钮,一个autopostback属性为true的复选框,一个具有autopostback属性的dropdownlist属性为true。 现在我已经使用了所有这些回发控件,以向您展示我们还需要向用户展示Promt给用户关于在用户对这些控件执行操作时丢失的数据。 关于提交按钮,我们不会显示提示,因为我们必须使用该控件操作来提交数据。以下是示例代码。我已经设置了window.onbeforeunload方法来更改控件。

<html > 
<head id="Head1"> 
    <title></title> 

    <script type="text/javascript" 
      src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script> 

    <script type="text/javascript"> 
     $(function() 
     { 
      // Prevent accidental navigation away 
      $(':input').bind(
       'change', function() { setConfirmUnload(true); }); 
      $('.noprompt-required').click(
       function() { setConfirmUnload(false); }); 

      function setConfirmUnload(on) 
      { 
       window.onbeforeunload = on ? unloadMessage : null; 
      } 
      function unloadMessage() 
      { 
       return ('You have entered new data on this page. ' + 
         'If you navigate away from this page without ' + 
         'first saving your data, the changes will be lost.'); 
      } 

      window.onerror = UnspecifiedErrorHandler; 
      function UnspecifiedErrorHandler() 
      { 
       return true; 
      } 

     }); 

    </script> 

</head> 
<body> 
    <form id="form1" name="myForm" runat="server"> 
    <div> 
     First Name :<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox><br /> 
     <br /> 
     Last Name :<asp:TextBox ID="TextBox2" runat="server"></asp:TextBox><br /> 
     <br /> 
     IsMarried :<asp:CheckBox ID="CheckBox1" runat="server" /><br /> 
     <br /> 
     <asp:Button runat="server" ID="TestButton" Text="Submit" CssClass="noprompt-required" /><br /> 
     <br /> 
     <br /> 
     <br /> 
     <br /> 
     <asp:Button runat="server" ID="AnotherPostbackButton" Text="AnotherPostbackButton" 
      /><br /> 
     <br /> 
     <asp:CheckBox runat="server" ID="CheckboxWhichCausePostback" Text="CheckboxWhichCausePostback" 
      AutoPostBack="true" /><br /> 
     <br /> 
     DropdownWhichCausePostback<asp:DropDownList runat="server" ID="DropdownWhichCausePostback" 
      AutoPostBack="true"> 
      <asp:ListItem Text="Text1"></asp:ListItem> 
      <asp:ListItem Text="Text2"></asp:ListItem> 
     </asp:DropDownList> 
     <br /> 
     <br /> 
    </div> 
    </form> 
</body> 

上面我已经使用:

$('.noprompt-required').click(function() { setConfirmUnload(false); }); 

我在这行做的是我打电话setConfirmUnload方法,并把false作为参数,该参数将设置window.onbeforeunload为null。 那么这意味着什么在任何控制你想要该用户不应该被提示,给这个控制类.noprompt-required并保持原样。

+0

我投这个票,但是......它在iOS(iPad/iPhone)中不起作用,这是一个无赖。 – Michael 2013-04-18 02:30:29

+0

真的好主意和解决方案! – Aleeeeee 2013-07-11 15:06:31

+0

即使实际提交表单,此解决方案也会触发。它是无法使用的。 – 2016-02-01 16:13:22

7

你可以尝试卸载事件

$(window).unload(function() { alert("Bye now!"); }); 

http://docs.jquery.com/Events/unload

我猜这清理是只在客户端上。了解这些“清理”的性质很有意思。

+2

试试这个 “有趣的是知道的性质” 确实如此。他们最好不要成为主人需要的东西,因为不管你可以强制卸载什么样的清理,如果浏览器从任务管理器中死亡或用户的PC崩溃,你将无法捕捉它... – jlarson 2009-08-07 13:06:32

+0

我也是这意味着服务器上可能还需要进行一些清理。在任务管理器发生浏览器中断时可能会处理的东西。 – 2009-08-07 13:39:55

+0

这会提醒用户,但他们无法返回页面。我认为他的问题中的“意外”一词意味着SO使用的一种警报。 – 2009-08-07 18:13:02

21

这是不是一个真正的JQuery的东西,我用这个功能:

function setConfirmUnload(on) { 
    window.onbeforeunload = (on) ? unloadMessage : null; 
} 

function unloadMessage() { 
    return "Are you sure you want to leave this page"; 
} 

然后,在任何时候都可以调用

setConfirmUnload(真),以使确认或假,如果你想允许他们在没有警告的情况下关闭屏幕(例如,如果您有关闭按钮)。

-1

您可以使用Ajax

$(window).unload(function() { alert("AJAX function to do required job"); });