Ist in IE10 die postMessage-Nachricht mit Herkunftsort defekt?
Ich versuche, mich eine triviale postMessage
Beispiel die Arbeit...
- in IE10
- zwischen den Fenstern/tabs (vs. iframes)
- über Herkunft
Entfernen Sie eine dieser Bedingungen, und Dinge, die gut funktionieren 🙂
Aber soweit ich das beurteilen kann-zwischen-Fenster postMessage
nur scheint zu funktionieren im IE10, wenn beide windows-share Ursprungs. (Gut, in der Tat -- und unheimlich -- das Verhalten ist etwas offener als das: zwei verschiedene Ursprünge, die gemeinsam eine host scheint zu funktionieren, auch).
Ist dies ein dokumentierter bug? Irgendwelche workarounds oder andere Ratschläge?
(Hinweis: Diese Frage berührt die Fragen, aber seine Antwort ist über IE8 und IE9 -- nicht 10)
Mehr details + Beispiel...
launcher-Seite demo
<!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>
gestartet Seite demo
<!DOCTYPE html>
<html>
<script>
window.opener.postMessage("Ahoy!", "*");
</script>
</html>
Diese Werke an: http://jsbin.com/ahuzir/1 - denn beide Seiten werden gehostet bei der same-origin - (jsbin.com). Bewegen sich aber die zweite Seite, sonst nirgends, und es nicht in IE10.
InformationsquelleAutor der Frage Bosh | 2013-04-26
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich irrte, wenn ich das Zitat diese Antwort: es hat nicht wirklich funktioniert in IE10. Anscheinend Leute gefunden haben, nützlich für andere Gründe, also bin ich so dass es für die Nachwelt. Original-Antwort unten:
Erwähnenswert: der link in der Antwort, dass Sie im Zusammenhang mit Staaten, die
postMessage
ist nicht cross-origin für das separate Fenster in IE8 und IE9 -- aber es wurde auch geschrieben, im Jahr 2009, bevor IE10 kam. So würde ich nicht nehmen, dass als ein Hinweis darauf, dass es fest in IE10.Als für
postMessage
selbst, http://caniuse.com/#feat=x-doc-messaging vor allem zeigt, dass es immer noch gebrochen IE10, das scheint zu passen mit Ihrer demo. Die caniuse Seite links zu dieser Artikeldie enthält eine sehr wichtige Zitat:So Ihre beste Wette ist wahrscheinlich eine
MessageChannel
basierenden Code, und fallback aufpostMessage
wenn das nicht vorhanden ist. Es wird nicht erhalten Sie IE8/IE9-Unterstützung, aber zumindest werde mit dem IE10.Docs auf
MessageChannel
: http://msdn.microsoft.com/en-us/library/windows/apps/hh441303.aspxInformationsquelleAutor der Antwort ShZ
Erstellen Sie eine proxy-Seite auf dem gleichen host wie launcher. Proxy-Seite hat eine
iframe
mit Quelle legen Sie auf remote-Seite. Cross-origin-postMessage funktioniert jetzt auch im IE10 wie so:window.parent.postMessage
zum übergeben von Daten an die proxy-Seite. Wie diese verwendet iframes, es unterstützt IE10window.opener.postMessage
zum übergeben von Daten zurück zu launcher-Seite. Da dies auf dem gleichen Domäne - es gibt keine cross-origin-Probleme. Es kann auch direkt aufrufen Globale Methoden auf die launcher Seite, wenn Sie nicht möchten, verwenden Sie postMessage - zB.window.opener.someMethod(data)
Probe (alle URLs sind fictitous)
Launcher-Seite an
http://example.com/launcher.htm
Proxy-Seite an
http://example.com/proxy.htm
Remote-Seite an
http://example.net/remote.htm
InformationsquelleAutor der Antwort LyphTEC
Gebäude auf Antwort von tangle, ich hatte Erfolg im IE11 [und emuliert IE10-Modus] mit dem folgenden snippet:
Dann war ich in der Lage zu kommunizieren mit den typischen postMessage stack, ich verwende eine Globale statische messenger in meinem Szenario (alotough ich glaube nicht, dass es jeder signifficance, ich befestige meine messenger-Klasse)
Egal wie sehr ich es versuchte, ich war nicht in der Lage, um die Dinge funktionieren auf IE9 und IE8
Meine config, wo es funktioniert:
IE-version: 11.0.10240.16590 -, Update-Versionen: 11.0.25 (KB3100773)
InformationsquelleAutor der Antwort Bruno Laurinec
Genau jetzt (2014-09-02), Ihre beste Wette ist, um einen proxy zu verwenden frame wie bereits in der msdn-Blogbeitrag, dass die details, die ein workaround für dieses Problem: https://blogs.msdn.microsoft.com/ieinternals/2009/09/15/html5-implementation-issues-in-ie8-and-later/
Hier ist das Beispiel: http://www.debugtheweb.com/test/xdm/origin/
Müssen Sie zum einrichten einer proxy-frame auf Ihrer Seite, hat den gleichen Ursprung wie das popup. Senden Sie Informationen aus dem popup an den proxy-Rahmen mit
window.opener.frames[0]
. Dann verwenden Sie postMessage von der proxy-frame auf der Hauptseite.InformationsquelleAutor der Antwort Akrikos
Aufbauend auf den Antworten von LyphTEC und Akrikos, einen anderen work-around ist die Erstellung einer
<iframe>
in ein leeres popup-Fenster, die verhindert, die Notwendigkeit für eine separate proxy-Seite, da das leere popup hat den gleichen Ursprung wie seine opener.Launcher-Seite an
http://example.com/launcher.htm
Remote-Seite an
http://example.net/remote.htm
Ich bin mir nicht sicher, wie zerbrechlich das ist, aber es funktioniert im IE 11 und Firefox 40.0.3.
InformationsquelleAutor der Antwort tangle
Diese Lösung beinhaltet das hinzufügen der Website für Internet Explorer - Vertrauenswürdige Sites und nicht in die Lokalen Intranet sites. Getestet habe ich diese Lösung in Windows 10/IE 11.0.10240.16384, Windows 10/Microsoft Rand 20.10240.16384.0 und Windows 7 SP1/IE 10.0.9200.17148. Die Seite muss nicht in der Intranet-Zone.
So öffnen Sie den Internet Explorer-Konfiguration (Extras > Internetoptionen > Sicherheit > Vertrauenswürdige Sites > Websites), und fügen Sie die Seite hier benutze ich * mit allen subdomains. Stellen Sie sicher, dass die Seite nicht aufgelistet in der Lokalen intranet-sites (Extras > Internetoptionen > Sicherheit > Lokales Intranet > Standorte > Erweitert). Starten Sie Ihren browser neu und testen Sie erneut.
In Windows 10/Microsoft Rand finden Sie diese Konfiguration in der Systemsteuerung > Internetoptionen.
UPDATE
Wenn dies nicht funktioniert, könnten Sie versuchen, das zurücksetzen werden alle Einstellungen in Extras > Internetoptionen - > Erweiterte Einstellungen - > Internet Explorer-Einstellungen Zurücksetzen und dann Reset: verwenden Sie es mit Vorsicht! Dann müssen Sie Ihr system neu starten. Danach fügen Sie die Websites zu den Vertrauenswürdigen sites.
Sehen, in welcher zone Ihre Seite in Datei - > Eigenschaften oder die Verwendung der rechten klicken Sie auf.
UPDATE
Ich bin in einem Firmen-intranet und manchmal klappt es und manchmal nicht (automatische Konfiguration? Ich habe sogar begonnen, die Schuld der corporate proxy). Am Ende habe ich diese Lösung https://stackoverflow.com/a/36630058/2692914.
InformationsquelleAutor der Antwort lmiguelmh
MessageChannel-funktioniert nicht bei IE 9-11 zwischen den Fenstern/tabs, da es stützt sich auf postMessage, die ist immer noch kaputt in diesem Szenario. Die "beste" workaround ist der Aufruf einer Funktion durch das Fenster.opener (ie. Fenster.opener.somefunction("somedata") ).
Workaround im detail hier
InformationsquelleAutor der Antwort user1337489