我们说我有一个iframe,而且这个iframe包含一些JavaScript:
function triggerError() {
throw "error";
}
window.onerror = function() {
alert('error detected, initial iframe');
}
我们还要说,从根窗口我引用了这个名为" win"的iframe。我可以通过拨打win.triggerError()
来触发提醒。
但是,如果我尝试从外部覆盖错误功能,它将无法正常工作。
win.onerror = function () {
alert('error detected, set from parent window');
};
如果在外部检查,win.onerror 会出现更改,但是从iframe的窗口内部检查onerror的值会显示原始功能仍在那里。
但是,我发现这有效:
win.test = function () {
this.onerror = function () {
alert('error detected, set using test()');
};
};
win.test();
这是为什么?这是此 /作用域问题,还是与浏览器相关的问题?
注意:不幸的是,我正在使用带有Quirks模式的IE9。
答案 0 :(得分:0)
1)我认为一般问题不是浏览器特定的,而是出于安全原因。如果IFRAME不在同一个域上,臭名昭着的CORS考虑因素就会起作用。这就是为什么不允许从外部改变onerror的原因。
2)如果页面确实在不同的域上,后一种方法虽然看起来像IE特定的安全漏洞)
基本上,当iframe中的脚本规则自己的onerror时,在任何情况下都完全允许它。这背后的想法是,如果您在iframe代码中提供此类功能,则表示您认为它对您的目的是安全的。但显然你不应该从外面注入这样的功能。
3)如果您使用本地文件:: //页面进行测试,那么IE中的一切都很混乱,一切皆有可能。我建议即使在开发阶段也不要使用它,最好设置一个简单的本地NGINX服务器。
PS:如果您的网页位于同一个网域,那么儿童IFRAME的错误应该是可更改的。所以在这种情况下,这是一个IE问题。