Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/423.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript &引用;这";iframe中的一个错误_Javascript_Iframe_This_Onerror - Fatal编程技术网

Javascript &引用;这";iframe中的一个错误

Javascript &引用;这";iframe中的一个错误,javascript,iframe,this,onerror,Javascript,Iframe,This,Onerror,假设我有一个iframe,这个iframe包含一些JavaScript: function triggerError() { throw "error"; } window.onerror = function() { alert('error detected, initial iframe'); } 我们还可以说,在根窗口中,我有一个对iframe的引用,称为“win”。我可以通过调用win.triggerror()触发警报 但是,如果我试图从外部覆盖error函数,它将

假设我有一个iframe,这个iframe包含一些JavaScript:

function triggerError() {
    throw "error";
}

window.onerror = function() {
    alert('error detected, initial iframe');
}
我们还可以说,在根窗口中,我有一个对iframe的引用,称为“win”。我可以通过调用
win.triggerror()
触发警报

但是,如果我试图从外部覆盖error函数,它将不起作用

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/scoping问题,还是一个与浏览器相关的问题

注:不幸的是,我使用的是带有怪癖模式的IE9。

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

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

基本上,当iframe中的脚本控制自己的onerror时,在任何情况下都是完全允许的。这背后的想法是,如果您在iframe代码中提供这样一个函数,就意味着您相信它对于您的目的是安全的。但显然,您不应该能够从外部注入这样的函数

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

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