PostMessage mit mehreren Funktionen oder benutzerdefinierte callbacks
Bisher habe ich nur tutorials für postmessage, wo ein Fenster sendet eine einzelne Art von Nachricht, und die anderen Fenster interpretiert die Nachricht nur in einem einzigen Weg.
Was ist, wenn ich will, um viele verschiedene Arten von Wechselwirkungen zwischen windows, kann postmessage Griff?
Ist, geht gegen den Strich, was postmessage machen soll?
Was zum Beispiel, wenn ich wollte in der Lage sein zu senden, benutzerdefinierte callbacks hin und her, etc?
InformationsquelleAutor der Frage johnnietheblack | 2011-12-12
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es ein paar Möglichkeiten, um pass-a multi-part message auf einem
postMessage
handler. Die erste (und weniger "sauber") ist zu verwenden ein Trennzeichen, dann übergeben Sie Ihre Daten über einen string.Sagen wir, wir wollten, passieren Sie eine Benutzer-ID, eine Aktion, und der Benutzer-name. Der string würde wie folgt Aussehen:
54|do_logout|chris
Innerhalb der
postMessage
- handler, der die Daten übergeben werden könnensplit
(docs) auf der|
Charakter, dann wird jedes segment der Nachricht kann bei Bedarf eingesetzt werden.Anderen Weg, statt manuell anlegen/aufteilen einer Zeichenfolge, ist die Verwendung von JSON (docs) zum konvertieren eines Objekts in eine Zeichenkette auf der einen Seite, und verwenden Sie JSON zu konvertieren zurück zu einem Objekt in der Prozedur.
... dann in der Prozedur:
Sicher sein, zu testen, obwohl, wie die
JSON
- Objekt ist nicht bereitgestellt, die auf allen user-agents, vor allem ältere. Es gibt viele (viele, viele Drittanbieter-Bibliotheken gibt, um shim JSON-Unterstützung, so lassen Sie sich nicht das fehlen vollständiger Annahme erschrecken Sie Weg - JSON ist definitiv eine sichere "moving forward" - standard.Wäre es nicht schöner, wenn wir könnten nur passieren, dass das Objekt auf Anhieb? Gut, starrte in Firefox 6 (Quelle), die Daten, die Sie übergeben, um eine postmessage-handler kann ein Objekt sein. Das Objekt wird serialisiert werden, so gibt es einige Bedenken auf, die vor, aber:
Ein bisschen schöner, gell? Leider sind die aktuellen Versionen von Internet Explorer wird nur mit strings. Ich war nicht in der Lage zu finden, jede Diskussion über die künftigen Pläne in Bezug auf
postMessage
für den IE 10. Des weiteren gibt es einen bekannten bug in IE 8/9, brichtpostMessage
für etwas anderes als frames. (Quelle).Immer in einem bestimmten Aspekt Ihrer Frage - Rückrufe. Es sei denn, Sie sind in der Lage, übergeben, die callback-Funktion name, gibt es nicht eine Methode zum übergeben einer Funktion; keine anonymen Funktionen für Sie. Dies ist in Bezug auf die Art und Weise die Daten tatsächlich an den handler. In der Praxis gibt es "nicht" - Unterstützung für Objekte wie Daten, hinter die kulissen der browser wendet Ihr das übergebene Objekt in einen string (Serialisierung).
Alles, was gesagt, dann sollten Sie verstehen, dass Sie ein Objekt ist genau das gleiche wie mit JSON zu
stringify
ein Objekt vor der übergabe, nur im ersten Fall die browser-eigene Serialisierung (und die anschließende unserialization), während bei den letzteren Weg es ist bis zu Ihnen, um serialize/unserialize.Den take-away-Punkte hier:
Dokumentation und Referenzen
window.postMessage
: https://developer.mozilla.org/en/DOM/window.postMessageString.split
: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/String/splitJSON.stringify
: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/JSON/stringifyJSON.parse
: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/JSON/parseInformationsquelleAutor der Antwort Chris Baker
Rückrufe mit postMessage: sehr gut möglich und sehr nützlich
Gibt es ein nettes plugin, das ich gefunden habe, auf npm als "Silber-Kugel". Es tut postMessage mit callbacks und Verwendungen, von eventEmitter bestimmte Ereignisse als gut. Seine sehr schön.
Aber um dies zu implementieren, ich würde so etwas tun...
Haben Sie, um dies zu tun:
Hier ist eine sehr einfache demonstration:
Nehme ich das Konzept ein bisschen weiter und verwenden Sie eine message-handler-lookup, wo die Nachricht den gewünschten handler-Funktion namens zu wecken und eine Botschaft zu. Der message-handler callback sowie, wenn Sie abgeschlossen feuert den Rückruf. Der Rückruf hat gerade die einfache Logik der Aufruf der nativen post-Nachricht erneut senden zurück seiner erhaltenen callback-id.
Also der letzten Zeile des Codes für die Nachricht event-handling wäre:
die asynchrone Sachen passieren.
InformationsquelleAutor der Antwort Jason Sebring
Einen ziemlich einfachen Weg, um trigger Rückrufe, ohne jede eigentliche code wäre:
Ziel
Quelle
InformationsquelleAutor der Antwort Jacob R