Answers:
在不同的域中,无法调用方法或直接访问iframe的内容文档。
您必须使用跨文档消息传递。
例如在顶部窗口中:
myIframe.contentWindow.postMessage('hello', '*');
在iframe中:
window.onmessage = function(e){
if (e.data == 'hello') {
alert('It works!');
}
};
如果您要将消息从iframe发布到父窗口
window.top.postMessage('hello', '*')
window.onmesage = function()...
。在iframe中:window.top.postMessage('hello', '*')
file://C:/Windows/system32/whatever
在网页上放置一个链接,并将其指向用户的系统文件夹中。如今,浏览器通常会忽略对此类链接的点击。运行一个网络服务器,并通过它访问您的代码,您将看到错误消失。
window.frames[index]
用来获取子框架(<iframe>, <object>, <frame>
),相当于getElementsByTagName("iframe")[index].contentWindow
。要从IFrames中获取父窗口对象,最好使用window.parent
,它window.top
表示父窗口最多
必须在这里,因为2012年以来的答案都可以接受
在2018和现代浏览器中,您可以将自定义事件从iframe发送到父窗口。
iframe:
var data = { foo: 'bar' }
var event = new CustomEvent('myCustomEvent', { detail: data })
window.parent.document.dispatchEvent(event)
父母:
window.document.addEventListener('myCustomEvent', handleEvent, false)
function handleEvent(e) {
console.log(e.detail) // outputs: {foo: 'bar'}
}
PS:当然,您可以向相反方向发送事件。
document.querySelector('#iframe_id').contentDocument.dispatchEvent(event)
dispatchEvent
所有主要浏览器均支持该功能。IE9是它的第一个版本,因此现在大多数操作系统都可以使用它。caniuse.com/#search=dispatchEvent
该库支持HTML5 postMessage和具有resize + hash的旧版浏览器https://github.com/ternarylabs/porthole
编辑:现在在2014年,IE6 / 7的使用率非常低,IE8尤其是首先得到了支持,postMessage
所以我现在建议只使用它。
https://developer.mozilla.org/zh-CN/docs/Web/API/Window.postMessage
使用event.source.window.postMessage
发回给发件人。
来自iframe
window.top.postMessage('I am Iframe', '*')
window.onmessage = (event) => {
if (event.data === 'GOT_YOU_IFRAME') {
console.log('Parent received successfully.')
}
}
然后从父母说回来。
window.onmessage = (event) => {
event.source.window.postMessage('GOT_YOU_IFRAME', '*')
}