在父页面的iframe中调用JavaScript代码

基本上,我有一个iframe嵌入页面和iframe有一些JavaScript程序,我需要从父页调用。

现在相反很简单,因为你只需要调用parent.functionName() ,但不幸的是,我需要完全相反的。

请注意,我的问题不是更改iframe的源URL,而是调用iframe定义的函数。


假设你的iFrame的id是“targetFrame”,你想调用的函数是targetFunction()

document.getElementById('targetFrame').contentWindow.targetFunction();

您也可以使用window.frames而不是document.getElementById来访问框架。

// this option does not work in most of latest versions of chrome and Firefox
window.frames[0].frameElement.contentWindow.targetFunction(); 

有一些怪癖可以在这里知道。

  • HTMLIFrameElement.contentWindow可能是更简单的方法,但它不是一个标准属性,有些浏览器不支持它,大多数是较老的。 这是因为DOM 1级HTML标准对window对象没有什么可说的。

  • 您还可以尝试HTMLIFrameElement.contentDocument.defaultView ,这是几个较旧的浏览器允许的,但IE不支持。 即使如此,标准并没有明确地说你得到window对象,出于与(1)相同的原因,但是如果你在意的话,你可以在这里选择一些额外的浏览器版本。

  • window.frames['name']返回窗口是最老的,因此也是最可靠的接口。 但是,您必须使用name="..."属性才能够通过名称获取框架,该框架有点丑陋/不赞成/过渡。 ( id="..."会更好,但IE不喜欢这样。)

  • window.frames[number]也是非常可靠的,但知道正确的索引是诀窍。 你可以逃脱这个例如。 如果你知道你在页面上只有一个iframe。

  • 子iframe尚未加载完全可能,或其他问题导致无法访问。 您可能会发现逆转通信流程更容易:也就是说,当子结点加载完成并准备好回调时,让子iframe通知其window.parent脚本。 通过将其自己的一个对象(例如回调函数)传递给父脚本,该父代可以直接与iframe中的脚本进行通信,而不必担心与其相关联的HTMLIFrameElement。


  • iframe调用父JS函数是可能的,但只有当父代和加载在iframe中的页面来自同一个域即abc.com,并且两者都使用相同的协议时,即两者都在http://https://

    在下面提到的情况下,调用将失败:

  • 父页面和iframe页面来自不同的域。
  • 他们使用不同的协议,其中一个在http://上,另一个在https://上。
  • 任何解决此限制的方法都是非常不安全的。

    例如,假设我注册了域superwinningcontest.com并发送了链接到人们的电子邮件。 当他们加载主页时,我可以隐藏一些iframe并阅读他们的Facebook feed,查看最近的Amazon或PayPal交易,或者如果他们使用的服务没有实现足够的安全性,他们的账户。 这就是为什么JavaScript限于同域和同一协议。

    链接地址: http://www.djcxy.com/p/19247.html

    上一篇: Invoking JavaScript code in an iframe from the parent page

    下一篇: Resizing an iframe based on content