题
我在父页面的 iframe
中调用JavaScript函数时遇到问题。这是我的两页:
<强> mainPage.html 强>
<html>
<head>
<title>MainPage</title>
<script type="text/javascript">
function Reset()
{
if (document.all.resultFrame)
alert("resultFrame found");
else
alert("resultFrame NOT found");
if (typeof (document.all.resultFrame.Reset) == "function")
document.all.resultFrame.Reset();
else
alert("resultFrame.Reset NOT found");
}
</script>
</head>
<body>
MainPage<br>
<input type="button" onclick="Reset()" value="Reset"><br><br>
<iframe height="100" id="resultFrame" src="resultFrame.html"></iframe>
</body>
</html>
<强> resultFrame.html 强>
<html>
<head>
<title>ResultPage</title>
<script type="text/javascript">
function Reset()
{
alert("reset (in resultframe)");
}
</script>
</head>
<body>
ResultPage
</body>
</html>
(我知道不推荐 document.all
,但是这个页面只能在内部用IE查看,我不认为这是问题)
当我按下重置按钮时,我得到“resultFrame found”。和“找不到resultFrame.Reset”。它似乎有一个框架的引用但不能调用框架上的函数,为什么会这样?
解决方案
使用:
document.getElementById("resultFrame").contentWindow.Reset();
访问iframe中的重置功能
<代码>的document.getElementById(QUOT; resultFrame&QUOT)代码>
将在您的代码中获取iframe, contentWindow
将获取iframe中的window对象。拥有子窗口后,您可以在该上下文中引用javascript。
另请参阅此处,特别是bobince的答案。
其他提示
尝试从窗口对象中获取帧,而不是从文档中获取帧。
在上面的例子中改变了这个:
if (typeof (document.all.resultFrame.Reset) == "function")
document.all.resultFrame.Reset();
else
alert("resultFrame.Reset NOT found");
到
if (typeof (window.frames[0].Reset) == "function")
window.frames[0].Reset();
else
alert("resultFrame.Reset NOT found");
问题是iframe中的javascript范围不是通过iframe的DOM元素公开的。只有窗口对象包含框架的javascript范围信息。
更强大:
function getIframeWindow(iframe_object) {
var doc;
if (iframe_object.contentWindow) {
return iframe_object.contentWindow;
}
if (iframe_object.window) {
return iframe_object.window;
}
if (!doc && iframe_object.contentDocument) {
doc = iframe_object.contentDocument;
}
if (!doc && iframe_object.document) {
doc = iframe_object.document;
}
if (doc && doc.defaultView) {
return doc.defaultView;
}
if (doc && doc.parentWindow) {
return doc.parentWindow;
}
return undefined;
}
和
...
var el = document.getElementById('targetFrame');
var frame_win = getIframeWindow(el);
if (frame_win) {
frame_win.reset();
...
}
...
呼叫
window.frames['resultFrame'].Reset();
objectframe.contentWindow.Reset()
首先需要引用框架中的顶级元素。
需要满足的第一个也是最重要的条件是父和iframe都属于同一个来源。一旦完成,子进程可以使用window.opener方法调用父进程,父进程可以为上面提到的子进行相同的操作
当你通过document.all访问resultFrame时,它只将它拉为HTML元素,而不是窗口框架。如果您使用“此”框架触发事件,则会出现相同的问题。自参考。
替换:
document.all.resultFrame.Reset();
使用:
window.frames.resultFrame.Reset();
或者:
document.all.resultFrame.contentWindow.Reset();
如果您无法直接使用它并且遇到此错误: 阻止具有来源的框架“ http:// www ..com&quot;从访问跨源框架。 您可以使用 postMessage()而不是使用直接运作。