[英]How to copy a script element to the parent from inside an iframe?
我有一个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>
我得到未定义不是函数。 为什么在父级中未定义该功能?
请记住,您将受到跨域安全性和其他帧间限制的约束,如果您托管来自同一域的两个帧,这应该不是问题,但否则会非常有效地阻止这一点。
从子框架中获取元素并将其附加到父框架可能无法正常工作,并且肯定过于复杂。 我建议在父对象上创建一个新的脚本元素,然后简单地复制内容。 就像是:
(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等服务于来自不同来源的框架,因此我没有对其进行全面的测试。 以这种方式获取脚本内容肯定有效,并且创建元素当然应该如此。 测试时我能找到的最接近的结果是重命名函数并使用当前框架:
(function() { var pdoc = self.document; var dest = pdoc.head; var text = document.getElementById("myscript").textContent.replace("foo", "bar"); var pscr = pdoc.createElement("script"); pscr.textContent = text; dest.appendChild(pscr); self.bar(); })();
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
如果您希望这是一种更可移植的解决方案,则还可以考虑在脚本中使用onMessage
处理程序,并从子级中触发一条消息(消息传递比帧间调用更为复杂,但通常更易于维护)。 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.