Szukaj…


Składnia

  • windowObject.postMessage(message, targetOrigin, [transfer]);
  • window.addEventListener("message", receiveMessage);

Parametry

Parametry
wiadomość
targetOrigin
transfer optional

Pierwsze kroki

Co to jest .postMessage () , kiedy i dlaczego go używamy

.postMessage() jest sposobem na bezpieczną komunikację między skryptami pochodzącymi z różnych źródeł.

Zwykle dwie różne strony mogą komunikować się ze sobą za pomocą JavaScript tylko wtedy, gdy są tego samego pochodzenia, nawet jeśli jedna z nich jest osadzona w innej (np. iframes ) lub jedna jest otwarta od drugiej (np. window.open() ). Dzięki .postMessage() możesz obejść to ograniczenie, zachowując bezpieczeństwo.

Z funkcji .postMessage() można korzystać tylko wtedy, gdy masz dostęp do kodu JavaScript obu stron. Ponieważ odbiorca musi zweryfikować nadawcę i odpowiednio przetworzyć wiadomość, możesz użyć tej metody tylko do komunikacji między dwoma skryptami, do których masz dostęp.

Zbudujemy przykład wysyłania wiadomości do okna potomnego i wyświetlania wiadomości w oknie potomnym. Zakłada się, że strona nadrzędna / nadawca to http://sender.com a strona podrzędna / odbiorca będzie na przykład http://receiver.com

Wysyłanie wiadomości

Aby wysłać wiadomości do innego okna, musisz mieć odniesienie do jego obiektu window . window.open() zwraca obiekt referencyjny nowo otwartego okna. Aby poznać inne metody uzyskania odwołania do obiektu okna, zobacz objaśnienie pod parametrem otherWindow tutaj .

var childWindow = window.open("http://receiver.com", "_blank");

Dodaj obszar textarea i send button który będzie używany do wysyłania wiadomości do okna potomnego.

<textarea id="text"></textarea>
<button id="btn">Send Message</button>

Wyślij tekst textarea przy użyciu .postMessage(message, targetOrigin) , gdy button zostanie kliknięty.

var btn = document.getElementById("btn"),
    text = document.getElementById("text");

btn.addEventListener("click", function () {
    sendMessage(text.value);
    text.value = "";
});

function sendMessage(message) {
    if (!message || !message.length) return;
    childWindow.postMessage(JSON.stringify({
        message: message,
        time: new Date()
    }), 'http://receiver.com');
}

Aby wysyłać i odbierać obiekty JSON zamiast prostego ciągu, można zastosować metody JSON.stringify() i JSON.parse() . Transfarable Object możliwy do Transfarable Object może być podany jako trzeci opcjonalny parametr metody .postMessage(message, targetOrigin, transfer) , ale obsługa przeglądarki wciąż jest .postMessage(message, targetOrigin, transfer) nawet w nowoczesnych przeglądarkach.

W tym przykładzie, ponieważ zakłada się, że naszym odbiorcą jest strona http://receiver.com , wpisujemy jego adres URL jako targetOrigin . Wartość tego parametru powinna być zgodna z origin obiektu childWindow aby wiadomość została wysłana. Możliwe jest użycie * jako wildcard ale zdecydowanie zaleca się unikanie używania symbolu wieloznacznego i ze względów bezpieczeństwa zawsze ustawiaj ten parametr na określone pochodzenie odbiornika.

Odbieranie, sprawdzanie poprawności i przetwarzanie wiadomości

Kod w tej części powinien zostać umieszczony na stronie odbiorcy, którą w naszym przykładzie jest http://receiver.com .

Aby odbierać wiadomości, należy odsłuchać message event w window .

window.addEventListener("message", receiveMessage);

Po otrzymaniu wiadomości należy wykonać kilka kroków, aby zapewnić bezpieczeństwo w jak największym stopniu .

  • Sprawdź poprawność nadawcy
  • Sprawdź poprawność wiadomości
  • Przetwórz wiadomość

Nadawca powinien zawsze być sprawdzany, aby upewnić się, że wiadomość została odebrana od zaufanego nadawcy. Następnie sam komunikat powinien zostać zweryfikowany, aby upewnić się, że nie zostanie odebrany żaden złośliwy program. Po tych dwóch walidacjach wiadomość może zostać przetworzona.

function receiveMessage(ev) {
    //Check event.origin to see if it is a trusted sender.
    //If you have a reference to the sender, validate event.source
    //We only want to receive messages from http://sender.com, our trusted sender page.
    if (ev.origin !== "http://sender.com" || ev.source !== window.opener)
        return;

    //Validate the message
    //We want to make sure it's a valid json object and it does not contain anything malicious 
    var data;
    try {
        data = JSON.parse(ev.data);
        //data.message = cleanseText(data.message) 
    } catch (ex) {
        return;
    }

    //Do whatever you want with the received message
    //We want to append the message into our #console div
    var p = document.createElement("p");
    p.innerText = (new Date(data.time)).toLocaleTimeString() + " | " + data.message;
    document.getElementById("console").appendChild(p);
}

Kliknij tutaj, aby zobaczyć JS Fiddle pokazujące jego użycie.



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow