Ich suche nach Anregungen, wie man benutzerdefiniertes Eventhandling in jquery am besten implementiert. Ich weiß, wie man Ereignisse aus den dom-Elementen wie 'click' usw. verbindet, aber ich baue eine winzige Javascript-Bibliothek / ein Plugin, um einige Vorschaufunktionen zu handhaben.
Ich habe ein Skript ausgeführt, um Text in einem dom-Element anhand einer Reihe von Regeln und Daten- / Benutzereingaben zu aktualisieren, aber jetzt muss derselbe Text in anderen Elementen angezeigt werden, von denen dieses Skript möglicherweise nichts wissen kann. Was ich brauche, ist ein gutes Muster, um dieses Skript zu beobachten, das den benötigten Text erzeugt.
Wie mache ich das? Habe ich einige in jquery integrierte Funktionen übersehen, um Benutzerereignisse auszulösen / zu verarbeiten, oder benötige ich dafür ein jquery-Plugin? Was ist Ihrer Meinung nach der beste Weg / das beste Plugin, um damit umzugehen?
Antworten:
Schau dir das an:
(Nachdruck von der abgelaufenen Blog-Seite http://jamiethompson.co.uk/web/2008/06/17/publish-subscribe-with-jquery/ basierend auf der archivierten Version unter http://web.archive.org/web /20130120010146/http://jamiethompson.co.uk/web/2008/06/17/publish-subscribe-with-jquery/ )
Veröffentlichen / Abonnieren mit jQuery
17. Juni 2008
Um eine jQuery-Benutzeroberfläche zu schreiben, die in die Offline-Funktionalität von Google Gears integriert ist, habe ich mit Code gespielt, um mithilfe von jQuery den Netzwerkverbindungsstatus abzufragen.
Das Netzwerkerkennungsobjekt
Die Grundvoraussetzung ist sehr einfach. Wir erstellen eine Instanz eines Netzwerkerkennungsobjekts, das in regelmäßigen Abständen eine URL abfragt. Sollten diese HTTP-Anforderungen fehlschlagen, können wir davon ausgehen, dass die Netzwerkverbindung unterbrochen wurde oder der Server zum gegenwärtigen Zeitpunkt einfach nicht erreichbar ist.
Sie können die Demo hier ansehen. Stellen Sie Ihren Browser so ein, dass er offline arbeitet und sehen Sie, was passiert. Nein, es ist nicht sehr aufregend.
Auslösen und binden
Was jedoch aufregend ist (oder zumindest was mich begeistert), ist die Methode, mit der der Status über die Anwendung weitergeleitet wird. Ich bin auf eine weitgehend unbekannte Methode zur Implementierung eines Pub / Sub-Systems mit den Trigger- und Bind-Methoden von jQuery gestoßen.
Der Demo-Code ist stumpfer als nötig. Das Netzwerkerkennungsobjekt veröffentlicht Statusereignisse in dem Dokument, das sie aktiv abhört, und veröffentlicht wiederum Benachrichtigungsereignisse für alle Abonnenten (dazu später mehr). Der Grund dafür ist, dass in einer realen Anwendung wahrscheinlich mehr Logik gesteuert wird, wann und wie die Benachrichtigungsereignisse veröffentlicht werden.
Aufgrund des DOM-zentrierten Ansatzes von jQuery werden Ereignisse in (ausgelöst auf) DOM-Elementen veröffentlicht. Dies kann das Fenster- oder Dokumentobjekt für allgemeine Ereignisse sein oder Sie können ein jQuery-Objekt mithilfe eines Selektors generieren. Der Ansatz, den ich mit der Demo gewählt habe, besteht darin, einen fast namenlosen Ansatz für die Definition von Abonnenten zu erstellen.
DOM-Elemente, die Abonnenten sein sollen, werden einfach mit "Abonnent" und "Netzwerkerkennung" klassifiziert. Wir können dann Ereignisse nur für diese Elemente veröffentlichen (von denen es nur eines in der Demo gibt), indem wir ein Benachrichtigungsereignis für auslösen
$(“.subscriber.networkDetection”)
Dem
#notifier
Div, das Teil der.subscriber.networkDetection
Gruppe von Abonnenten ist, ist dann eine anonyme Funktion zugeordnet, die effektiv als Zuhörer fungiert.Hier bitteschön. Es ist alles ziemlich ausführlich und mein Beispiel ist überhaupt nicht aufregend. Es zeigt auch nichts Interessantes, was Sie mit diesen Methoden tun könnten, aber wenn jemand überhaupt daran interessiert ist, die Quelle zu durchsuchen, fühlen Sie sich frei. Der gesamte Code befindet sich im Kopf der Demoseite
quelle
Der in der akzeptierten Antwort angegebene Link zeigt eine gute Möglichkeit, das Pub / Sub-System mit jQuery zu implementieren , aber ich fand den Code etwas schwierig zu lesen. Hier ist meine vereinfachte Version des Codes:
http://jsfiddle.net/tFw89/5/
quelle
n
Reihe von Argumenten erhalten.var eventData = [].slice.call(arguments).splice(1)
Ich denke schon ... es ist möglich, benutzerdefinierte Ereignisse zu "binden", wie (von: http://docs.jquery.com/Events/bind#typedatafn ):
quelle
myCustomEvent
Wenn die Bindung oben angehoben wird, wird ein Listener hinzugefügt.Ich hatte eine ähnliche Frage, suchte aber tatsächlich nach einer anderen Antwort. Ich möchte ein benutzerdefiniertes Ereignis erstellen. Zum Beispiel, anstatt immer Folgendes zu sagen:
Ich möchte es so abkürzen:
Trigger and Bind erzählen nicht die ganze Geschichte - dies ist ein JQuery-Plugin. http://docs.jquery.com/Plugins/Authoring
Die Funktion "enterKey" wird als Eigenschaft an jQuery.fn angehängt - dies ist der erforderliche Code:
http://jsfiddle.net/b9chris/CkvuJ/4/
Das Schöne daran ist, dass Sie Tastatureingaben bei Link-Listenern wie:
Änderungen: Aktualisiert, um den richtigen
this
Kontext ordnungsgemäß an den Handler zu übergeben und einen beliebigen Rückgabewert vom Handler an jQuery zurückzugeben (z. B. für den Fall, dass Sie das Ereignis abbrechen und sprudeln möchten). Aktualisiert, um ein ordnungsgemäßes jQuery-Ereignisobjekt an Handler zu übergeben, einschließlich Schlüsselcode und Möglichkeit zum Abbrechen von Ereignissen.Alte jsfiddle: http://jsfiddle.net/b9chris/VwEb9/24/
quelle
scroll
, was sich nicht verbreitet. Ich denke, anstatt die Zuhörer fest auf den Körperon
codieren zu lassen , brauche ich die Elemente, an die das Ereignis gebunden ist, um das Ereignis selbst auszulösen.Es ist ein alter Beitrag, aber ich werde versuchen, ihn mit neuen Informationen zu aktualisieren.
Um benutzerdefinierte Ereignisse zu verwenden, müssen Sie es an ein DOM-Element binden und auslösen. Also musst du verwenden
und
Der Code sieht folgendermaßen aus:
Schöne Erklärungen finden Sie hier und hier . Warum genau kann das nützlich sein? Ich habe in dieser hervorragenden Erklärung des Twitter-Ingenieurs herausgefunden, wie man es verwendet .
PS In einfachem Javascript können Sie dies mit dem neuen CustomEvent tun , aber Vorsicht vor IE- und Safari-Problemen.
quelle
So verfasse ich benutzerdefinierte Ereignisse:
Zugegeben, Sie könnten es einfach tun
Aber die Art und Weise, wie ich geschrieben habe, ermöglicht es Ihnen zu erkennen, ob der Benutzer die Standardeinstellung verhindert hat oder nicht
Auf diese Weise können Sie die Anforderung Ihres Endbenutzers abhören, die Verarbeitung eines bestimmten Ereignisses zu beenden, z. B. wenn Sie auf ein Schaltflächenelement in einem Formular klicken, aber nicht möchten, dass das Formular im Fehlerfall veröffentlicht wird.
Normalerweise höre ich dann solche Ereignisse
Noch einmal, Sie könnten es einfach tun
Aber ich fand das immer etwas unsicher, besonders wenn Sie in einem Team arbeiten.
An folgendem ist nichts auszusetzen:
Nehmen Sie jedoch an, dass ich dieses Ereignis aus irgendeinem Grund aufheben muss (stellen Sie sich eine deaktivierte Schaltfläche vor). Ich müsste dann tun
Dadurch werden alle
eventname
Ereignisse aus entfernt$(element)
. Sie können nicht wissen, ob jemand in Zukunft auch ein Ereignis an dieses Element binden wird, und Sie würden dieses Ereignis auch versehentlich aufhebenDer sichere Weg, dies zu vermeiden, besteht darin, Ihre Ereignisse mit einem Namespace zu versehen
Zuletzt haben Sie vielleicht bemerkt, dass die erste Zeile war
Ich persönlich binde immer ein Ereignis ab, bevor ich es binde, um sicherzustellen, dass derselbe Ereignishandler nie mehrmals aufgerufen wird (stellen Sie sich vor, dies war der Senden-Button auf einem Zahlungsformular und das Ereignis wurde fünfmal gebunden).
quelle