【问题标题】:window.onbeforeunload fires in IE for partial postback eventswindow.onbeforeunload 在 IE 中触发部分回发事件
【发布时间】:2013-02-13 06:03:54
【问题描述】:

如果用户在文本框中输入了某些内容,我想在刷新或按浏览器的返回按钮时警告用户。所以我使用了window.onbeforeunload函数来做到这一点。

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

此 javascript 代码在 Firefox 和 chrome 中运行良好。但在 IE 中,此函数会触发带有部分回发的按钮。 在 IE 中解决这个问题的任何解决方案? 谢谢:)

  • 这是因为 IE 中的错误而发生的

【问题讨论】:

    标签: javascript jquery internet-explorer back-button onbeforeunload


    【解决方案1】:

    window.onbeforeunload 函数无法在 IE 中正确执行。因为一些部分回发也被认为是“试图离开页面”。 如果页面上的链接具有 href="javascript:...." (ASP.Net LinkBut​​ton 是这样呈现的),则 IE 在单击链接时会错误地触发窗口卸载事件。 所以,我保留了一个dirtyflag变量并添加了

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

    现在当页面加载时,以 href^="javascript:" 开头的链接将分配该功能。当点击链接时,它使 __ingoreDirtyFlag 变量为真; 然后加了

    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;
            });
        }
    }
    

    对于正文标签的加载方法,我分配了 foo() 方法。 <body onload="foo()">

    这个 hack 在 IE 和所有浏览器上都能正常工作 :) 谢谢

    【讨论】:

    • 这个答案在技术上很有趣。太糟糕了,它很难阅读。
    • 没有看到 jquery 标签
    • 嘿,我知道这个答案已经快 3 年了,但是你认为你可以添加一个非 jquery 版本的答案吗,因为这个问题没有被标记为 jquery?
    【解决方案2】:

    `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?';
                }`
    

    【讨论】:

    • 对于大多数答案,最好添加解释以显示代码的工作原理,这有助于其他编程经验较少的人了解代码的作用。
    • 目的是在用户关闭浏览器或手动更改目标网址时注销用户。
    【解决方案3】:

    目的是在用户关闭浏览器或手动更改目标网址时注销用户

    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 ?';}}};
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-08-30
      • 2014-11-29
      • 1970-01-01
      • 1970-01-01
      • 2013-12-20
      • 2013-01-26
      • 1970-01-01
      相关资源
      最近更新 更多