Error al ejecutar ‘postMessage’ en ‘DOMWindow’: el origen de destino proporcionado no coincide con el origen de la ventana del destinatario (‘null’)

4 minutos de lectura

Tengo un juego en heroku, ahora estoy tratando de hacerlo funcionar en el lienzo de Facebook, pero, aunque funciona en Firefox, en Chrome e IE no funciona.

IE muestra una advertencia con un botón, al hacer clic en el botón, muestra el contenido.

En Chrome, me sale este error:

Failed to execute 'postMessage' on 'DOMWindow': The target origin provided ('https://game.herokuapp.com') does not match the recipient window's origin ('null').

¿Qué ocurre?

Avatar de usuario de Gustaff
gustavo

Asegúrese de que la ventana de destino en la que usted (o Facebook) está publicando un mensaje haya terminado de cargarse. La mayoría de las veces que recibí este error fue cuando un iframe al que estaba enviando mensajes no se pudo cargar.

  • “la ventana de destino que está/FB está publicando el mensaje está cargada” Soy nuevo en el desarrollo web. ¿Qué se supone que significa esto?

    – praxmon

    13 de junio de 2014 a las 4:31

  • @PrakharMohanSrivastava buena pregunta: la gramática hace que esta respuesta sea difícil de entender.

    – tadasajon

    15/09/2015 a las 20:02

  • Creo que está diciendo que publicar en una ventana cuyo documento no ha terminado de cargarse (todavía) provoca este error.

    – doug65536

    20 de enero de 2016 a las 9:28


  • Parece que el código “listo para usar” de Facebook no funciona. ¿Cómo me aseguraría de que la ventana de destino esté cargada?

    – Adrián

    21 de agosto de 2017 a las 23:54

Otra razón por la que esto podría estar sucediendo es si está utilizando un iframe que tiene el atributo sandbox y allow-same-origin no está configurado, por ejemplo:

// page.html
<iframe id="f" src="http://localhost:8000/iframe.html" sandbox="allow-scripts"></iframe>
<script type="text/javascript">
    var f = document.getElementById("f").contentWindow;
    // will throw exception
    f.postMessage("hello world!", 'http://localhost:8000');
</script>

// iframe.html
<script type="text/javascript">
    window.addEventListener("message", function(event) {
        console.log(event);
    }, false);
</script>

No he encontrado otra solución que no sea:

  • agregar permitir el mismo origen a la caja de arena (no quería hacer eso)
  • usar f.postMessage("hello world!", '*');

  • Pero el uso de allow-scripts y allow-same-origin no es seguro (Firefox dice: “Advertencia: el uso de allow-scripts y allow-same-origin invalida el atributo iframe sandbox”). Relacionado con esta pregunta. Entonces creo que se recomienda usar el asterisco, ya que no permitiste cambiar la URL.

    – yeti

    4 de marzo de 2018 a las 22:01


  • Por otro lado, traté de window.postMessage de iframe, mensaje de error en conlsoe muestra que el dominio tiene que coincidir, con window.parent.postMessagetodavía se queja con el mismo mensaje de error. window.parent.location.origin también se le niega el acceso. Entonces lo intenté '*' como origen, funciona. resulta anfitrión localhost y 127.0.0.1 no coincide

    – ben

    4 de junio de 2019 a las 14:18


  • Quería algo para el desarrollo local sin tener un servidor, no quiero incluir Node.js o Apache, esta fue la única solución que proporcionó algo para mi caso de uso. Muchas gracias.

    – Wylie

    17 mayo 2022 a las 13:30

NOTA RELACIONADA: Cuando envíe mensajes desde un iframe a la página de host, recibirá este error si olvida usar window.top.postMessage.

Sin .top, está enviando el mensaje a iframes dentro del iframe.

Para verificar si el marco se ha cargado, use la función de carga. O ponga su función principal en carga: recomiendo usar carga al crear el iframe por js

 $('<iframe />', {
   src: url,
   id:  'receiver',
   frameborder: 1,
   load:function(){
     //put your code here, so that those code can be make sure to be run after the frame loaded
   }
   }).appendTo('body');

avatar de usuario de nikk wong
nikk wong

En mi caso no agregué el http:// prefijo. Potencialmente vale la pena comprobarlo.

Avatar de usuario de Artyom Pranovich
Artem Pranovich

En mi caso, el certificado SSL no era válido para el dominio de iframe, así que asegúrese de que la URL de iframe a la que intenta enviar mensajes se abra sin problemas (en caso de que cargue su iframe sobre https).

avatar de usuario de avalanche1
avalancha1

Estaba tratando de enviar mensajes entre dominios entre la página principal y el iframe incrustado. No se pudo usar
window.postMessage('text', '*'); – el mensaje simplemente nunca se recibió en el lado del iframe.

Cambiar a esto lo clavó:
document.querySelector('iframe').contentWindow.postMessage('text', '*');

  • Eso es porque, en el primer caso, el mensaje se envía a la ventana principal

    – Haroldo_OK

    3 abr a las 17:19

¿Ha sido útil esta solución?