Jak korzystać z okna.postMessage między domenami?

Wydaje się być punktem okna.postMessage ma umożliwić bezpieczną komunikację między oknami/ramkami hostowanymi w różnych domenach, ale nie wydaje się, aby zezwalał na to w Chrome.

Oto scenariusz:

  1. Embed an (with a src on domain B*) na stronie na domenie a
  2. wzywam okno.postMessage( some_data, page_on_A )

Otrzymuję komunikat o błędzie w Chrome:

Nie można wysłać wiadomości do A . Odbiorca ma pochodzenie B .

Oto kod, który rejestruje słuchacz zdarzeń wiadomości na stronie A:

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

Próbowałem również zadzwonić window.postMessage(some_data, '*'), ale wszystko, co robi, to tłumić błąd.

Czy ja po prostu pominąłem punkt tutaj, jest okno.postMessage(... nie do tego? Czy robię to strasznie źle?

*Mime-typ tekstu / html, który musi pozostać.

Author: Kevin Montrose, 2010-08-11

3 answers

Oto przykład, który działa na Chrome 5.0.375.125.

Strona B (zawartość iframe):

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

Zwróć uwagę na użycie top.postMessage lub parent.postMessage NIE window.postMessage tutaj

Strona 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 i B muszą być czymś w rodzaju http://domain.com

EDIT:

Z kolejne pytanie wygląda na to, że domeny(A i b tutaj) muszą mieć /, Aby postMessage działały poprawnie.

 66
Author: Mic,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 10:31:37

Po załadowaniu należy wysłać wiadomość z ramki do rodzica.

Frame script:

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

I wsłuchaj się w rodzica:

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

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

Użyj tego linku, aby uzyskać więcej informacji: http://en.wikipedia.org/wiki/Web_Messaging

 17
Author: Golyo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-12-04 10:36:57

Prawdopodobnie próbujesz wysłać swoje dane z mydomain.com na www.mydomain.com lub odwrotnie, zauważ, że przegapiłeś "www". http://mydomain.com i http://www.mydomain.com są innymi domenami niż javascript.

 1
Author: Getoriks,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-17 09:20:47