我有问题调用的JavaScript函数iframe
从父页。 这里是我的两个页面:
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浏览的内部,我不认为这是问题)
当我按下Reset键,我得到“resultFrame发现”和“resultFrame.Reset未找到”。 它似乎有在框架上的参考,但不能调用框架上的功能,这是为什么?
使用:
document.getElementById("resultFrame").contentWindow.Reset();
访问复位功能在iframe
document.getElementById("resultFrame")
将获得在你的代码的iframe和contentWindow
将获得在iframe窗口对象。 一旦你的子窗口,你可以参考的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();
如果你不能直接,如果使用它,你会遇到这样的错误:“阻止与原点的框架:// WWW HTTP访问一个跨来源框架..com”。 您可以使用的postMessage() ,而不是直接使用的功能。