Get to know MDN better
Dieser Inhalt wurde automatisch aus dem Englischen übersetzt, und kann Fehler enthalten. Erfahre mehr über dieses Experiment.
Diese Funktion ist gut etabliert und funktioniert auf vielen Geräten und in vielen Browserversionen. Sie ist seit September 2015 browserübergreifend verfügbar.
Hinweis: Diese Funktion ist in Web Workers verfügbar.
Die Channel Messaging API ermöglicht es, zwei separate Skripte, die in verschiedenen Browserkontexten ausgeführt werden und mit demselben Dokument verbunden sind (z.B. zwei <iframe>-Elemente, das Hauptdokument und ein einzelnes <iframe>, oder zwei Dokumente über einen SharedWorker), direkt zu kommunizieren. Nachrichten können durch Zweikanäle (oder Rohre) mit einem Port an jedem Ende zwischen ihnen ausgetauscht werden.
In diesem Artikel werden wir die Grundlagen der Nutzung dieser Technologie erläutern.
Kanalnachrichten sind vor allem nützlich in Fällen, in denen Sie eine soziale Seite haben, die Funktionen anderer Seiten über iframes in ihre Hauptschnittstelle einbettet, wie z.B. Spiele, Adressbücher oder ein Audioplayer mit personalisierten Musikwahlen. Wenn diese als eigenständige Einheiten agieren, ist alles in Ordnung, aber die Schwierigkeit entsteht, wenn Sie Interaktionen zwischen der Hauptseite und den <iframe>-Elementen oder zwischen verschiedenen <iframe>-Elementen wünschen. Zum Beispiel, was wäre, wenn Sie einen Kontakt vom Hauptseite zum Adressbuch hinzufügen, die Highscores Ihres Spiels zu Ihrem Hauptprofil hinzufügen oder neue Hintergrundmusikoptionen vom Audioplayer zum Spiel hinzufügen möchten? Solche Dinge sind mit herkömmlicher Webtechnologie nicht so einfach, da die Sicherheitsmodelle des Webs bedacht werden müssen. Sie müssen überlegen, ob die Ursprünge einander vertrauen und wie die Nachrichten übermittelt werden sollen.
Nachrichtenkanäle können dagegen einen sicheren Kanal bieten, der es ermöglicht, Daten zwischen verschiedenen Browserkontexten auszutauschen.
Hinweis: Für weitere Informationen und Ideen ist der Abschnitt Ports as the basis of an object-capability model on the Web der Spezifikation eine nützliche Lektüre.
Um Ihnen den Einstieg zu erleichtern, haben wir ein paar Demos auf GitHub veröffentlicht. Schauen Sie sich zuerst unsere Grunddemonstration zur Kanalnachricht (führen Sie es auch live aus) an, die eine wirklich einfache einmalige Nachrichtenübertragung zwischen einer Seite und einem eingebetteten <iframe> zeigt.
Zweitens sehen Sie sich unsere Multimessaging-Demo an (führen Sie diese live aus), die ein etwas komplexeres Setup zeigt, das mehrere Nachrichten zwischen der Hauptseite und einem IFrame senden kann.
In diesem Artikel konzentrieren wir uns auf das letztere Beispiel, das folgendermaßen aussieht:
Auf der Hauptseite der Demo haben wir ein einfaches Formular mit einer Texteingabe, um Nachrichten einzugeben, die an ein <iframe> gesendet werden sollen. Wir haben auch einen Absatz, den wir später verwenden, um Bestätigungsnachrichten anzuzeigen, die wir vom <iframe> zurückerhalten.
Wir beginnen damit, einen neuen Nachrichtenkanal mit dem MessageChannel()-Konstruktor zu erstellen.
Wenn das IFrame geladen ist, registrieren wir einen onclick-Handler für unseren Button und einen onmessage-Handler für MessageChannel.port1. Schließlich übertragen wir MessageChannel.port2 an das IFrame unter Verwendung der window.postMessage-Methode.
Lassen Sie uns die iframe.contentWindow.postMessage-Zeile genauer untersuchen. Sie nimmt drei Argumente:
Wenn unser Button geklickt wird, verhindern wir das normale Absenden des Formulars und senden dann den in unserer Texteingabe eingegebenen Wert an das IFrame über den MessageChannel.
In den <iframe>-Elementen haben wir folgendes JavaScript:
Wenn die anfängliche Nachricht von der Hauptseite über die window.postMessage-Methode empfangen wird, führen wir die initPort-Funktion aus. Diese speichert den übertragenen Port und registriert einen onmessage-Handler, der jedes Mal aufgerufen wird, wenn eine Nachricht durch unseren MessageChannel übermittelt wird.
Wenn eine Nachricht von der Hauptseite empfangen wird, erzeugen wir ein Listenelement und fügen es in die ungeordnete Liste ein, wobei wir das textContent des Listenelements auf den data-Attributwert des Ereignisses setzen (dies enthält die eigentliche Nachricht).
Als nächstes senden wir eine Bestätigungsnachricht zurück an die Hauptseite über den Nachrichtenkanal, indem wir MessagePort.postMessage auf MessageChannel.port2 aufrufen, das ursprünglich an das IFrame übertragen wurde.
Kehren wir zur Hauptseite zurück und betrachten die onmessage-Handler-Funktion.
Wenn eine Nachricht vom IFrame empfangen wird, die bestätigt, dass die ursprüngliche Nachricht erfolgreich empfangen wurde, gibt dies die Bestätigung an einen Absatz aus und leert die Texteingabe, um sie für die nächste zu sendende Nachricht bereit zu machen.
| HTML # message-channels |
| HTML # message-ports |
JavaScript aktivieren, um diese Browser-Kompatibilitätstabelle anzuzeigen.
JavaScript aktivieren, um diese Browser-Kompatibilitätstabelle anzuzeigen.
Der Bauplan für ein besseres Internet.
Besuche die gemeinnützige Muttergesellschaft der Mozilla Corporation, die Mozilla Foundation.
Teile dieses Inhalts sind ©1998–2026 von einzelnen mozilla.org-Mitwirkenden. Inhalte sind verfügbar unter einer Creative-Commons-Lizenz.