2008-11-30 3 views
6

jQuery Selectors sind wundervoll, aber manchmal finde ich mich immer und immer wieder tippen, und es wird ein wenig nervig.Verwenden Sie immer jquery Selektoren oder cachen Sie sie in Variablen?

$('#mybutton').click(function() { 
    $('#message-box').doSomething(); 
    $('#message-box').doSomethingElse(); 
    $('#message-box').attr('something', 'something'); 
}); 

So oft wie ich meine Objekte in Variablen zwischenzuspeichern:

$('#mybutton').click(function() { 
    var msg = $('#message-box'); 
    msg.doSomething(); 
    msg.doSomethingElse(); 
    // you get the idea 
}); 

Gibt es irgendwelche Vor- oder Nachteile zwischen diesen beiden Mustern? Manchmal fühlt es sich an, als ob das Erstellen der Variablen zusätzliche Arbeit ist, aber manchmal spart es mir viel Tipparbeit. Gibt es Bedenken bezüglich der Speicherkapazität? Reinigen Selektoren nach der Verwendung gut, während meine schlechten Codierungsgewohnheiten dazu neigen, die vars im Speicher länger zu halten?

Das hält mich nicht in der Nacht auf, aber ich bin neugierig. Vielen Dank.

EDIT: Bitte siehe this question. Es fragt im Wesentlichen dasselbe, aber ich mag die Antwort besser.

Antwort

14

Sie sollten ketten sie:

$('#mybutton').click(function() { 
    $('#message-box').doSomething().doSomethingElse().attr('something', 'something'); 
}); 

Wenn Sie etwas immer und immer wieder tun müssen, und die Funktionen bringen nicht das jQuery-Objekt des Speichern in einem var schneller ist.

+0

, die definitiv die jQuery Weise zu tun, es zu sein scheint. – ayaz

+0

vor allem speichern sie in einem var und löschen sie nach der Verwendung lässt Ihre RAM-Nutzung ein wenig nach unten, da $ ('Selektor') immer ein neues Objekt erstellt ... – Guntram

2

Ich sage, gehen Sie dafür!

Ich mache das gleiche wie Sie.

Es macht meinen Code lesbarer, was mich glücklich macht.

3

Normalerweise kette ich sie wie Pims Antwort, aber manchmal, wenn es viele Operationen auf einmal getan werden muss, kann Verkettung Lesbarkeitsprobleme verursachen. In diesen Fällen cache ich die ausgewählten jQuery-Objekte in einer Variablen.

0

Eigentlich ist die Frage viel komplexer.

  1. Chaining ist nicht immer möglich, weil Wähler Strings oder zwischengespeichert jQuery-Selektor Instanzen könnten in neue Funktion() Eigenschaften auf, indem verschiedene prototypische Funktionen gespeichert werden, nicht die einzigen Stück Code.

  2. Sie können beide Selektorzeichenfolgen und zwischengespeicherte jQuery-Selektoren verketten. Ich denke, dass die Verwendung von Selektor-Strings als "diese" Eigenschaften langsameren, aber weniger RAM-konsumierenden Code bringen sollte, während die Verwendung von zwischengespeicherten Selektoren schnelleren, aber mehr RAM-konsumierenden Code bringen sollte. Habe ich recht?

Ich bin über eine ganze Reihe von neuen Funktion() Eigenschaften von Selektor-Strings im Cache gespeicherte Selektoren zu ändern, das ist, warum ich frage.

0

Pim Jager ist zu 100% korrekt für diese spezifische Situation, aber es kann nützlich sein, darauf hinzuweisen, dass es Situationen gibt, in denen Caching geeigneter ist.

Zunächst wird jedes Mal, wenn Sie $ ('something') aufrufen, ein ganzes jQuery-Objekt erneut instantiiert, sodass entweder Verkettung oder Zwischenspeichern aufgerufen wird, wenn Sie mehr als eine Aktion für ein jQuery-Objekt ausführen.

Wenn alles, was Sie tun, in einer Schließung ist, ergreifen Sie Maßnahmen auf das Objekt, Verkettung ist Ihr Freund und Pim Jager Code ist genau richtig.Aber wenn Sie einen Teil dieses Objekts auswerten möchten, können Sie diese Aktionen und das Caching nicht verketten, wie der zweite Codeblock des ursprünglichen Posters zeigt, ist eigentlich der richtige Weg. Zum Beispiel:

$('#mybutton').click(function() { 
    var msg = $('#message-box'); 
    msg.doSomething(); 
    if (msg.hasClass('.something')) { 
     msg.dosomethingElse(); 
    } 
}); 

Interessante Ressource: http://jsperf.com/jquery-chaining-vs-caching

Verwandte Themen