Element HTML iframe
pozwala na uruchomienie strony internetowej wewnątrz innej strony internetowej.
Komunikacja pomiędzy nimi możliwa jest na dwa sposoby.
Jeśli aplikacja-rodzic (parent) i aplikacja w iframe
wspóldzielą domenę, to współdzielą też localStorage
. W takim wypadku możliwe jest przeprowadzenie nasłuchu na zmianach w localStorage
i odpowiednie zareagowanie na nie.
//parent const dataToSend = { message: "This is a message." }; localStorage.setItem("messageToIframe", JSON.stringify(dataToSend)); //iframe window.addEventListener("storage", function (event) { if (event.key === "messageToIframe") { const dataReceived = JSON.parse(event.newValue); console.log(dataReceived.message); //This is a message. } });
Taka komunikacja działa dwustronnie - zarówno iframe
jak i parent mogą być nadawcą i odbiorcą.
Innym sposobem, bezpiecznym pod kątem CORS jest mechanizm wysyłania wiadomości. Pozwala też na sprawdzenie domeny, z której pochodzi wiadomość lub do której domeny trafi.
postMessage
przyjmuje jako argumenty wiadomość oraz targetOrigin
- jest to domena, pod którą musi by iframe
, aby mogło otrzymać wiadomość. Oznaczenie jej jako *
sprawi, że domena nie ma znaczenia.
//parent localStorage.setItem("messageToIframe", JSON.stringify(dataToSend)); const dataToSend = { message: "This is a message." }; iframe.contentWindow.postMessage(messageData, "*"); //iframe window.addEventListener("message", function (event) { if (event.origin === "http://localhost:8080") { //origin check const dataReceived = JSON.parse(event.data); console.log(dataReceived.message); //This is a message. } });
Podobnie jak w przypadku nasłuchiwania zmian localStorage
, komunikacja ta działa dwustronnie. Wystarczy w parent ustawić eventListener
na message
, a z poziomu iframe
nadawać wiadomości do parenta (window.parent
).