2009-08-07 92 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"); });