我正在使用以下代码捕获 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';
如果我单击“确定”,页面将完全改变。为什么会出现此错误,我该如何解决?
最佳答案
是的,这是一个已知的 IE 行为。当您尝试从 JavaScript 导航时(使用 location、location.href、location.replace、document.location、history,甚至像 link.click 或 form.submit 这样的迂回方法),beforeunload
Cancel 将引发一个异常(exception)。测试用例很简单:
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.';
}
关于asp.net - 使用 "Unknown Exception"取消页面卸载时为 "location.href",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1509643/