Il semble que le but de window.postMessage soit de permettre une communication sécurisée entre les fenêtres / cadres hébergés sur différents domaines, mais il ne semble pas le permettre dans Chrome.
Voici le scénario:
- Incorporer un <iframe> (avec un
src
sur le domaine B * ) dans une page du domaine A - Le <iframe> finit par être principalement une balise <script>, à la fin de l'exécution de laquelle ...
- J'appelle window.postMessage ( some_data , page_on_A )
Le <iframe> est très certainement dans le contexte du domaine B, et j'ai confirmé que le javascript intégré dans ce <iframe> s'exécute correctement et appelle postMessage
avec les valeurs correctes.
Je reçois ce message d'erreur dans Chrome:
Impossible de poster un message à A . Bénéficiaire a l' origine B .
Voici le code qui enregistre un écouteur d'événement de message dans la page sur A:
window.addEventListener(
"message",
function (event) {
// Do something
},
false);
J'ai également essayé d'appeler window.postMessage(some_data, '*')
, mais tout ce que cela fait est de supprimer l'erreur.
Suis-je juste en train de manquer le point ici, window.postMessage (...) n'est-il pas destiné à cela? Ou est-ce que je le fais horriblement mal?
* Texte de type Mime / html, qu'il doit rester.
la source
Réponses:
Voici un exemple qui fonctionne sur Chrome 5.0.375.125.
La page B (contenu iframe):
<html> <head></head> <body> <script> top.postMessage('hello', 'A'); </script> </body> </html>
Notez l'utilisation
top.postMessage
ouparent.postMessage
paswindow.postMessage
iciLa page 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 et B doivent être quelque chose comme
http://domain.com
ÉDITER:
À partir d' une autre question , il semble que les domaines (A et B ici) doivent avoir un
/
pour que lepostMessage
fonctionne correctement.la source
postMessage
Vous devez publier un message du cadre au parent, après le chargement.
script de trame:
$(document).ready(function() { window.parent.postMessage("I'm loaded", "*"); });
Et écoutez-le en parent:
function listenMessage(msg) { alert(msg); } if (window.addEventListener) { window.addEventListener("message", listenMessage, false); } else { window.attachEvent("onmessage", listenMessage); }
Utilisez ce lien pour plus d'informations: http://en.wikipedia.org/wiki/Web_Messaging
la source
Vous essayez probablement d'envoyer vos données de mydomain.com à www.mondomaine.com ou inversement, REMARQUE vous avez manqué "www". http://mondomaine.com et http://www.mydomaine.com sont des domaines différents de javascript.
la source
file:///
Est-il possible d'obtenir des erreurs de domaine lors de l'extraction de contenu uniquement à partir du système de fichiers local?