5

我想在瀏覽器刷新或按回按鈕時警告用戶,如果他們已經在文本框中輸入了某些東西。所以我用window.onbeforeunload函數來做到這一點。window.onbeforeunload在IE中觸發部分回發事件

window.onbeforeunload = function() { 
    if (if user hasn't entered any thing) { 
     return; 
    } 
    return 'Entered data will be lost.'; 
}; 

此JavaScript代碼在Firefox和Chrome中正常工作。但在IE中,此功能會觸發部分後貼的按鈕。 在IE中解決這個問題的任何解決方案? 謝謝:)

  • 它的發生,因爲錯誤的IE

回答

5

window.onbeforeunload功能在IE中執行不正確。因爲一些部分回發也被認爲是「試圖離開頁面」。 如果頁面上的鏈接具有href =「javascript:....」(ASP.Net LinkBut​​ton呈現爲這樣),IE將在點擊鏈接時錯誤地觸發窗口卸載事件。 所以,我保持着dirtyflag變量,當加載頁面時,用於鏈接開始HREF = ^添加

var __ignoreDirtyFlag = false; 

$(document).ready(function() { 
    if ($.browser.msie) { 
     $('[href^="javascript:"]').bind('click.ignoreDirtyFlag', function() { 
      __ignoreDirtyFlag = true; 
     }); 
    } 
}); 

現在「的javascript:」將賦予該功能。當鏈接被點擊時,它使__ingoreDirtyFlag變量爲true; 然後加入

window.onbeforeunload = function globalWindowUnload() { 
    if (!__ignoreDirtyFlag && isDataFilled == true) { 
     return "You have unsaved changes on this page. If you leave this page, those changes will be lost."; 
    } 
    __ignoreDirtyFlag = false; 
    return; 
}; 

如果你已經在你的頁面中使用的任何ASP更新面板,上述功能結合到該鏈接將被刪除。 所以我們必須在刷新更新面板時再次將功能綁定到鏈接。

所以,

function foo() { 
    Sys.WebForms.PageRequestManager.getInstance().add_endRequest(endRequestHandler); 
} 

function endRequestHandler(sender, args) { 
    // Do your stuff 
    if ($.browser.msie) { 
     $('[href^="javascript:"]').bind('click.ignoreDirtyFlag', function() { 
      __ignoreDirtyFlag = true; 
     }); 
    } 
} 

用於身體標記的onload方法,我assinged FOO()方法。 <body onload="foo()">

這個技巧是工作的罰款與IE和所有的瀏覽器:) 感謝

+0

這個答案在技術上是有趣的。太糟糕了,它很難閱讀。 – 2013-11-29 10:20:55

+1

沒有看到* jquery *標籤 – 2014-05-26 17:13:52

+0

嘿,我知道這個答案差不多3年了,但是你認爲你可以添加一個非jquery版本的答案,因爲這個問題沒有被標記爲jquery嗎? – 2016-02-04 19:29:58

0

`VAR inFormOrLink = FALSE; var url_auth =''; var __ignoreDirtyFlag = false;

document).ready(function() { 

if ($.browser.msie) { 
    $('').bind('click.ignoreDirtyFlag', function() { __ignoreDirtyFlag = true; alert("teste luiz") }); 

    window.onbeforeunload = function() { 
     if (!__ignoreDirtyFlag) { 
      return "Tem certeza que deseja encerrar a sessão TESTE LUIZ?"; 
     } 
     __ignoreDirtyFlag = false; 
     return; 
    }; 
} 
else { 
    $('*').live('click', function() { inFormOrLink = true; alert("Passou aqui 1 LUIZ"); }); 
    $('*').bind('submit', function() { inFormOrLink = true; alert("Passou aqui 2"); }); 
    window.onbeforeunload = function() { 
     if (!inFormOrLink) { 

      if (window.location.href.indexOf("DEV2") != -1) { 
       $.post("/DEV2/SSQ/AUTH/LOGOUT", null); 
       return 'Tem certeza que deseja encerrar a sessão TESTE DEV2?'; 
      }` 
+1

對於大多數答案,添加一個解釋來展示代碼如何工作是一個不錯的主意,這有助於其他編程經驗較少的人理解代碼的作用。 – 2017-01-05 13:49:27

+0

目的是在用戶關閉瀏覽器或手動更改目標網址時註銷用戶。 – 2017-01-05 18:27:53

0

目的是註銷時,他關閉瀏覽器用戶或手動更改目標URL

var url_auth = '';var __ignoreDirtyFlag = false;$(document).ready(function() {if ($.browser.msie) {$('a').live('click', function() { __ignoreDirtyFlag = true;}); $('*').bind('submit', function() { __ignoreDirtyFlag = true; });window.onbeforeunload = function() {if (!__ignoreDirtyFlag) {if (window.location.href.indexOf("DEV2") != -1) {$.post("/DEV2/SSQ/AUTH/LOGOUT", null);return 'Tem certeza que deseja encerrar a sessão ?';}}};