Gibt es einen guten Grund, warum mehr Entwickler keine benutzerdefinierten jQuery-Ereignisse benennen?

9

jQuery-Ereignisse verfügen über ein eingebautes Namespace-Konzept, mit dem einfach nur die Ereignisse, die Sie hinzugefügt haben, getrennt werden können.

Diese Namespaces verhindern jedoch keine Kollisionen, wenn verschiedene Plugins dasselbe grundlegende Ereignis auslösen. Wenn beispielsweise Plugin A das Ereignis hide.foo auslöst und Plugin B das Ereignis hide.bar auslöst, wird jeder Handler, der auf das Ereignis hide wartet, zweimal aufgerufen, selbst mit den Namespaces.

Dies kann zu Problemen führen, wenn Plugins übermäßig generische Namen wie open , close , show , hide , start , end usw. auslösen, aber so viele Plugins da draußen (sogar solche aus großen Bibliotheken wie jQueryUI und bootstrap) diese generischen Ereignisse ohne einen Namespace der zweiten Ebene auszulösen.

Also hier ist meine Frage. Es scheint, als wäre eine zweite Ebene des Namespacings sinnvoll, um sowohl Ihre Ereignisse von anderen Plugins als auch von Standard-DOM-Ereignissen zu unterscheiden. Die Konvention könnte etwas wie namespace:eventName oder namespace:eventName.secondaryNamespace sein, wenn die standardmäßige jQuery Punktnotation verwendet wird.

Aber niemand scheint das zu tun, also frage ich mich, ob es einen zwingenden Grund gibt, es nicht zu tun. Weiß jemand das?

Aktualisierung:

Um ein konkreteres Beispiel zu geben, nehme ich an, dass ich Plugin A verwende, das die Ereignisse show und hide in QuickInfos auslöst, wenn der Benutzer über einem bestimmten Text schwebt. Da sich Ereignisse verbreiten und mein DOM sich ständig ändert, entscheide ich mich, meinen Ereignis-Listener an das document -Element zu binden, um die Ereignisse show und hide von allen Tooltips abzufangen.

Dann, ein paar Wochen später, füge ich Plugin B zu meiner App hinzu, das auch das hide -Ereignis auslöst, nachdem der Benutzer eine Warnmeldung ablehnt. Jetzt wird mein Tooltip-Code plötzlich mehr aufgerufen, als ich es möchte, weil sowohl die Tooltip- als auch die Alarm-Message-Plugins Ereignisse mit demselben Namen auslösen.

    
Philip Walton 12.11.2012, 18:58
quelle

1 Antwort

1

Es stellt sich heraus, dass beide Bibliotheken, die ich speziell erwähnt habe (jQueryUI und Bootstrap), entweder ihre benutzerdefinierten Ereignisse voranstellen oder planen, sie voranzustellen.

Hier ist, was jQueryUI in seiner benutzerdefinierten _trigger Methode macht:

%Vor%

Damit können Sie Ihr eigenes Präfix über this.widgetEventPrefix für jedes Widget oder Widget definieren, das Sie mit der Widget Factory erstellen.

Bootstrap hat noch kein Präfix implementiert, plant es aber in der nächsten Hauptversion (3.0.0).

Hier ist, was @fat in diesem Github-Problem gesagt hat:

  

In Zukunft werden wir wahrscheinlich alles mit Bootstrap namespace nennen   (Datenattraktionen und Ereignisse - aber das wird eine 3.0.0 Sache sein, weil es so ist   bricht Abwärtskompatibilität)

Und hier ist sein Tweet als Antwort auf meine Frage dazu.

-

Was mich betrifft, habe ich beschlossen, meine benutzerdefinierten Ereignisse mit einem der folgenden Muster (abhängig vom Kontext) zu benennen, um mögliche Konflikte mit anderen Bibliotheken in der Zukunft zu vermeiden.

%Vor%     
Philip Walton 13.11.2012, 22:33
quelle