【问题标题】:"Unknown Exception" when cancelling page unload with "location.href"使用“location.href”取消页面卸载时出现“未知异常”
【发布时间】:2009-10-02 13:54:03
【问题描述】:

我正在使用以下代码捕获 window.onbeforeunload 事件:

window.onbeforeunload = function (evt) 
{

    if(checkIsDirty())
        { 
            var message = 'If you continue your changes will not be saved.'; 
            if (typeof evt == 'undefined') 
            {   
                //IE 
                evt = window.event; 
            } 
            if (evt) 
            { 
                evt.returnValue = message; 
            }
            else
            {
                return message; 
            }
        }

} 

当我在结果确认中单击“取消”时,我收到错误“未知异常”,并且调试器会突出显示以下内容:

onclick="location.href='/<WhicheverPageYouRequested>.aspx';

如果我单击“确定”,页面将完美更改。为什么会出现此错误,我该如何解决?

【问题讨论】:

    标签: asp.net javascript onbeforeunload


    【解决方案1】:

    是的,这是一种已知的 IE 行为。当您尝试从 JavaScript 导航时(使用 location、location.href、location.replace、document.location、history,甚至是 link.click 或 form.submit 之类的迂回方法),beforeunload Cancel 将引发异常。测试用例很简单:

    window.onbeforeunload= function() { return '?'; }
    location.href= 'http://www.example.com/';
    

    这甚至可能是故意的,让脚本知道导航尝试失败,只是错误名称完全没有用。 (我得到“未指定的错误”。)

    传统的解决方案就是抓住它:

    try {
        location.href= '...';
    } catch(e) {}
    

    我一直对此持怀疑态度,因为捕获 所有 异常通常是坏消息(但 IE 不允许您只捕获此异常......没有检查确切的 stringTo,这是非常脆弱的。

    另一种方法是将onbeforeunload工作移到调用代码中,这样真正的onbeforeunload永远不会发生,也不会有异常:

    function navigate(url) {
        if (window.onbeforeunload) {
            if (confirm(window.onbeforeunload()+' Press OK to continue, or Cancel to stay on the current page.')
                window.onbeforeunload= '';
            else
                return;
        }
        location.href= url;
    }
    

    但是,如果(看起来很可能)是您正在使用的任何框架插入代码,而不是您自己编写的东西,那么这两种解决方案都可能超出您的掌握。

    onclick="location.href='/<WhicheverPageYouRequested>.aspx'";
    

    这是什么类型的控制?老实说,它本身看起来很可疑:当然,您单击以转到另一个页面的某些内容应该标记为简单链接,而不是 JavaScript-onclick 元素(这些在很多方面都会出错)。如果它是一个简单的非 JavaScript 链接,您就不必担心 IE 错误。

    顺便说一下,你的 beforeunload 函数在非 IE 浏览器上可能会失败(returnValue 是 IE 独有的)。它也似乎有点过于复杂......有什么问题:

    window.onbeforeunload= function() {
        if(checkIsDirty())
            return 'If you continue your changes will not be saved.';
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-17
      • 1970-01-01
      • 2011-04-03
      相关资源
      最近更新 更多