Estoy tratando de hacer que un postMessage
ejemplo trivial funcione ...
- en IE10
- entre ventanas / pestañas (frente a iframes)
- a través de orígenes
Elimine cualquiera de estas condiciones y todo funcionará bien :-)
Pero por lo que puedo decir, entre ventanas postMessage
solo parece funcionar en IE10 cuando ambas ventanas comparten un origen. (Bueno, de hecho, y extrañamente, el comportamiento es un poco más permisivo que eso: dos orígenes diferentes que comparten un host también parecen funcionar).
¿Es este un error documentado? ¿Alguna solución u otro consejo?
(Nota: esta pregunta toca los problemas, pero su respuesta es sobre IE8 e IE9, no sobre 10)
Más detalles + ejemplo ...
demostración de la página del lanzador
<!DOCTYPE html>
<html>
<script>
window.addEventListener("message", function(e){
console.log("Received message: ", e);
}, false);
</script>
<button onclick="window.open('http://jsbin.com/ameguj/1');">
Open new window
</button>
</html>
demostración de la página lanzada
<!DOCTYPE html>
<html>
<script>
window.opener.postMessage("Ahoy!", "*");
</script>
</html>
Esto funciona en: http://jsbin.com/ahuzir/1 , porque ambas páginas están alojadas en el mismo origen (jsbin.com). Pero mueva la segunda página a cualquier otro lugar, y fallará en IE10.
window.parent.postMessage
en IE.Respuestas:
Me equivoqué cuando publiqué originalmente esta respuesta: en realidad no funciona en IE10. Aparentemente, la gente ha encontrado esto útil por otras razones, así que lo dejo para la posteridad. Respuesta original a continuación:
Vale la pena señalar: el enlace en esa respuesta que vinculó a estados que
postMessage
no es de origen cruzado para ventanas separadas en IE8 e IE9; sin embargo, también se escribió en 2009, antes de que apareciera IE10. Así que no lo tomaría como una indicación de que está arreglado en IE10.En cuanto a
postMessage
sí mismo, http://caniuse.com/#feat=x-doc-messaging indica notablemente que todavía está roto en IE10, lo que parece coincidir con su demostración. La página caniuse enlaza con este artículo , que contiene una cita muy relevante:Por lo tanto, su mejor
MessageChannel
opción es probablemente tener una ruta de código basada y recurrir a ellapostMessage
si no existe. No obtendrá soporte para IE8 / IE9, pero al menos funcionará con IE10.Documentos en
MessageChannel
: http://msdn.microsoft.com/en-us/library/windows/apps/hh441303.aspxfuente
MessageChannel
ruta de código basada en que funcione? Aún necesita funcionarpostMessage
para llevar el puerto del canal a la otra ventana.postMessage
con la nuevaMessageChannel
API funcionará en nuevas ventanas y orígenes. El trabajo es un poco incómodo, supongo, pero básicamente:postMessage('foo', '*')
es malo,postMessage('foo', [messageChannel.port2])
es bueno.Cree una página de proxy en el mismo host que el lanzador. La página proxy tiene una
iframe
fuente con configurada como página remota. PostMessage de origen cruzado ahora funcionará en IE10 así:window.parent.postMessage
para pasar datos a la página proxy. Como utiliza iframes, es compatible con IE10window.opener.postMessage
para devolver datos a la página de inicio. Como está en el mismo dominio, no hay problemas de origen cruzado. También puede llamar directamente a métodos globales en la página de inicio si no desea utilizar postMessage, por ejemplo.window.opener.someMethod(data)
Muestra (todas las URL son ficticias)
Página del lanzador en
http://example.com/launcher.htm
Página de proxy en
http://example.com/proxy.htm
Página remota en
http://example.net/remote.htm
fuente
== SOLUCIÓN DE TRABAJO EN 2020 sin iframe ==
Sobre la base de la respuesta por enredo, tuve éxito en IE11 [y emulé el modo IE10] usando el siguiente fragmento:
Luego pude comunicarme usando la pila típica de postMessage, estoy usando un mensajero estático global en mi escenario (aunque supongo que no tiene ninguna importancia, también estoy adjuntando mi clase de mensajero)
No importa cuánto lo intenté, no pude hacer que las cosas funcionaran en IE9 e IE8
Mi configuración donde está funcionando:
versión de IE: 11.0.10240.16590, versiones de actualización: 11.0.25 (KB3100773)
fuente
Sobre la base de las respuestas de LyphTEC y Akrikos, otra solución es crear una
<iframe>
ventana emergente en blanco, lo que evita la necesidad de una página de proxy separada, ya que la ventana emergente en blanco tiene el mismo origen que su abridor.Página del lanzador en
http://example.com/launcher.htm
Página remota en
http://example.net/remote.htm
No estoy seguro de cuán frágil es esto, pero funciona en IE 11 y Firefox 40.0.3.
fuente
<iframe>
dirección) en IE 11 (11.0.9600.18036
, actualizar versiones11.0.23 (KB3087038)
). Posiblemente esté implicada la actualización de seguridad reciente ( KB3087038 ).En este momento, (2014-09-02), lo mejor que puede hacer es utilizar un marco de proxy como se indica en la publicación del blog msdn que detalla una solución para este problema: https://blogs.msdn.microsoft.com/ieinternals/2009 / 09/15 / html5-deployment-issues-in-ie8-and-later /
Aquí está el ejemplo de trabajo: http://www.debugtheweb.com/test/xdm/origin/
Necesita configurar un marco de proxy en su página que tenga el mismo origen que la ventana emergente. Envíe información desde la ventana emergente al marco de proxy utilizando
window.opener.frames[0]
. Luego use postMessage desde el marco del proxy a la página principal.fuente
Esta solución implica agregar el sitio a los sitios de confianza de Internet Explore y no a los sitios de la intranet local. Probé esta solución en Windows 10 / IE 11.0.10240.16384, Windows 10 / Microsoft Edge 20.10240.16384.0 y Windows 7 SP1 / IE 10.0.9200.17148. La página no debe estar incluida en la Zona Intranet .
Así que abra la configuración de Internet Explorer (Herramientas> Opciones de Internet> Seguridad> Sitios de confianza> Sitios) y agregue la página, aquí uso * para hacer coincidir todos los subdominios. Asegúrese de que la página no aparezca en los sitios de la intranet local (Herramientas> Opciones de Internet> Seguridad> Intranet local> Sitios> Avanzado). Reinicie su navegador y vuelva a probar.
En Windows 10 / Microsoft Edge , encontrará esta configuración en Panel de control> Opciones de Internet.
ACTUALIZAR
Si esto no funciona, puede intentar restablecer todas sus configuraciones en Herramientas> Opciones de Internet> Configuración avanzada> Restablecer la configuración de Internet Explorer y luego Restablecer: ¡ utilícelo con precaución ! Luego, deberá reiniciar su sistema. Después de eso, agregue los sitios a los sitios de confianza.
Vea en qué zona se encuentra su página en Archivo> Propiedades o haga clic con el botón derecho.
ACTUALIZAR
Estoy en una intranet corporativa ya veces funciona y otras no (¿configuración automática? Incluso empecé a culpar al proxy corporativo). Al final usé esta solución https://stackoverflow.com/a/36630058/2692914 .
fuente
Esta Q es antigua, pero para esto es easyXDM, tal vez compruébelo como una alternativa potencial cuando detecte un navegador que no es compatible con html5 .postMessage:
https://easyxdm.net/
Utiliza el contenedor VBObject y todo tipo de cosas con las que nunca querría tener que lidiar para enviar mensajes de dominio cruzado entre ventanas o marcos donde window.postMessage falla para varias versiones de IE (y tal vez el borde, aún no estoy seguro al 100% del soporte Edge tiene, pero parece que también necesita una solución para .postMessage)
fuente
MessageChannel no funciona para IE 9-11 entre ventanas / pestañas, ya que se basa en postMessage, que todavía está roto en este escenario. La "mejor" solución es llamar a una función a través de window.opener (es decir, window.opener.somefunction ("somedata")).
Solución alternativa con más detalle aquí
fuente