Ich versuche, ein triviales postMessage
Beispiel zum Laufen zu bringen ...
- in IE10
- zwischen Windows / Tabs (vs. Iframes)
- über Ursprünge hinweg
Entfernen Sie eine dieser Bedingungen, und alles funktioniert einwandfrei :-)
Soweit ich das postMessage
beurteilen kann, scheint das Zwischenfenster in IE10 nur zu funktionieren, wenn beide Fenster einen gemeinsamen Ursprung haben. (Tatsächlich - und seltsamerweise - ist das Verhalten etwas freizügiger: Zwei verschiedene Ursprünge, die sich einen Host teilen, scheinen ebenfalls zu funktionieren.)
Ist das ein dokumentierter Fehler? Irgendwelche Problemumgehungen oder andere Ratschläge?
(Hinweis: Diese Frage berührt die Probleme, aber ihre Antwort bezieht sich auf IE8 und IE9 - nicht auf 10)
Weitere Details + Beispiel ...
Demo der Startseite
<!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>
ins Leben gerufen Seite Demo
<!DOCTYPE html>
<html>
<script>
window.opener.postMessage("Ahoy!", "*");
</script>
</html>
Dies funktioniert unter: http://jsbin.com/ahuzir/1 - da beide Seiten am selben Ursprung gehostet werden (jsbin.com). Verschieben Sie die zweite Seite jedoch an eine andere Stelle, und dies schlägt in IE10 fehl.
window.parent.postMessage
im IE verwenden.Antworten:
Ich habe mich geirrt, als ich diese Antwort ursprünglich gepostet habe: Sie funktioniert in IE10 nicht wirklich. Anscheinend haben die Leute dies aus anderen Gründen nützlich gefunden, also überlasse ich es der Nachwelt. Ursprüngliche Antwort unten:
Bemerkenswert: Der Link in dieser Antwort, den Sie mit Staaten verknüpft haben, die
postMessage
für separate Fenster in IE8 und IE9 nicht kreuzübergreifend sind, wurde jedoch auch 2009 geschrieben, bevor IE10 auf den Markt kam. Ich würde das also nicht als Hinweis darauf nehmen, dass es in IE10 behoben ist.Was
postMessage
sich http://caniuse.com/#feat=x-doc-messaging zeigt vor allem , dass es noch in IE10 gebrochen hat, die mit Ihrem Demo übereinstimmen scheint. Die caniuse Seite verweist auf diesen Artikel , der ein sehr relevantes Zitat enthält:Ihre beste
MessageChannel
Wahl ist also wahrscheinlich, einen basierten Codepfad zu haben und auf diesen zurückzugreifen,postMessage
wenn dieser nicht existiert. Sie erhalten keine IE8 / IE9-Unterstützung, aber zumindest funktioniert es mit IE10.Dokumente unter
MessageChannel
: http://msdn.microsoft.com/en-us/library/windows/apps/hh441303.aspxquelle
MessageChannel
funktionierenden Codepfad erstellen , der funktioniert? Sie müssen noch funktionierenpostMessage
, um den Port des Kanals zum anderen Fenster zu bringen.postMessage
mit der neuenMessageChannel
API funktioniert in neuen Fenstern und Ursprüngen. Die Arbeit ist etwas umständlich, denke ich, aber im Grunde:postMessage('foo', '*')
ist schlecht,postMessage('foo', [messageChannel.port2])
ist gut.Erstellen Sie eine Proxyseite auf demselben Host wie Launcher. Auf der Proxyseite ist eine
iframe
Quelle auf die Remote-Seite eingestellt. Ursprungsübergreifende postMessage funktioniert jetzt in IE10 wie folgt:window.parent.postMessage
, um Daten an die Proxy-Seite zu übergeben. Da dies Iframes verwendet, wird es von IE10 unterstütztwindow.opener.postMessage
, um Daten an die Startseite zurückzugeben. Da dies auf derselben Domain liegt, gibt es keine Probleme zwischen verschiedenen Ursprüngen. Es kann auch direkt globale Methoden auf der Startseite aufrufen, wenn Sie postMessage nicht verwenden möchten - z.window.opener.someMethod(data)
Beispiel (alle URLs sind fiktiv)
Launcher-Seite bei
http://example.com/launcher.htm
Proxy-Seite bei
http://example.com/proxy.htm
Remote-Seite bei
http://example.net/remote.htm
quelle
== ARBEITSLÖSUNG IM JAHR 2020 ohne iframe ==
Aufbauend auf der Antwort von Tangle hatte ich Erfolg in IE11 [und emulierte den IE10-Modus] mit folgendem Snippet:
Dann konnte ich mit einem typischen postMessage-Stack kommunizieren. In meinem Szenario verwende ich einen globalen statischen Messenger (obwohl ich nicht annehme, dass dies von Bedeutung ist, füge ich auch meine Messenger-Klasse hinzu).
Egal wie sehr ich es auch versuchte, ich war nicht in der Lage, Dinge auf IE9 und IE8 zum Laufen zu bringen
Meine Konfiguration, wo es funktioniert:
IE-Version: 11.0.10240.16590, Update-Versionen: 11.0.25 (KB3100773)
quelle
Aufbauend auf den Antworten von LyphTEC und Akrikos besteht eine weitere Problemumgehung darin, eine zu erstellen
<iframe>
ein leeres Popup-Fenster , wodurch die Notwendigkeit einer separaten Proxy-Seite vermieden wird, da das leere Popup denselben Ursprung wie sein Öffner hat.Launcher-Seite bei
http://example.com/launcher.htm
Remote-Seite bei
http://example.net/remote.htm
Ich bin nicht sicher, wie fragil dies ist, aber es funktioniert in IE 11 und Firefox 40.0.3.
quelle
<iframe>
Richtung) in IE 11 (11.0.9600.18036
, Versionen aktualisieren11.0.23 (KB3087038)
). Möglicherweise ist das aktuelle Sicherheitsupdate ( KB3087038 ) betroffen .Im Moment (02.09.2014) verwenden Sie am besten einen Proxy-Frame, wie im msdn-Blogbeitrag angegeben, der eine Problemumgehung für dieses Problem enthält: https://blogs.msdn.microsoft.com/ieinternals/2009 / 09/15 / html5-Implementierungsprobleme-in-ie8-und-später /
Hier ist das Arbeitsbeispiel: http://www.debugtheweb.com/test/xdm/origin/
Sie müssen auf Ihrer Seite einen Proxy-Frame einrichten, der denselben Ursprung wie das Popup hat. Senden Sie Informationen aus dem Popup mit an den Proxy-Frame
window.opener.frames[0]
. Verwenden Sie dann postMessage vom Proxy-Frame zur Hauptseite.quelle
Bei dieser Lösung wird die Site zu den vertrauenswürdigen Sites von Internet Explore und nicht zu den lokalen Intranetsites hinzugefügt . Ich habe diese Lösung in Windows 10 / IE 11.0.10240.16384, Windows 10 / Microsoft Edge 20.10240.16384.0 und Windows 7 SP1 / IE 10.0.9200.17148 getestet. Die Seite darf nicht in die Intranetzone aufgenommen werden .
Öffnen Sie also die Internet Explorer-Konfiguration (Extras> Internetoptionen> Sicherheit> Vertrauenswürdige Sites> Sites) und fügen Sie die Seite hinzu. Hier verwende ich *, um alle Subdomains abzugleichen. Stellen Sie sicher, dass die Seite nicht in den lokalen Intranetsites aufgeführt ist (Extras> Internetoptionen> Sicherheit> Lokales Intranet> Sites> Erweitert). Starten Sie Ihren Browser neu und testen Sie erneut.
In Windows 10 / Microsoft Edge finden Sie diese Konfiguration unter Systemsteuerung> Internetoptionen.
AKTUALISIEREN
Wenn dies nicht funktioniert, können Sie versuchen, alle Einstellungen unter Extras> Internetoptionen> Erweiterte Einstellungen> Internet Explorer-Einstellungen zurücksetzen und dann zurücksetzen zurückzusetzen : Verwenden Sie diese Option mit Vorsicht ! Dann müssen Sie Ihr System neu starten. Fügen Sie danach die Sites zu den vertrauenswürdigen Sites hinzu.
Sehen Sie in Datei> Eigenschaften oder mit einem Rechtsklick, in welcher Zone sich Ihre Seite befindet.
AKTUALISIEREN
Ich bin in einem Unternehmens-Intranet und manchmal funktioniert es und manchmal nicht (automatische Konfiguration? Ich habe sogar angefangen, dem Unternehmens-Proxy die Schuld zu geben). Am Ende habe ich diese Lösung https://stackoverflow.com/a/36630058/2692914 verwendet .
quelle
Dieses Q ist alt, aber dafür ist easyXDM gedacht. Überprüfen Sie es möglicherweise als möglichen Fallback, wenn Sie einen Browser erkennen, der HTML5 nicht unterstützt .postMessage:
https://easyxdm.net/
Es verwendet den VBObject-Wrapper und alle Arten von Dingen, mit denen Sie sich niemals befassen müssten, um domänenübergreifende Nachrichten zwischen Fenstern oder Frames zu senden, bei denen window.postMessage für verschiedene IE-Versionen fehlschlägt (und Edge möglicherweise immer noch nicht 100% sicher ist, was die Unterstützung betrifft Edge hat, aber es scheint auch eine Problemumgehung für .postMessage zu benötigen.
quelle
MessageChannel funktioniert nicht für IE 9-11 zwischen Fenstern / Registerkarten, da es auf postMessage basiert, das in diesem Szenario immer noch fehlerhaft ist. Die "beste" Problemumgehung besteht darin, eine Funktion über window.opener (dh window.opener.somefunction ("somedata")) aufzurufen.
Problemumgehung hier detaillierter
quelle