2012-04-07 24 views
14

Bir jQuery seçici sonucuna bir işlev kapsamında birden çok kez erişmem gerektiğinde, seçiciyi bir kez çalıştırıp yerel bir değişkene atamam mı önerilir?jQuery seçicileri vs yerel değişkenlerin performansı

Buradaki örnek örneğimi affet, ancak sorunun bu olduğunu düşünüyorum. Yani, bu kod daha hızlı performans gösterir:

var execute = function(){ 
    var element = $('.myElement'); 
    element.css('color','green'); 
    element.attr('title','My Element'); 
    element.click(function(){ 
     console.log('clicked'); 
    }); 
} 

Bu kodun daha: hayır fark varsa

var execute = function(){ 
    $('.myElement').css('color','green'); 
    $('.myElement').attr('title','My Element'); 
    $('.myElement').click(function(){ 
     console.log('clicked'); 
    }); 
} 

, herkes neden açıklayabilir? JQuery, öğeleri seçtikten sonra önbelleğe alır mı? Böylece, sonraki seçmenler dom arama işlemini tekrar yapmak zorunda kalmazlar mı?

+0

Yanıtlarınız için herkese teşekkürler, tüm bunları kabul edebilseydim – KodeKreachor

cevap

18

eser, zaman ve ilişkili, kesinlikle daha hızlıdır.

http://jsperf.com/caching-jquery-selectors

sonuncu durumda, sizin seçicileri yeniden tanımlanması,% 35 daha yavaş ~ olarak rapor edilir: İşte kanıtı olarak yapılan bir test.

+0

Serin test, çok güzel, ama kafam karıştı ... etiket durumu olarak 'yerel değişken' örneğini temsil eden kırmızı çubuk mu? Daha uzun sürdü mü? – KodeKreachor

+0

Evet, kırmızı yerel değişkendir. Bu biraz kafa karıştırıcı, grafikte daha uzun. Saniyede kaç işlemin çalıştırılabileceğini gösterir. – weotch

+0

Beni bu siteye tanıttığın için teşekkür ederim. O fantastik! – tsherif

3

Referansı yerel değişkende saklamak, her seferinde seçim kodunu çalıştırmadan daha hızlı olacaktır. Bu, bir değişkende sakladığınızda uygun öğeleri bulmak için HERHANGİ bir kod yürütmek zorunda kalmamak meselesidir. Temel kuralım, jQuery aramasının sonuçlarını bir kereden fazla kullanacaksam bir değişkende saklamaktır.

1

Buradaki başka bir seçenek seçici tekrar yerine bir each kullanmak olduğunu ve seçici referansı, ilk davayı yeniden kullanma tekrar

var execute = function(){ 
    $('.myElement').each(function() { 
     var elem = $(this); 
     elem.css('color','green'); 
     elem.attr('title','My Element'); 
     elem.click(function(){ 
     console.log('clicked'); 
     }); 
    }); 
} 
+1

Performansla ilgileniyorsanız, tekrar tekrar nesneler için bellek ayırma ve gereksiz işlev çağrıları yapma (verilen, oldukça hızlı) $ (this) 'aynı element için tekrar tekrar ideal değildir. –

+1

* "Fark, 'attr' fonksiyonundadır. Eğer bir koleksiyona uygularsanız koleksiyondaki ilk elemanı etkiler." * Hayır, bu sadece * doğrudur *. On * set *, hepsi için ayarlar: http://api.jquery.com/attr/#attr2 –

+0

@ T.J.Kalabalık kötü, ben dokümanlar için okuduğum yöntemin imzasına bakmadım. – tvanfosson

8

bu bir Unutma: Aslında gerçekten önbelleğe yaklaşım unutuyorsun

var execute = function(){ 
    $('.myElement') 
     .css('color','green') 
     .attr('title','My Element') 
     .click(function(){ 
      console.log('clicked'); 
     }); 
} 
+0

@weotch Harika. Yeterince hızlı değildim o yüzden özdeş cevabımı iptal ettim ... Ama bunun bir seçenek olduğundan emin olmak harika. Bunu bir hız testine ekleyebilir miydin? –

+1

+1. Bu, jQuery'nin örneklerinin çoğunun bu şekilde birlikte çağrıları zincirleme eğiliminde olduğu için öngördüğü çözümdür. Belki de yerel değişkenlere kaydetmekten daha hızlı değil, ama kesinlikle birden fazla seçenekten daha hızlı ve ben daha zarif olduğunu iddia ediyorum. – Neil

+2

Bu testi ekledi. İlk önce bağlı görünüyor! – weotch

0

.

jQuery ile olan şey, ilk aramanın $('.selector') pahalı olmasıdır. Fakat bundan sonra, eylemlerinizi ona zincirlemek veya bir değişkene atamak ve değişkeninizdeki eylemlerinizi yürütmek çok da önemli değil. Elde edebileceğiniz ana performans artışı, öğeyi daha da önbelleğe almaktır ve jQuery seçicisine işlev çağrınızın her yinelemesini atamaz.

var element = $('.myElement'); 
var execute = function(){ 
    element.css('color','green'); 
    element.attr('title','My Element'); 
    element.click(function(){ 
     console.log('clicked'); 
    }); 
} 

Bu yaklaşım, önerilen diğer yaklaşımlardan en hızlı sürüme neredeyse iki kat daha hızlıdır.

http://jsperf.com/caching-jquery-selectors/17

Not bakınız: yaşam süresi Günlerden sırasında DOM değişirse unsurların taze seçim ile element değişkeni güncelleyebilirsiniz.

İlgili konular