Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/73.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
为什么注入iframe的JavaScript使用父窗口作为其全局作用域?_Javascript_Jquery_Dom - Fatal编程技术网

为什么注入iframe的JavaScript使用父窗口作为其全局作用域?

为什么注入iframe的JavaScript使用父窗口作为其全局作用域?,javascript,jquery,dom,Javascript,Jquery,Dom,通过Ajax调用,我得到了需要注入iframe的“blob”内容。我无法控制内容。。。它可能只是HTML或HTML+JavaScript 作为一个“模板”,我使用一个空的html文件作为我的iframe src。在iframe的“load”事件中,我将blob推入其主体。它主要起作用(使用jQuery): $iframe.contents().find('body').html(我的blob) 所发生的是,与此系统一起注入的JS的“窗口”对象是父窗口window.top。为什么? 我认为问题可能

通过Ajax调用,我得到了需要注入iframe的“blob”内容。我无法控制内容。。。它可能只是HTML或HTML+JavaScript

作为一个“模板”,我使用一个空的html文件作为我的iframe src。在iframe的“load”事件中,我将blob推入其主体。它主要起作用(使用jQuery):

$iframe.contents().find('body').html(我的blob)

所发生的是,与此系统一起注入的JS的“窗口”对象是父窗口
window.top
。为什么?

我认为问题可能与jQuery html()的工作方式有关,但我无法找到一种跨浏览器的方法来使用jQuery执行相同的操作

感谢您的帮助

编辑:这是最基本的情况:

<iframe id="z" src="scene.html"></iframe>

<script>

var xxx = 13;

$("#z").load(function() {

  var c = "<scri" + "pt>console.log(xxx)</scr" + "ipt>";

  $(this).contents().find('body').append(c);

})

</script>

变量xxx=13;
$(“#z”).load(函数(){
var c=“console.log(xxx)”;
$(this.contents().find('body').append(c);
})

在控制台中,我们读到“13”(我不访问scene.html中已经存在的javascript对象)。

将此添加到您的
scene.html

function myAppendFunc(html) {
    $('body').append(html);
}
然后从外面叫它:

$("#z").load(function() {
    var c = "<scri" + "pt>console.log(xxx)</scr" + "ipt>";
    this.contentWindow.myAppendFunc(c);
})
$(“#z”).load(函数(){
var c=“console.log(xxx)”;
this.contentWindow.myAppendFunc(c);
})

那应该行。

我认为其他地方出了问题,因为我做了类似的事情,没有意识到这个问题。如何将新的Javascript注入iframe?只是通过传递包含标记的“我的blob”吗?Simon,没错。还使用更简单的
$iframe.contents().find('body').append(myblob)进行了测试正在执行js,但是在“错误”的范围内。如果检查DOM,它是否正确?如果使用本机javascript:document.getElementById(“iframe”).innerHTML=myBlob,会得到相同的结果吗。你能提供一个演示吗?我加了一个例子。innerHTML不“执行”JS,所以它是无用的……这不是如预期的那样工作吗?(基于您的示例)不(这是另一个“wtf!?”,因为这种方法很聪明并且“防弹”)。我添加了一个console.log(window.xxx);在myAppendFunc中,它是“未定义的”。console.log()继续打印“13”。您使用的浏览器是什么?我在chrome上做的,效果很好。使用
this.contentWindow.document.write(html)解决而不是依赖jQuery(编辑:不,我没有)。我在Ubuntu上使用Chrome或FF…是的,它可以工作!它不起作用的原因是我重新使用了父级的jQuery,而不是在iframe中使用jQuery。美元仍在父窗口上运行。我现在想知道是否有一种方法不只是为了使用$append而加载jQuery的另一个副本。你不必担心——如果你的外部页面需要jQuery,内部页面也需要jQuery,那么浏览器足够聪明,可以在第二次jQuery请求时使用缓存版本。。。