Estou tentando fazer um postMessage
exemplo trivial funcionar ...
- no IE10
- entre janelas / guias (vs. iframes)
- através das origens
Remova qualquer uma dessas condições e tudo funcionará bem :-)
Mas, pelo que posso dizer, entre as janelas postMessage
só parece funcionar no IE10 quando ambas as janelas compartilham uma origem. (Bem, na verdade - e estranhamente - o comportamento é um pouco mais permissivo do que isso: duas origens diferentes que compartilham um host parecem funcionar também).
Este é um bug documentado? Alguma solução alternativa ou outro conselho?
(Observação: esta pergunta aborda os problemas, mas sua resposta é sobre o IE8 e o IE9 - não sobre 10)
Mais detalhes + exemplo ...
demonstração da página inicial
<!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>
página de demonstração lançada
<!DOCTYPE html>
<html>
<script>
window.opener.postMessage("Ahoy!", "*");
</script>
</html>
Funciona em: http://jsbin.com/ahuzir/1 - porque ambas as páginas estão hospedadas na mesma origem (jsbin.com). Mas mova a segunda página para qualquer outro lugar e ela falhará no IE10.
window.parent.postMessage
no IE.Respostas:
Eu estava enganado quando postou esta resposta originalmente: na verdade, não funciona no IE10. Aparentemente, as pessoas acharam isso útil por outras razões, então estou deixando para a posteridade. Resposta original abaixo:
Vale a pena observar: o link nessa resposta que você vinculou a afirma que
postMessage
não é uma origem cruzada para janelas separadas no IE8 e no IE9 - no entanto, também foi escrito em 2009, antes do IE10 surgir. Então, eu não consideraria isso uma indicação de que foi corrigido no IE10.Quanto a
postMessage
si mesmo, http://caniuse.com/#feat=x-doc-messaging indica que ele ainda não funciona no IE10, o que parece corresponder à sua demonstração. Os links da página caniuse para este artigo , que contém uma citação muito relevante:Portanto, sua melhor aposta é provavelmente ter um
MessageChannel
codepath baseado e voltar para opostMessage
caso não exista. Ele não dará suporte ao IE8 / IE9, mas pelo menos funcionará com o IE10.Documentos em
MessageChannel
: http://msdn.microsoft.com/en-us/library/windows/apps/hh441303.aspxfonte
MessageChannel
codepath baseado em que funcione? Você ainda precisa funcionarpostMessage
para levar a porta do canal para a outra janela.postMessage
com a novaMessageChannel
API funcionará em novas janelas e origens. O funcionamento é um pouco estranho, eu acho, mas basicamente:postMessage('foo', '*')
é ruim,postMessage('foo', [messageChannel.port2])
é bom.Crie uma página proxy no mesmo host que o iniciador. A página proxy tem um
iframe
com a fonte definida para a página remota. PostMessage de origem cruzada agora funcionará no IE10 assim:window.parent.postMessage
para passar dados para a página proxy. Como usa iframes, é compatível com o IE10window.opener.postMessage
para passar dados de volta à página inicial. Como se trata do mesmo domínio - não há problemas de origem cruzada. Ele também pode chamar diretamente métodos globais na página inicial se você não quiser usar postMessage - por exemplo.window.opener.someMethod(data)
Amostra (todos os URLs são fictícios)
Página inicial em
http://example.com/launcher.htm
Página proxy em
http://example.com/proxy.htm
Página remota em
http://example.net/remote.htm
fonte
== SOLUÇÃO DE TRABALHO EM 2020 sem iframe ==
Com base no answer by tangle, tive sucesso no IE11 [e emulei o modo IE10] usando o seguinte snippet:
Então eu fui capaz de me comunicar usando uma pilha típica de postMessage, estou usando um mensageiro estático global em meu cenário (embora eu não ache que seja significativo, também estou anexando minha classe de mensageiro)
Não importa o quanto eu tentei, não consegui fazer as coisas funcionarem no IE9 e IE8
Minha configuração onde está funcionando:
versão do IE: 11.0.10240.16590, versões de atualização: 11.0.25 (KB3100773)
fonte
Com base nas respostas de LyphTEC e Akrikos, outra solução alternativa é criar um
<iframe>
dentro de uma janela pop-up em branco, o que evita a necessidade de uma página proxy separada, já que o pop-up em branco tem a mesma origem de seu abridor.Página inicial em
http://example.com/launcher.htm
Página remota em
http://example.net/remote.htm
Não tenho certeza de como isso é frágil, mas está funcionando no IE 11 e Firefox 40.0.3.
fonte
<iframe>
direcionar) no IE 11 (11.0.9600.18036
versões de atualização11.0.23 (KB3087038)
). Possivelmente, a atualização de segurança recente ( KB3087038 ) está implicada.No momento, (02-09-2014), sua melhor aposta é usar um quadro de proxy, conforme observado na postagem do blog do msdn que detalha uma solução alternativa para esse problema: https://blogs.msdn.microsoft.com/ieinternals/2009 / 09/15 / html5-deployment-issues-in-ie8-and-later /
Aqui está o exemplo de trabalho: http://www.debugtheweb.com/test/xdm/origin/
Você precisa configurar um quadro de proxy em sua página que tenha a mesma origem do pop-up. Envie informações do pop-up para o quadro de proxy usando
window.opener.frames[0]
. Em seguida, use postMessage do quadro de proxy para a página principal.fonte
Esta solução envolve adicionar o site aos sites confiáveis do Internet Explorer e não aos sites da intranet local. Testei essa solução no Windows 10 / IE 11.0.10240.16384, Windows 10 / Microsoft Edge 20.10240.16384.0 e Windows 7 SP1 / IE 10.0.9200.17148. A página não deve ser incluída na Zona da Intranet .
Portanto, abra a configuração do Internet Explorer (Ferramentas> Opções da Internet> Segurança> Sites confiáveis> Sites) e adicione a página, aqui eu uso * para corresponder a todos os subdomínios. Certifique-se de que a página não esteja listada nos sites da intranet local (Ferramentas> Opções da Internet> Segurança> Intranet local> Sites> Avançado). Reinicie seu navegador e teste novamente.
No Windows 10 / Microsoft Edge você encontrará essa configuração em Painel de Controle> Opções da Internet.
ATUALIZAR
Se isso não funcionar, você pode tentar redefinir todas as suas configurações em Ferramentas> Opções da Internet> Configurações avançadas> Redefinir as configurações do Internet Explorer e depois Redefinir: use com cuidado ! Em seguida, você precisará reinicializar o sistema. Depois disso, adicione os sites aos sites confiáveis.
Veja em qual zona sua página está em Arquivo> Propriedades ou clicando com o botão direito.
ATUALIZAR
Estou em uma intranet corporativa e às vezes funciona e às vezes não (configuração automática? Comecei até a culpar o proxy corporativo). No final, usei essa solução https://stackoverflow.com/a/36630058/2692914 .
fonte
Este Q é antigo, mas é para isso que serve o easyXDM, talvez verifique-o como uma alternativa potencial ao detectar um navegador que não oferece suporte a html5 .postMessage:
https://easyxdm.net/
Ele usa VBObject wrapper e todos os tipos de coisas que você nunca gostaria de ter que lidar para enviar mensagens de domínio cruzado entre janelas ou frames onde window.postMessage falha para várias versões do IE (e talvez edge, ainda não tenho 100% de certeza sobre o suporte O Edge, mas parece que também precisa de uma solução alternativa para .postMessage)
fonte
MessageChannel não funciona para o IE 9-11 entre janelas / guias, pois depende de postMessage, que ainda não funciona neste cenário. A "melhor" solução alternativa é chamar uma função por meio de window.opener (ou seja, window.opener.somefunction ("somedata")).
Solução alternativa em mais detalhes aqui
fonte