考虑包含iframe的网页。 iframe的内容可能如下所示
<script type="text/javascript">
window.foo = function () {
nonExisting();
};
window.bar = function () {
throw "An error!";
};
</script>
现在,我想执行这样的事情:
try {
iframe.contentWindow.foo();
} catch (e) { console.log('ok'); }
和
try {
iframe.contentWindow.bar();
} catch (e) { console.log('ok'); }
这就是我得到的:
WTF正在这里?当我使用try / catch块时,这怎么可能是一个未被捕获的异常?那是一个错误吗?或者规范中的任何内容都允许这种行为吗? 最重要的是:我可以让它按预期工作吗?
答案 0 :(得分:2)
那是因为你有一个拼写错误:"An error"!
。
如果我在IE9模拟的情况下在没有错误的情况下运行它,它可以工作:http://jsfiddle.net/vsSgE/3/。
答案 1 :(得分:1)
我今天遇到了这个问题。我在父窗口中定义了几个“异常类”,我将其“导入”子窗口(iframe),以便能够在父窗口中使用instanceof
处理它们。像这样:
父窗口
window.MyExceptions = {
RenderingException: function () { ... }
// ...more exception types
};
// Somewhere further down in the code, assuming 'iframe' is the child iframe
try {
iframe.contentWindow.renderAllTheThings();
} catch (ex) {
if (ex instanceof MyExceptions.RenderingException) {
// ...
}
}
儿童(iframe)窗口
window.MyExceptions = window.parent.MyExceptions; // Import exception types
window.renderAllTheThings = function () {
// ...
throw new MyExceptions.RenderingException();
};
使用此设置,我遇到了与您相同的问题 - 它在我测试的所有现代浏览器中都有效,但在IE8中因“未捕获的异常”错误而失败。
我的解决方法是在执行实际投掷的父窗口中的MyExceptions对象中添加一个简单的实用程序函数,如下所示:
window.MyExceptions = {
RenderingException: function () { ... },
// ...more exception types
Throw: function (ex) {
throw ex;
}
};
然后每当我想从子窗口中抛出异常以便在父窗口中处理时,我会MyExceptions.Throw(new MyExceptions.RenderingException());
。
不完全优雅,但我需要让它发挥作用。