Suche…


Syntax

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

Parameter

Parameter
Botschaft
targetOrigin
Transfer optional

Fertig machen

Was ist .postMessage () , wann und warum verwenden wir es

.postMessage() -Methode ist eine Möglichkeit, die Kommunikation zwischen Ursprungsskripts sicher zuzulassen.

Normalerweise können zwei verschiedene Seiten mit JavaScript nur dann direkt miteinander kommunizieren, wenn sie unter demselben Ursprung liegen, selbst wenn eine von ihnen in eine andere eingebettet ist (z. B. iframes ) oder eine von innen aus geöffnet ist (z. B. window.open() ). Mit .postMessage() können Sie diese Einschränkung .postMessage() und trotzdem sicher bleiben.

Sie können .postMessage() nur verwenden, wenn Sie auf den JavaScript-Code beider Seiten zugreifen können. Da der Empfänger den Absender überprüfen und die Nachricht entsprechend bearbeiten muss, können Sie diese Methode nur für die Kommunikation zwischen zwei Skripts verwenden, auf die Sie zugreifen können.

Wir werden ein Beispiel erstellen, um Nachrichten an ein untergeordnetes Fenster zu senden und die Nachrichten im untergeordneten Fenster anzuzeigen. Die übergeordnete / sendende Seite wird als http://sender.com und die untergeordnete / Empfängerseite für das Beispiel als http://receiver.com angenommen.

Nachrichten senden

Um Nachrichten an ein anderes Fenster zu senden, benötigen Sie einen Verweis auf das window . window.open() gibt das Referenzobjekt des neu geöffneten Fensters zurück. otherWindow anderen Methoden, um einen Verweis auf ein Fensterobjekt zu erhalten, finden Sie in der Erläuterung unter otherWindow -Parameter hier .

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

Fügen Sie einen textarea und eine send button zum Senden hinzu, mit der Nachrichten an das untergeordnete Fenster gesendet werden.

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

Senden Sie den Text des textarea mit .postMessage(message, targetOrigin) wenn Sie auf die button .postMessage(message, targetOrigin) .

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');
}

Um JSON-Objekte anstelle eines einfachen Strings zu senden und zu empfangen, können die Methoden JSON.stringify() und JSON.parse() verwendet werden. Ein Transfarable Object kann als dritter optionaler Parameter der Methode .postMessage(message, targetOrigin, transfer) werden, doch die Unterstützung für Browser fehlt selbst in modernen Browsern noch immer.

Für dieses Beispiel, da unser Empfänger angenommen wird sein http://receiver.com Seite, geben wir die URL als targetOrigin . Der Wert dieses Parameters sollte mit dem origin des childWindow Objekts für die zu childWindow Nachricht childWindow . Es ist möglich, * als wildcard , es wird jedoch dringend empfohlen , den Platzhalter zu vermeiden, und dieser Parameter sollte aus Sicherheitsgründen immer auf den spezifischen Ursprung des Empfängers eingestellt werden .

Empfangen, Überprüfen und Verarbeiten von Nachrichten

Der Code unter diesem Teil sollte auf der Empfängerseite abgelegt werden, in unserem Beispiel http://receiver.com .

Um Nachrichten empfangen zu können, sollte das message event des window abgehört werden.

window.addEventListener("message", receiveMessage);

Wenn eine Nachricht empfangen wird, müssen einige Schritte befolgt werden, um die Sicherheit so gut wie möglich zu gewährleisten .

  • Bestätigen Sie den Absender
  • Bestätigen Sie die Nachricht
  • Verarbeiten Sie die Nachricht

Der Absender sollte immer überprüft werden, um sicherzustellen, dass die Nachricht von einem vertrauenswürdigen Absender empfangen wird. Danach sollte die Nachricht selbst überprüft werden, um sicherzustellen, dass keine schädlichen Personen empfangen werden. Nach diesen beiden Validierungen kann die Nachricht verarbeitet werden.

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);
}

Klicken Sie hier, um eine JS-Fiddle zu sehen, die ihre Verwendung zeigt.



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow