在父页面的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://
。
在下面提到的情况下,调用将失败:
任何解决此限制的方法都是非常不安全的。
例如,假设我注册了域superwinningcontest.com并发送了链接到人们的电子邮件。 当他们加载主页时,我可以隐藏一些iframe
并阅读他们的Facebook feed,查看最近的Amazon或PayPal交易,或者如果他们使用的服务没有实现足够的安全性,他们的账户。 这就是为什么JavaScript限于同域和同一协议。
上一篇: Invoking JavaScript code in an iframe from the parent page