双向Javascript window.postMessage-分派订单问题
双向Javascript window.postMessage-分派订单问题,javascript,iframe,xss,postmessage,Javascript,Iframe,Xss,Postmessage,postMessage可用于在窗口之间发送消息,通常从iframe发送到父级,或从父级发送到iframe postMessage只向一个方向发送数据,并且与函数调用不同,函数调用从调用返回值,并在线执行(后者是前者的条件) 为了将信息发送回“调用者”,被调用者必须自己做postMessage 现在,让我们假设我想测试是否存在合适的侦听器:根据某种约定,我将postMessage,如果侦听器存在,它将postMessage返回 什么时候我才能确定没有听众?如何实现等待 我在IE11、Chrome和
postMessage
可用于在窗口之间发送消息,通常从iframe发送到父级,或从父级发送到iframe
postMessage
只向一个方向发送数据,并且与函数调用不同,函数调用从调用返回值,并在线执行(后者是前者的条件)
为了将信息发送回“调用者”,被调用者必须自己做postMessage
现在,让我们假设我想测试是否存在合适的侦听器:根据某种约定,我将postMessage
,如果侦听器存在,它将postMessage
返回
什么时候我才能确定没有听众?如何实现等待
我在IE11、Chrome和Firefox上尝试了以下实验:
postMessage
iframe的窗口,收到消息后立即发回postMessage
自己的窗口,作为在事件处理中分派未来点的一种手段var iframe = document.getElementById('iframe');
iframe.contentWindow.postMessage('hello', '*');
window.postMessage('schedule', '*')
iframe的响应代码如下:
window.addEventListener('message', function (event) {
window.top.postMessage('echo ' + event.data, '*');
}, false);
父窗口的侦听器本身是这样的:
var n = 0;
window.addEventListener("message", function (event) {
if (n > 4) return;
console.info(event.data);
window.postMessage('(repeat of ' + event.data + ' #' + n + ')', '*')
n++;
}, false);
换句话说,我不断地重新分派事件,以便记录队列的性质
在IE11、Chrome和Firefox上,这(反复)给出了:
时间表
schedule <-- shouldn't make the mistake to believe there's no listener yet!
echo hello
(repeat of schedule #0)
(repeat of echo hello #1)
(repeat of (repeat of schedule #0) #2)