jQuery - Warum ist "live" ineffizient? Und wie können wir das messen?

8

Warum sagen Programmierer, dass "live" ineffizient ist?

  1. Was ist die Alternative? Methoden zum Replizieren dieser Funktion das sind effizienter?
  2. Wie messen wir den Einfluss dessen, wie sehr es die Dinge verlangsamt?
ming yeow 11.05.2010, 22:27
quelle

3 Antworten

6

Ich nehme an, dass es ineffizient ist, weil der Handler auf den Wurzelknoten gesetzt wird und auf Blasenbildung angewiesen ist, um das Ereignis abzufangen und den richtigen Handler auszuführen.

Eine Alternative wäre, Ihren Handler einfach mit bind zu versehen, wenn sie erstellt und dem DOM hinzugefügt werden.

Eine andere Alternative besteht darin, einen einzelnen Handler an einen Container zu binden und Ihre Ereignisse dazu zu bringen. Dies kann nützlich sein, wenn Sie viele identische Elemente zu einem Container hinzugefügt haben.

%Vor%

Binden Sie einen Klick-Handler an #myContainer statt an jeden .myElement .

%Vor%

Ich stelle fest, dass dies unter den gleichen Ineffizienzen wie .live() leiden kann, aber es sollte besser sein, da es mehr lokalisiert ist. Neue .myElement hinzugefügte Elemente funktionieren automatisch.

BEARBEITEN:

Laut den Dokumenten : Ab jQuery 1.4 kann Event-Bubbling optional bei einem DOM-Element "context" anhalten .

Dies scheint eine ähnliche Wirkung wie die zuletzt genannte Methode zu erzeugen.

BEARBEITEN:

Wie von Nick Craver vorgeschlagen, kann jQuerys .delegate() Methode einen ähnlichen Effekt sauberer erzeugen.

Beispiel mit freundlicher Genehmigung von Nick:

%Vor%     
user113716 11.05.2010, 22:43
quelle
1

live() wird möglicherweise nur dann als ineffizient betrachtet, wenn:

  1. Es gibt eine kleine Anzahl von Elementen, die an ein Ereignis gebunden werden sollen (& lt; 5, sagen wir mal).
  2. Die Anzahl dieser Zielelemente bleibt unverändert.

Wenn Ihr Anwendungsfall die obigen Kriterien erfüllt (insbesondere # 2), sollten Sie sich direkt an die Elemente binden und live() vermeiden.

Ein Beispiel für das Benchmarking der Leistung von live() , das Sie ausprobieren können, ist das Profiling eines Code-Fragments, das live() verwendet, um einen click -Handler an ein Element zu binden und ein weiteres Code-Fragment zu profilieren, das click() verwendet. an dasselbe Element binden.

Ich bin mir nicht sicher, welches Endergebnis du haben wirst, aber ich bin mir sicher, dass es interessant sein wird.

    
ground5hark 11.05.2010 22:51
quelle
1

Wie @patrick es vorschlägt, kann es ineffizient sein, da es die Verarbeitung für alle Ereignisse im Dokument erfordert, unabhängig davon, ob die Blase Ihr Element erreicht oder nicht.

Hier kann der Delegierte helfen, da er genauso funktioniert wie Live, aber nur einen kleineren Anteil davon auswirkt des Dokuments, indem es auf ein gemeinsames Elternteil beschränkt wird

(mit seinem Beispiel)

%Vor%     
Simon 11.05.2010 22:52
quelle

Tags und Links