调用iframe中的JavaScript功能(Calling javascript function

2019-08-26 22:39发布

我有问题调用的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未找到”。 它似乎有在框架上的参考,但不能调用框架上的功能,这是为什么?

Answer 1:

使用:

document.getElementById("resultFrame").contentWindow.Reset();

访问复位功能在iframe

document.getElementById("resultFrame")将获得在你的代码的iframe和contentWindow将获得在iframe窗口对象。 一旦你的子窗口,你可以参考的JavaScript在这方面。

另请参见这里尤其bobince答案。



Answer 2:

相反,正从该文件框架,试图从窗口对象获取帧。

在上面的例子中改变这一:

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范围资讯。



Answer 3:

为了获得更大的鲁棒性:

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();
  ...
}
...


Answer 4:

呼叫

window.frames['resultFrame'].Reset();


Answer 5:

objectframe.contentWindow.Reset()需要参照顶级元素在第一帧。



Answer 6:

需要满足的首要条件是,无论是家长和iframe应该属于同一来源。 一旦做到这一点的孩子可以使用window.opener方法调用父和上面提到的父母能为孩子做同样的



Answer 7:

当你通过的document.all访问resultFrame只拉它作为一个HTML元素,而不是窗框。 你得到同样的问题,如果你有一个框架火用“这个”自我参照的事件。

更换:

document.all.resultFrame.Reset();

附:

window.frames.resultFrame.Reset();

要么:

document.all.resultFrame.contentWindow.Reset();


Answer 8:

如果你不能直接,如果使用它,你会遇到这样的错误:“阻止与原点的框架:// WWW HTTP访问一个跨来源框架..com”。 您可以使用的postMessage() ,而不是直接使用的功能。



文章来源: Calling javascript function in iframe