Frage Wie verwenden Sie window.postMessage über Domains hinweg?


Es scheint wie der Punkt von window.postMessage ist es, eine sichere Kommunikation zwischen Fenstern / Frames zu ermöglichen, die auf verschiedenen Domains gehostet werden, aber das scheint es nicht wirklich zu sein ermöglichen das in Chrome.

Hier ist das Szenario:

  1. Einbetten eines <iframe> (mit einem src auf Domäne B*) in einer Seite auf Domäne A
  2. Der <iframe> ist meistens ein <script> -Tag, an dessen Ende die Ausführung erfolgt ...
  3. Ich rufe window.postMessage ( Daten, page_on_A )

Der <iframe> ist definitiv im Kontext von Domäne B, und ich habe bestätigt, dass das eingebettete Javascript in diesem <iframe> ordnungsgemäß ausgeführt wird und aufruft postMessage mit den richtigen Werten.

Ich erhalte diese Fehlermeldung in Chrome:

Nachricht konnte nicht gesendet werden EIN.   Der Empfänger hat seinen Ursprung B.

Hier ist der Code, der einen Listenereignis-Listener auf der Seite von A registriert:

window.addEventListener(
  "message",
  function (event) {
    // Do something
  },
  false);

Ich habe auch versucht anzurufen window.postMessage(some_data, '*'), aber alles was wir tun ist, den Fehler zu unterdrücken.

Fehle ich hier nur den Punkt, ist window.postMessage (...) nicht dafür gedacht? Oder mache ich es nur fürchterlich falsch?

* Mime-Typ Text / HTML, die es bleiben muss.


75
2017-08-11 10:29


Ursprung


Antworten:


Hier sehen Sie ein Beispiel für Chrome 5.0.375.125.

Die Seite B (iframe Inhalt):

<html>
    <head></head>
    <body>
        <script>
            top.postMessage('hello', 'A');
        </script>
    </body>
</html>

Beachten Sie die Verwendung von top.postMessage oder parent.postMessage nicht window.postMessage Hier

Die Seite A:

<html>
<head></head>
<body>
    <iframe src="B"></iframe>
    <script>
        window.addEventListener( "message",
          function (e) {
                if(e.origin !== 'B'){ return; } 
                alert(e.data);
          },
          false);
    </script>
</body>
</html>

A und B müssen so sein http://domain.com

BEARBEITEN:

Von eine andere Fragesieht es aus, dass die Domains (A und B hier) eine haben müssen / für die postMessage richtig funktionieren.


66
2017-08-11 11:49



Sie sollten nach dem Laden eine Nachricht von Frame zu Parent posten.

Rahmen-Skript:

$(document).ready(function() {
    window.parent.postMessage("I'm loaded", "*");
});

Und hören Sie es in Elternteil an:

function listenMessage(msg) {
    alert(msg);
}

if (window.addEventListener) {
    window.addEventListener("message", listenMessage, false);
} else {
    window.attachEvent("onmessage", listenMessage);
}

Verwenden Sie diesen Link für weitere Informationen: http://en.wikipedia.org/wiki/Web_Messaging


16
2017-12-04 10:36



Wahrscheinlich versuchst du, deine Daten von mydomain.com an www.mydomain.com zu senden oder umzukehren, HINWEIS, du hast "www" verpasst. http://mydomain.com und http://www.mydomain.com sind verschiedene Domains zu Javascript.


1
2018-06-17 09:20