【发布时间】:2012-01-03 07:45:08
【问题描述】:
似乎 Firefox 将 window.onerror 事件处理程序中发生的任何错误视为致命异常,即使该异常被捕获。以下代码示例在 IE、Chrome 和 Safari 中按预期工作。在 Firefox 中,对不存在的 abc() 方法的调用会立即停止执行,而不是执行 catch 块和 onerror 处理程序的其余部分。
这是 Firefox 中的预期行为还是我做错了什么?
<!DOCTYPE html>
<html lang="en-US">
<head>
<meta charset="UTF-8">
<title></title>
<script type="text/javascript" src="http://ajax.aspnetcdn.com/ajax/jquery/jquery-1.7.js"></script>
<script type="text/javascript">
$(document).ready(function() {
window.onerror = function() {
console.log('begin onerror');
try {
abc(); // create a runtime error by calling a method that doesn't exist
} catch(e) {
console.log('catch block');
}
console.log('end onerror');
};
$('#btn').click(function() {
xyz(); // create a runtime error by calling a method that doesn't exist
});
});
</script>
</head>
<body>
<form action="" name="frmEdit">
<input type="button" value="Test" id="btn" name="btn" />
</form>
</body>
</html>
【问题讨论】:
-
这听起来像是一个围绕逻辑的错误,它可能存在以防止 onError 处理程序中的无限递归循环。通常,try...catch 优先于 onError 处理程序,但 在 onError 处理程序中,它看起来好像没有保持这种优先级。
-
这也是我的怀疑。我可能最终会提交一份错误报告。我想我会先在这里得到更直接的回应。
-
如果您在 onError 函数中设置断点,您将看到执行开始于 onError 而不是 xyz 调用。任何时候调用堆栈从 onError 开始,您都可能会看到此问题。改变执行堆栈的唯一方法,例如使用 setTimeout(abc, 0)...但这很难看。
-
基于 Nickolay 更新的测试用例,我也向 jQuery 团队提交了错误报告。 bugs.jquery.com/ticket/10904
标签: javascript firefox dom