我正在使用 MessageChannel() 在页面和 iframe 之间传递消息。在我的场景中,iframe 是通信发起者,包含它的页面接收、转换并响应 iframe。
在实现系统时,我首先获取并保存了对传递给 iframe 的端口的引用,将其缓存并继续将其用于每次后续通信。
框架:
window.onmessage = (e) => {
console.log("iframe port established");
//using this port for all following communications
parentPort = e.ports[0];
onmessage = establishedConnectionHandler;
}
我正在通过 parentPort 运行从 iframe 到父级的所有后续通信:
parentPort.postMessage({command, guid, message});
即使文档声明消息通道是一次性通信,这似乎也可以工作并且使发起通信变得方便。
我的问题 - 这是受支持的功能还是我在利用未定义的行为?
编辑 - 我一定误解了示例MDN的意图:
button.onclick = function(e) {
e.preventDefault();
var channel = new MessageChannel();
otherWindow.postMessage(textInput.value, '*', [channel.port2]);
channel.port1.onmessage = handleMessage;
function handleMessage(e) {
para.innerHTML = e.data;
textInput.value = '';
}
}
这在 Kaiido 的 Plunker 示例中进行了重构。