2010-08-18 3 views
6

jQuery'de $ ('[id = foo]') seçiciden daha az verimli $ ('# foo')?

cevap

16
  • kısa ve kolay: EVET!

  • uzun hikaye (aslında halen kısa)

    $('[id=foo]') 
    

    $('#foo') 
    

    doğrudan getElementById çağırır oysa elemanı seçmek için Sizzle (css sorgu motoru) kullanır. $('[id=foo]') evrensel yu kullanır $('*:[id=foo]') eşanlamlıdır:

işte gidiyoruz, gerçekten uzun bir hikaye sahip olmak. Bu, işaretinizdeki TÜM düğümlerini sorgulamakta ve daha sonra bunlardan hangilerinin id === foo (hangisi sadece bir öğeyle eşleşeceğini ummaktadır), kimlikleri = benzersizdir). Bu, pahalı, oldukça maliyetlidir. Ve işte bu yüzden asla böyle bir seçici yazmamalısın! Her zaman tam olarak bunu nitelendirir, örneğin, $('span:[id=foo]')

+0

Ahh heres bir alt sorudur - edilmektedir '$ ('span: [id = foo]') '' $ (span # foo) 'ya da tamamen farklı bir seçici için sadece el yazısı? – HurnsMobile

+0

@HurnsMobile: Hiç de değil. '$ ('Yayılma: [id = ece]') '. Aslında jQuery init kodunu buraya göz atmanızı tavsiye ederim. jQuery bazı seçici ifadeleri "getElementById" veya "getElementsByTagName" doğrudan çağrısına ayrıştırır, sanırım $ (span # foo) 'bunlardan biridir. Yani '$ (' span: [id = foo] ') 'dan daha hızlıdır. Bu ifade, Sizzle'a girecek ve açıkçası yukarıda belirtilen yöntemlerden daha uzun sürecek. – jAndy

+0

Çok bilgilendirici, çok teşekkürler. Bir kimliği hedeflemek için $ ("# foo") dışında bir şey kullanmayı düşünmemin nedeni, hedeflediğim id'in bir dönem geçirmesiydi, çünkü jQuery'nin bunu bir kimlik ve bir sınıf olarak yorumlayacağı açıktır. Örneğin, $ ("[id = Address.State]") kullanarak sorunu çözebilirim. Bunun üstesinden gelmenin başka bir yolu da, $ ("# Address \\. State") gibi periyottan kaçmaktır, fakat çift kaçışın daha az okunabilir olduğunu düşündüm. Ancak, dikkat çektiğiniz verim kaybı göz önüne alındığında, yine de bunu kullanırdım. – jbyrd

1

yeah ,. Bir yerli JavaScript yöntemine doğrudan eşler çünkü

jQuery en hızlı selektör kimlik seçici $ ('# foo'), getElementById() sonra JANDY için