Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/389.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 - Fatal编程技术网

Javascript 如何从iframe内部将脚本元素复制到父元素?

Javascript 如何从iframe内部将脚本元素复制到父元素?,javascript,iframe,Javascript,Iframe,我有一个iframe,需要将脚本复制到父级并在父级中执行函数: <!doctype html> <html lang="en"> <head> </head> <body> <script id="myscript"> function foo() { alert('foo'); } </script> <script> (function () { var scrip

我有一个iframe,需要将脚本复制到父级并在父级中执行函数:

<!doctype html>
<html lang="en">
<head>
</head>

<body>
  <script id="myscript">
  function foo() { alert('foo'); }
  </script>

  <script>
  (function () {
    var script = document.getElementById('myscript');
    parent.document.head.appendChild(script);

    // call function in parent 
    parent.foo();
  })();
  </script>
</body>
</html>

函数foo(){alert('foo');}
(功能(){
var script=document.getElementById('myscript');
parent.document.head.appendChild(脚本);
//父函数中的调用函数
parent.foo();
})();

我得到未定义的不是一个函数。为什么该函数没有在父级中定义?

请记住,您将受到跨源安全和其他帧间限制的约束,如果您从同一域托管两个帧,这不应该是一个问题,但如果不是这样,将非常有效地阻止这一点

从子框架中获取元素并将其附加到父框架可能不起作用,而且肯定过于复杂。我建议在父级上创建一个新的脚本元素,并简单地复制内容。比如:

(function () {
    var pdoc = parent.document;
    var dest = pdoc.head;
    var text = document.getElementById("myscript").textContent;

    var pscr = pdoc.createElement("script");
    pscr.textContent = text;
    dest.appendChild(pscr);

    parent.foo();
})();
这很难成为一个很好的例子,因为JSFiddle和类似的东西从不同的来源提供框架,所以我还没有对它进行彻底的测试。以这种方式获取脚本内容肯定是可行的,创建元素当然应该是可行的。测试时,我最接近的方法是重命名函数并使用当前帧:

(函数(){
var pdoc=self.document;
var dest=pdoc水头;
var text=document.getElementById(“myscript”).textContent.replace(“foo”、“bar”);
var pscr=pdoc.createElement(“脚本”);
pscr.textContent=文本;
目的地附属物(pscr);
self.bar();
})();

您尝试做的不是xss吗?如果您拥有这两个页面,也许您可以将服务器用作中间人,并在这两个页面上使用ajax来传递脚本。不幸的是,ajax不是您获得最优秀答案的选项。知道为什么复制script元素不起作用吗?我不知道它是否起作用,但是元素以多种方式绑定到DOM中。没有合理的方法来复制所有可能的绑定和依赖项,但是您真正需要的(尤其是在本例中)是节点的内容,因此创建一个新的节点可能是一个更好的主意。