【发布时间】:2012-02-27 12:49:37
【问题描述】:
iframe 中的网站不在同一个域中,但两者都是我的,我想在iframe 和父网站之间进行通信。有可能吗?
【问题讨论】:
标签: javascript html ajax iframe
iframe 中的网站不在同一个域中,但两者都是我的,我想在iframe 和父网站之间进行通信。有可能吗?
【问题讨论】:
标签: javascript html ajax iframe
使用不同的域,无法直接调用方法或访问 iframe 的内容文档。
你必须使用cross-document messaging。
例如在顶部窗口中:
myIframe.contentWindow.postMessage('hello', '*');
在 iframe 中:
window.onmessage = function(e) {
if (e.data == 'hello') {
alert('It works!');
}
};
例如在顶部窗口中:
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。要从 IFrame 中获取父窗口对象,最好使用window.parent,因为window.top 代表最顶层的父窗口
在 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
使用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', '*')
}
【讨论】:
window.onmessage 的跨浏览器支持尚未完成:developer.mozilla.org/en-US/docs/Web/API/WindowEventHandlers/…
你也可以使用
postMessage(message, '*');
【讨论】:
window.top 属性应该能够满足您的需求。
例如
alert(top.location.href)
【讨论】:
这个库支持 HTML5 postMessage 和带有 resize+hash https://github.com/ternarylabs/porthole的旧版浏览器
编辑:现在在 2014 年,IE6/7 的使用率很低,IE8 及以上都支持postMessage,所以我现在建议只使用它。
https://developer.mozilla.org/en-US/docs/Web/API/Window.postMessage
【讨论】: