【问题标题】:"this" onerror in an iframeiframe 中的“this”onerror
【发布时间】:2015-06-15 02:08:21
【问题描述】:

假设我有一个 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();

这是为什么?这是 this/范围问题,还是与浏览器相关的问题?

注意:很遗憾,我正在使用带有 Quirks 模式的 IE9。

【问题讨论】:

    标签: javascript iframe this onerror


    【解决方案1】:

    1) 我认为一般问题不是特定于浏览器的,而是出于安全原因。如果 IFRAME 不在同一个域上,臭名昭著的 CORS 考虑因素就会发挥作用。这就是为什么不允许从外部更改 onerror 的原因。

    2) 如果页面确实位于不同的域中,则后一种方法虽然看起来像是 IE 特定的安全漏洞)

    基本上,当 iframe 内的脚本规则自己的 onerror 时,无论如何都是完全允许的。这背后的想法是,如果您在 iframe 代码中提供这样的功能,则意味着您相信它对于您的目的是安全的。但显然你不应该能够从外部注入这样的函数。

    3)如果你使用本地文件:://页面进行测试,在IE中相当混乱,一切皆有可能。我建议即使在开发阶段也不要使用它,最好设置一个简单的本地 NGINX 服务器。

    PS:如果你的页面在同一个域上,那么子 IFRAME 的 onerror 应该是可变的。所以在这种情况下,这是一个 IE 问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-13
      • 2013-03-13
      • 1970-01-01
      • 1970-01-01
      • 2012-11-18
      • 2015-10-30
      • 2020-09-26
      • 1970-01-01
      相关资源
      最近更新 更多