假设我在页面上有几个 iframe,其中一个发送了帖子消息。有没有一种简单的跨浏览器方法来检测是哪一个做的并能够回复?
我看到了source
消息的属性,event
但我无法通过使用它来响应event.source.contentWindow.postMessage
:
错误:访问属性“contentWindow”的权限被拒绝
假设我在页面上有几个 iframe,其中一个发送了帖子消息。有没有一种简单的跨浏览器方法来检测是哪一个做的并能够回复?
我看到了source
消息的属性,event
但我无法通过使用它来响应event.source.contentWindow.postMessage
:
错误:访问属性“contentWindow”的权限被拒绝
您可以检测没有名称的 IFrame,只需使用 comparison iframe.contentWindow === event.source
。
window.addEventListener('message', function (event) {
var iframes = document.getElementsByTagName('IFRAME');
for (var i = 0, iframe, win; i < iframes.length; i++) {
iframe = iframes[i];
// Cross-browser way to get iframe's window object
win = iframe.contentWindow || iframe.contentDocument.defaultView;
// Comparison
text.innerText += iframe.src +
(win === event.source ? ' MATCHES.\n' : ' is not our IFrame.\n');
}
});
// Creates iframe and sends postMessage from it
function createIFrameWithMessage(id) {
var iframe = document.createElement('IFRAME');
iframe.src = 'javascript:parent.postMessage("IFrame #' + id + '", "*");';
document.body.appendChild(iframe);
}
createIFrameWithMessage(1);
createIFrameWithMessage(2);
createIFrameWithMessage(3);
<p id="text"></p>
框架
<script>
document.addEventListener('mousedown',event =>
parent.postMessage({ name: window.name }, window.location.origin)
);
</script>
父窗口
<script>
window.addEventListener("message", event => {
if (event.origin != window.location.origin) return;
console.warn(event.source.frameElement.name);
// here you can find your iframe by name
});
</script>
<iframe name='myname1' src='/url1'/>
<iframe name='myname2' src='/url2'/>
<iframe name='myname3' src='/url3'/>
只需使用 event.source.postMessage