Wie werden benutzerdefinierte Broadcast-Ereignisse in JavaScript (oder jQuery) implementiert?

8

Ich möchte ein benutzerdefiniertes Ereignis implementieren, das "gesendet" werden kann, anstatt es an bestimmte Ziele zu senden. Nur diejenigen Elemente, die sich selbst als Listener für solche Ereignisse registriert haben, erhalten sie.

Was ich im Sinn habe, würde wie folgt aussehen.

Erstens, an verschiedenen Stellen des Codes, würde es Anweisungen des Formulars geben

%Vor%

Ich verwende den Begriff signal als Abkürzung für "broadcast event". Im obigen Ausdruck registriert sich some_subscriber selbst als Listener eines Typs ('some_signal' genannt) solcher Signale, indem er einen Handler dafür bereitstellt.

An anderer Stelle im Code würde es Anweisungen des Formulars geben

%Vor%

Wenn Anweisungen wie diese ausgeführt werden, wird ein neues Ereignis generiert und " broadcast ". Damit meine ich, dass der Code, der die Methode broadcast aufruft, keine direkten Informationen über die Listener für das ausgegebene Signal hat.

Ich habe eine Skizze dieser Idee in diesem jsFiddle implementiert, hauptsächlich um zu illustrieren, was ich oben in Worten beschrieben habe < sup> 1 . (Es ist sicherlich nicht Produktionsklasse, und ich bin nicht besonders zuversichtlich, dass es so gemacht werden könnte.)

Die Schlüsselelemente dieser Implementierung sind die folgenden. Erstens, Publisher-Objekte verfolgen ihre Abonnenten nicht , wie in der Implementierung einer Factory-Methode für einen solchen Publisher zu sehen ist, wie unten dargestellt:

%Vor%

Dieses Publisher-Objekt macht nur zwei Elemente verfügbar: die Art der übertragenen Signale (in signal_types ) und eine ping -Methode. Wenn die Methode ping aufgerufen wird, antwortet der Herausgeber durch Senden ein Signal:

%Vor%

Die ultimativen Empfänger dieser Sendung sind in diesem Code nicht zu sehen .

Zweitens registrieren sich Teilnehmer an anderer Stelle im Code selbst als Zuhörer dieser Broadcast-Signale, so wie

%Vor%

Hinweis: Es ist im Grunde unmöglich, die Gründe für dieses Schema anhand eines kleinen und realistischen Beispiels zu veranschaulichen. Der Grund dafür ist, dass die Stärke dieses Schemas darin besteht, dass es eine sehr lockere Kopplung zwischen dem Herausgebercode und dem Teilnehmercode unterstützt, und dies ist ein Merkmal, das in einem kleinen Beispiel niemals notwendig ist. Im Gegensatz dazu wirkt Code, der eine solche lose Kopplung implementiert, in einem kleinen Beispiel unweigerlich als unnötig komplex. Es ist daher wichtig zu bedenken, dass diese scheinbare Überkomplexität ein Artefakt des Kontextes ist. Lose Kopplung ist in größeren Projekten sehr nützlich. Insbesondere ist die lose Kopplung über ein Publisher / Subscriber-Muster eine der wesentlichen Eigenschaften von MVC.

  

Meine Frage ist: Gibt es einen besseren (oder zumindest mehr Standard) Weg, um diesen Effekt des "Sendens" von benutzerdefinierten Ereignissen zu erreichen?

(Ich bin sowohl an jQuery-basierten als auch an reinen JS-Antworten interessiert.)

1 Eine frühere, unglückselige Version dieses Posts stieß auf fast allgemeines Unverständnis und (natürlich) das allzu typische Down-Voting. Mit einer Ausnahme, all den Kommentaren, die ich bekam, wurden die genauen Prämissen des Beitrags in Frage gestellt, und man stellte mein Verständnis der Grundlagen ereignisgesteuerten Programmierens usw. direkt in Frage. Ich hoffe, dass ich ein funktionierendes Beispiel vorstelle es wird nicht so völlig unvorstellbar wirken, als wenn ich es nur mit Worten beschrieben hätte. Glücklicherweise hat mich der eine hilfreiche Kommentar, den ich zu diesem früheren Beitrag erhalten habe, über die Funktion jQuery.Callbacks informiert. Dies war in der Tat ein nützlicher Tipp; Die im Post erwähnte Skizzenimplementierung basiert auf jQuery.Callbacks .

    
kjo 04.07.2015, 06:01
quelle

2 Antworten

10

Alles klar.

Ich denke also, dass Sie die systemeigenen Methoden dispatchEvent und addEventListener verwenden und als document verwenden können einziges Element für das Publizieren und Abonnieren dieser Ereignisse. Etwas wie:

%Vor%

Und um browserübergreifend zu arbeiten, könnten Sie:

%Vor%

Sie können mehr zum Thema hier und hier . Hoffe, das hilft.

    
Tahir Ahmed 04.07.2015, 16:13
quelle
1
  

Meine Frage ist: Gibt es einen besseren (oder zumindest Standard) Weg?   Erreichen Sie diesen Effekt des "Broadcasting" von benutzerdefinierten Ereignissen?

Nein, es gibt keine Standardmethode, um Publish / Subscribe in Javascript durchzuführen. Es ist nicht direkt in die Sprache oder den Browser eingebaut und es gibt keine bekannten Plattform-Standards dafür.

Sie haben mehrere Möglichkeiten (von denen Ihnen die meisten bewusst sind), um Ihr eigenes System zusammenzustellen.

Sie könnten ein bestimmtes Objekt wie das document -Objekt oder das window -Objekt oder ein neues Objekt auswählen und jQuerys .on() und .trigger() mit diesem Objekt als zentrales Clearinghaus verwenden, um ein Objekt zusammenzufassen Publish / Subscribe-ähnliches Modell. Sie könnten sogar die Existenz dieses Objekts vor Ihrer tatsächlichen Verwendung verbergen, indem Sie es einfach in einige nützliche Funktionen einprogrammieren.

Oder, wie Sie bereits wissen, könnten Sie die Funktionalität jQuery.Callbacks verwenden. Es gibt sogar einen Beispielcode für Publish / Subscribe im jQuery-Dokument .

Oder Sie finden eine Bibliothek eines Drittanbieters, die ein etwas traditionelles Publish / Subscribe-Modell anbietet.

Oder Sie können Ihre eigenen von Grund auf neu erstellen, was wirklich nur eine Liste von Callback-Funktionen enthält, die einem bestimmten Ereignis zugeordnet sind. Wenn dieses Ereignis ausgelöst wird, können Sie jede Callback-Funktion aufrufen.

    
jfriend00 04.07.2015 06:38
quelle