2009-02-11 49 views
21

我有一個基於AJAX的網格控件。可以防止window.onbeforeunload在進行AJAX調用時被調用

我們掛鉤到window.onbeforeunload事件中,檢查它們是否有未保存的數據,如果是這樣,就會顯示一條消息「您確定要導航...您有未保存的數據...」。

這一切都很好。

但是AJAX調用也會觸發window.onbeforeunload,所以如果網格有未保存的數據,並且我們進行AJAX調用(例如刪除另一個網格中的一行),用戶會得到「您確定要導航...你有未保存的數據......「消息不好。

是否可以抑制AJAX調用的onbeforeunload事件?或者是否有可能檢測到呼叫的AJAX呼叫?否則,我們將不得不進行黑客攻擊!

感謝

回答

2

這是很奇怪的,你確定你的Ajax調用不加載一個新的鏈接?

務必閱讀本有關規範:onbeforeunload spec

看看Ajax調用可能觸發任何在上市要調用表的行動。

+0

感謝。閱讀規範,它引用「調用」下的「document.write」。這當然與我們使用的網格庫有關。 – Paul 2009-02-11 20:21:05

0

如果你正在談論ASP.NET AJAX部分回發,那麼我今天也遇到了這種行爲,做同樣的事情。 (如果你沒有,完全無視我的職務。)

在到目前爲止我的經驗,這似乎是,如果你的部分回發是由輸入觸發,它不會在局部回傳時觸發onb​​eforeunload ,但是如果部分回發是由超鏈接觸發的,它會。看起來瀏覽器假設你正在導航,如果你點擊錨標籤中的任何東西(只在IE和FireFox中測試,但是是)。

頁面是否有一個隱藏的字段已經是我用來確定客戶端,當它適合顯示導航離開警告,所以我能夠解決這個很簡單,通過添加一個檢查隱藏字段的值給我的onbeforeunload的if條件,並掛接到PageRequestManager的BeginRequest和EndRequest處理程序來設置值。這有效地禁用部分回發期間的警告。如果你想檢查更多具體的東西,你可以在這裏添加更復雜的邏輯。

這是一個真正過分簡化的代碼示例。 (對不起,如果我回吐和審查到它不工作,但它應該給你一個想法點)

window.onbeforeunload = checkNavigateAway; 

Sys.WebForms.PageRequestManager.getInstance().add_beginRequest(onBeginRequest); 
Sys.WebForms.PageRequestManager.getInstance().add_endRequest(onEndRequest); 

function onBeginRequest(sender, args) { 
    var navigateAwayFlag = $("input[id*='navigateAwayValue']"); 
    if (navigateAwayFlag.length > 0) { 
     navigateAwayFlag[0].value = "false"; 
    } 
} 

function onEndRequest(sender, args) { 
    var navigateAwayFlag = $("input[id*='navigateAwayValue']"); 
    if (navigateAwayFlag.length > 0) { 
     navigateAwayFlag[0].value = "true"; 
    } 
} 

function checkNavigateAway() { 
    var navigateAwayFlag = $("input[id*='navigateAwayValue']"); 
    if (navigateAwayFlag.length > 0 && navigateAwayFlag[0].value == "true") 
    { 
     return "Warning Text"; 
    } 
} 

編輯:壞消息。以上似乎不適用於IE6。它似乎是以不同於Firefox的順序觸發事件,因此onbeforeunload在AJAX beginRequest之前觸發...可能必須找到一種方法,在onbeforeunload觸發之前通過超鏈接單擊更改標誌值。

5

我做了這樣的事情:

body標籤內:

var allowConfirm = true; 

    window.onbeforeunload = confirmExit; 
    function confirmExit() 
    { 
    if(allowConfirm) 
     return "Are you sure you want to navigate away from this page?"; 
    else 
     allowConfirm = true; 
    } 

當我註銷,我把這個腳本:

allowConfirm = FALSE; return window.location.href;

+0

這對我有用。我的「保存」和「取消」鏈接調用ashx處理程序並強制卸載,並且我不希望保存或取消頁面時出現彈出窗口。 – Ray 2015-05-01 20:36:03

30

如果你想通過超鏈接來觸發回傳,有一個簡單的解決方法: 而不是

<a href="javascript:submitFunction();">Submit</a>

<a href="javascript:;" onclick="submitFunction();">Submit</a>

只需使用此代碼:

<a href="#" onclick="submitFunction();">Submit</a>

如果超鏈接的href屬性的內容不是當前頁面(該字符表示尖銳字符),IE似乎會觸發onb​​eforeunload事件。

+0

這阻止了onbeforeunload事件被解僱。 – dhinesh 2011-08-01 11:29:06

0

這其實工作原理:

OnClientClick="eval(this.href);return false" 
2

在IE6的情況下,或HREF你可以連接回傳功能。 即:如果回傳功能WebForm_DoPostBackWithOptions和使用jQuery,上述

var DoPostBackWithOptionsHook = null; 

$(document).ready(function(){ 
    DoPostBackWithOptionsHook = WebForm_DoPostBackWithOptions; 
    WebForm_DoPostBackWithOptions = WebForm_DoPostBackWithOptionsHook; 
} 

function WebForm_DoPostBackWithOptionsHook(options) { 
    var navigateAwayFlag = $("input[id*='navigateAwayValue']"); 
     if (navigateAwayFlag.length > 0) { 
      navigateAwayFlag[0].value = "false"; } 

    return DoPostBackWithOptionsHook(options) 
} 
0

一種解決方法下面的代碼添加以下代碼到這個問題是使用jQuery的超級鏈接標籤的單擊事件調用submitFunction(),取下HREF來自超鏈接的屬性。

0

這是不可能的,沒有辦法找出是否按下瀏覽器的刷新按鈕。

0

不使用AJAX,但仍想阻止頁面未保存更改。我嘗試了以前的大部分建議,包括navigateAway。他們都沒有與IE 8的工作。NavigateAway總是返回長度爲0.

我確實找到了一個關於在標籤中使用類作爲ID的解決方案的博客,然後根據它設置布爾值。我嘗試過,但它不起作用,因爲.NET在輸出HTML時將輸入標記封裝在span標記中,並在其中聲明類。我的最終解決方案是在標籤的ID名稱中放置單詞Ignore。此外,爲防止在設置布爾值的代碼捕獲click之前調用onbeforeunload,必須使用如click:Button或asp:Input。最後,(VS IDE的asp力量)起始名稱是控制類型; ID = 「Button_Save」。使用asp:標籤還可以防止兩次調用onbeforeunload。

<script type="text/javascript" language="javascript"> 
var stuffchanged = false 
var ignorenavigate = false 

    $(document).ready(function() { 


    //Detect whether the event source has "nonavigate" class specified 
    $("a,input,img,checkbox,button").click(function() { 
     var str = $(this).attr("ID"); 
     ignorenavigate = str.search("Ignore") > 0; 
    }); 

}); 

window.onbeforeunload = confirmExit; 
function confirmExit() { 
    if (stuffchanged && !ignorenavigate) { 
     return "You have attempted to leave this page with unsaved changes. 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?"; 
    } 

} 

    function textchanged() { 
    stuffchanged = true; 
    } 

相關問題