window.onbeforeunload在IE中触发部分回发事件

时间:2013-02-13 06:03:55

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

如果他们在文本框中输入了某些内容,我想在浏览器的刷新或按下按钮时警告用户。所以我使用了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中的Bug而发生这种情况

3 个答案:

答案 0 :(得分:5)

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变量为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;
        });
    }
}

对于body标签onload方法,我给出了foo()方法。 <body onload="foo()">

这个hack在IE和所有浏览器上运行良好:) 感谢

答案 1 :(得分:0)

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

public static async Task<Try<T>> FirstOrBad<T>(this IEnumerable<Task<Try<T>>> tasks, Func<Try<T>, bool> predicate)
{
       var taskList = tasks.ToList();
       var completed = new List<Task<Try<T>>>();
       Task<Try<T>> completedTask;
       do
       {
           completedTask = await Task.WhenAny(taskList);
           completed.Add(completedTask);
           taskList.Remove(completedTask);
       } while (!predicate(await completedTask) && taskList.Any());

       return !predicate(await completedTask) ?  new Try<T>(completed.ToString(",")) : await completedTask;
 }

答案 2 :(得分:0)

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

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