我在页面中有多个iframe。现在我有一个用于页面的message
事件监听器,可以获取所有iframe的消息。我有一个解决方法来确定消息来自哪个iframe。
我想为每个iframe单独创建事件监听器。这是否可行?
我在页面中有多个iframe。现在我有一个用于页面的message
事件监听器,可以获取所有iframe的消息。我有一个解决方法来确定消息来自哪个iframe。
我想为每个iframe单独创建事件监听器。这是否可行?
你需要监听全局的window
对象上的message
事件,但是你可以使用MessageEvent
的source
属性来过滤源iframe。
例如:
const childWindow = document.getElementById('test-frame').contentWindow;
window.addEventListener('message', message => {
if (message.source !== childWindow) {
return; // Skip message in this event listener
}
// ...
});
message.target[0]
而不是message.source
,然后它就像魔法般地工作了...... - Iulian Pinzaru如果每个 iframe 的 src
属性都是唯一的,那么您可以尝试以下操作:
在子级上:
function sendHeight() {
// sends height to parent iframe
var height = $('#app').height();
window.parent.postMessage({
'height': height,
'location': window.location.href
}, "*");
}
$(window).on('resize', function() {
sendHeight();
}).resize();
在父级元素上:
$(window).on("message", function(e) {
var data = e.originalEvent.data;
$('iframe[src^="' + data.location + '"]').css('height', data.height + 'px');
});
使用postMessage()
,子级向iframe父级发送其高度和URL。然后,父级侦听该事件,通过该URL获取iframe并将其高度设置为相应值。
实际上你是可以的。 给每个iframe添加一个唯一的名称属性。 iframe名称被传递到contentWindow中。 因此,在iframe窗口内,window.name是iframe的名称,您可以轻松地将其发送到post message中。
您可以使用e.originalEvent.origin
来识别iframe。
在iframe子页面上:
window.parent.postMessage({
'msg': 'works!'
}, "*");
window.addEventListener('message', function(e) {
console.log(e.origin); // outputs "http://www.example.com/"
console.log(e.data.msg); // outputs "works!"
if (e.origin === 'https://example1.com') {
// do something
} else if (e.origin === 'https://example2.com'){
// do something else
}
}, false);
jQuery
$(window).on('message', function(e) {
...
}, false);
因此,origin
包含了触发postMessage()
的协议和域名信息。它不包括URI。这种技术假定所有的iframe都有一个唯一的域名。
e.originalEvent.origin
返回的是一个序列化字符串吗?我对jQuery并不是很熟悉,我所找到的只是它返回了由jQuery方便地封装在对象事件中的某些属性。因此,origin
实际上可以显示事件的location.protocol + location.hostname
吗? - zer00ne我实现了一个iframe代理。嵌套的iframe(即内部嵌套)。 每个iFrame代理都创建了自己独特的ID。 然后,从子iframe发送到父级的每条消息都会增加一个iframe代理ID字段。 在父级中,您可以将来自iframe代理的每条消息路由到其专用处理程序中。 这种机制完美地分离了iframes。