双向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)