从iframe外部调用iframe内的函数

时间:2009-11-02 19:41:10

标签: javascript iframe many-to-many

我有一个包含iframe的页面。在iframe里面,我有一个像这样的javascript函数:

function putme() {}

如何在主页面上调用此功能?

7 个答案:

答案 0 :(得分:9)

window.frames['frameName'].putme();

请注意,这通常仅在iframe引用同一域中的页面时才有效。出于安全原因,浏览器限制对属于不同域的帧内的页面进行访问。

答案 1 :(得分: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.putme();
  ...
}
...

答案 2 :(得分:1)

如果iframe与外部页面位于不同的域中,则很难或根本不存在。

一般情况下,浏览器会阻止javascript访问来自其他域的代码,但是如果您控制这两个页面,则会有一些黑客可以使某些内容有效。或多或少。

例如,您可以从外部更改iFrame的URL片段,从iframe内部轮询片段并调用该函数。窗口名称有一个类似的技巧。

答案 3 :(得分:1)

在框架集上,指定框架的名称,在主页面中,您可以按给定名称访问框架:

窗口[FrameName] .putme();

答案 4 :(得分:0)

您可以使用其名称访问iframe:

foo.putme();

在iframe页面内全局声明的函数将成为该iframe的window对象的成员。您可以使用iframe的名称访问iframe的窗口对象。

为此,您的iframe需要具有名称属性:

<iframe name="foo" ...>

此外,主页面和iframe页面应该来自同一个域。

答案 5 :(得分:0)

为框架指定名称和ID - 两者完全相同。 window.frameNameOrId_.functionName()

这两个框架必须位于同一个域中(尽管有很多方法可以解决这个问题)

答案 6 :(得分:0)

这可以通过JavaScript完成:

window.top.location.href = url;

适用于所有主流浏览器。