gpt4 book ai didi

javascript - 如何调用另一个iframe的函数

转载 作者:行者123 更新时间:2023-12-02 04:08:10 27 4
gpt4 key购买 nike

我正在尝试从 iframe1 调用 iframe2 函数

  document.getElementById('cDiv').contentWindow.toggle_main();
var iframe = document.getElementsByTagName('iframe')[1];
iframe.contentWindow.myFunction();

控制台返回未捕获的类型错误:无法读取未定义的属性“contentWindow”

我也尝试过:

   window.frames['iframe2'].toggle_main();

iframe2中的函数调用:

 <script>

window.myFunction = function(args) {
alert("called");
}
</script>

iframe 定义为:

<DIV id="cgDiv">
<IFRAME id="contentGenerator" SCROLLING="No" name ="iframe1" src="outlook.html">
</IFRAME>
</DIV>
<DIV id="cDiv">
<IFRAME id="content" SCROLLING="AUTO" verticalscrolling="yes" NAME = "iframe2" src="index.html">
</IFRAME>
</DIV>

关于问题应该出在哪里的想法?

最佳答案

Javascript 无法直接访问 IFrame 中的函数。不过,IFrame 可以访问其父级中的函数。

因此,例如,如果您的主页公开了一个方法 RegisterCallback,则 IFrame 可以使用其函数之一作为参数来调用它。然后页面可以存储对该函数的引用并在其他时间调用它(使用任何参数...)

更新:添加示例代码

下面的代码是两个文件; index.html 是带有 iframe 的母版页,child.html 是 iframe 内的页面。

我已经committed the example to github你可以test it by following this link 。由于浏览器安全限制,代码必须从同一网络服务器加载,如果直接从文件系统运行则不起作用。

我特意包含了两次子 iframe,以说明可以使用此技术注册任意数量的子级。我将其作为练习留给读者添加第三个 iframe...:)

index.html

<html>
<body style="background:#efe">

<h1>This is the master page</h1>
<p><button id="setChildButton" type="button">Make child blue</button></p>
<iframe src="child.html"></iframe>
<iframe src="child.html"></iframe>
</body>
</html>
<script>
var childCallbacks = [];

function registerChild(callback){
console.log('Registering child callback');
childCallbacks.push(callback);
}

function onButtonClick(){
for (var i=0; i < childCallbacks.length; i++){
var callback = childCallbacks[i];
callback('blue');
}
}

window.onload = function(){
document
.getElementById('setChildButton')
.addEventListener('click', onButtonClick);
};
</script>

JavaScript 有一个函数 registerChild(),它从不调用自身,但可以从子页面调用以注册其端点。

单击按钮时,将使用字符串“blue”调用所有已注册的回调。然后由 child 的终点来做一些好事。在本例中更改其自己的背景颜色。

child.html

<html>
<body id="childBody" style="background:#fee">
<h2>This is the child page</h2>
</body>
</html>
<script>

function setBackground(color){
var body = document.getElementById('childBody');
body.style.backgroundColor = color;
}

window.onload = function(){
if (parent && parent.registerChild){
console.log('registering with parent');
parent.registerChild(setBackground);
}
};
</script>

子级的 javascript 检查是否存在父级(它在 iframe 内运行)以及父级是否提供名为 registerChild() 的函数。然后,它通过引用其自己的函数 setBackground() 来调用该函数。

当父级稍后使用字符串“blue”调用回调时,它会转身并将其自己的主体背景颜色设置为该值。

关于javascript - 如何调用另一个iframe的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38334779/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com