2012-05-02 57 views
4

這似乎是一個常見問題,但搜索沒有返回任何內容。如何判斷ASP中的頁面卸載是否回傳

我有下面的代碼,在頁面卸載之前執行。問題是如果卸載是回發我不想向用戶發出我的警告,但我無法弄清楚如何區分回發和例如,用戶導航到另一個頁面。

// This is executed before the page actually unloads 
     $(window).bind("beforeunload", function() { 

      if (prompt) { 

       //prompt 
       return true; 
      } 
      else { 

       //reset our prompt variable 
       prompt = true; 
      } 
     }) 

在後面的代碼中運行腳本,即如果Page.IsPostBack然後設置提示不是一個選項。

任何想法?

編輯:

這裏是我結束了與解決方案:

function DoNotPrompt() { 
       prompt = false; 
     } 

我加入這個到用戶能做到這一點導致回發東西的所有控制。

OnClientClick="DoNotPrompt() 

然後檢查此標誌,並且只在用戶真正離開頁面時才返回「beforeunload」中的字符串,即不是回發。我不得不使用此代碼: var magicInput = document.getElementById('__ EVENTTARGET');

if (magicInput && magicInput.value) { 
     // the page is being posted back by an ASP control 
     prompt = false; 
    } 

原因是我有一個自定義用戶控件是一個列表框,我無法添加上述方法。所以用它來捕獲該事件並將該標誌設置爲false。

不是最優雅的解決方案。

感謝, 邁克爾

回答

1

這可能不是涵蓋所有的回發的情況下,但你可以告訴我們,如果頁回用ASP控制通過詢問__EVENTTARGET隱藏輸入。

此輸入由ASP通過ASP控件回發頁面時設置。

var magicInput = document.getElementById('__EVENTTARGET'); 

if (magicInput && magicInput.value) { 
    // the page is being posted back by an ASP control 
} 
+0

@Aristos magicInput如果在DOM中沒有找到,它將會是'null'(falsey),如果它被發現但沒有被設置,它的值將是一個空字符串(falsey)。該語句檢查隱藏的輸入是否存在並且具有值。 – jbabey

+0

好的,我認爲它是一個想法 - 我只是沒有測試它,必須確保在所有情況下,__EVENTTARGET在回發之前都會發生變化。在這裏,我看到這是在__doPostBack被調用時的改變。 – Aristos

+0

我試過這個,但是正如你所說的那樣,由於某種原因它並沒有捕獲所有的回傳。比如用戶在我們的網格中編輯行時。 –

1

的JavaScript運行在客戶端;就客戶而言,頁面不會保持從一個視圖到另一個視圖的狀態。回傳完全是一個ASP.NET概念。

您可以通過在服務器端運行一些代碼,根據是否爲Page.IsPostBack來定義JavaScript變量來解決此問題。

例子:

<%@ Page Language="C#" AutoEventWireup="true" %> 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 

<html xmlns="http://www.w3.org/1999/xhtml"> 
<head runat="server"> 
    <title>Page.IsPostBack -> client</title> 

    <script type="text/javascript"> 
     var isPostback = <%= Page.IsPostBack %>; 
     console.log("IsPostBack: " + isPostback); 
    </script> 
</head> 
<body> 
    <form id="form1" runat="server"> 
    <div> 
     <asp:Button runat="server" ID="btnTest" Text="Click me..." /> 
    </div> 
    </form> 
</body> 
</html> 
+0

一個測試代碼,我認爲他需要知道是回發,在第一次在回帖發生之前。這是第一次發佈後的作品。 – Aristos

+0

@Aristos。對,就是這樣。我想在回發實際發生之前知道,所以運行服務器端代碼太遲,因爲beforeunload函數中的代碼已經執行。 –

+0

我的不好。在那種情況下,Aristos的答案看起來更接近該商標。 –

2

您可以捕獲提交和重置onbeforeunload爲:

jQuery(function($) { 
    var form = $('form'), oldSubmit = form[0].onsubmit; 
    form[0].onsubmit = null; 

    $('form').submit(function() {  
     // reset the onbeforeunload 
     window.onbeforeunload = null; 

     // run what actually was on 
     if(oldSubmit)   
      oldSubmit.call(this);   
    }); 
}); 

這是我的網頁:)

+0

你如何檢查頁面是重定向還是回發? –

+0

@RoyiNamir這是捕獲表單的提交。如果他點擊某個鏈接不受影響,則不發回。嘗試在此存檔的是在回發後不顯示消息。其餘的都是數。我爲我的頁面使用相同的代碼和技巧。 – Aristos

+0

我現在就試試這個。 –

相關問題