Я использую MessageChannel () для передачи сообщений между страницей и iframe. В моем сценарии 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;
}
Я запускаю все последующие сообщения от iframe до родителя через parentPort:
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 = '';
}
}
Это рефакторинг в примере с Кайидо Плункер.