2012-04-17 13 views
6

Soruma soru sormak DOM ayrıştırma tetiklendi, neden bir Sınıf seçiciden daha CSS Kimlik seçicisi kullanmakta daha hızlı olduğunu bilmek isterim. Ne zaman DOM ağacı tekrar ayrıştırılması ilgisi var ve ne hileler ve performans geliştirmeleri ben de ... kullanmalıyım, birisi bana benCSS Seçici performans, DOM Ayrıştırma

var $p = $("p"); 
$p.css("color", "blue"); 
$p.text("Text changed!"); 

yerine

$("p").css("color", "blue"); 
$("p").text("Text changed!"); 

gibi bir şey yaparsanız performansı artırır, tüm tarayıcılar için bu doğru mu? Ayrıca, DOM ağacımın yeniden ayrıştırılıp ayrılmadığını nasıl bilebilirim?

+0

CSS seçici ayrıştırma performansı yeterli mikroskobik olduğunu. JQuery'nin farklı seçicileri (CSS veya CSS olmayanları) karışıma yorumlamanın farklı yollarını atmak, her şeyi gereksiz yere kafa karıştırıcı hale getirir. Bu nüanslar üzerinde çirkinleşmeye değmez. – BoltClock

+0

http://www.artzstudio.com/2009/04/jquery-performance-rules/ jquery perf development için birçok kural listeler – rt2800

+1

Ayrıca, zincirleme yöntemini de yapabileceğinizi unutmayın. Yani, $ ('p'). Css (''). Text (''.. Morestuff() 'da performansınızı iyileştirmek için – mrtsherman

cevap

10

Bir #id seçicisi, sınıf seçicilerinden daha hızlıdır, çünkü: (a) yalnızca belirli bir kimlik değerine sahip bir öğe olabilir; (b) tarayıcılar bir harita id -> element tutabilir, böylece #id seçicisi tek harita araması kadar hızlı çalışabilir.

Sonraki ilk seçenek, sen Chrome Geliştirici Araçları'nı kullanabilirsiniz böylece 2.

Son kat toplam seçici tabanlı arama süresini azaltarak, ikinci aramasını önler olarak, daha hızlı kesinlikle yukarıda önerilen Seçici Profiler (Profiller paneli olarak) o sayfanıza seçiciler işlemek için bir tarayıcı süresini profil (maç + eşleştirme elemanlarına stilleri uygulamak.)

+0

Hey, Selector Profiler hakkında bilmiyordum. Teşekkürler! Benim için +1. – mrtsherman

+0

Yalnızca bir JavaScript seçici kütüphanesi bir CSS Kimliği seçicisini bir 'getElementById()' çağrısı olarak ele alır ve ilk elemanı eşleşen kimlikle birlikte alır. Tam olarak, uyumlu bir CSS seçici motorunun birden fazla olsa bile, belirli bir ID ile * tüm * öğelerinin belirli bir kimlikle eşleşmesi gerekir, böylece bir tarayıcı böyle bir haritaya sahipse, bu konuyla alakalı olmayacaktır. eşleme prosedürü.Ama burada jQuery hakkında konuşacağız ... – BoltClock

+0

@ BoltClock'saUnicorn: Biliyorum, teknik özelliklerden hoşlanıyorsun :), yani [bu] (http://www.w3.org/TR/1999/REC- html401-19991224/struct/global.html # adef-id), bir belgedeki "id" özellik değerinin ** benzersiz ** olması gerektiğini söylüyor. Aynı id id değerine sahip olan birkaç elemanın tarayıcı davranışı aksi halde tanımlanmamıştır (document.getElementById() işlevi kullanılırsa kesinlikle daha fazla.) –

1

Ben kendi performans testlerini yapmak için teşvik ne zaman bir şüphen varsa Bunun nasıl yapılacağı hakkında daha fazla bilgi edinebilirsiniz: How do you performance test JavaScript code?. Performansı kendiniz test ettikten sonra, sonuçları asla unutmayacaksınız. Özellikle, bir jquery selektörü üzerindeki $() işlevinin yürütülmesi, eşleşen DOM düğümlerini edinmelidir. Bunun nasıl çalıştığından tam olarak emin değilim ama sanırım bu, document.getElementById(), document.getElementsByTagName() ve diğerlerinin birleşimidir. Bu işlemin maliyeti, ne kadar küçük olursa olsun, sadece bir kez çağırır ve tekrar kullanırsanız, işlem zamanından tasarruf edersiniz.

1

Kimlik seçici, bir sınıf seçiciden daha hızlıdır, çünkü bir kimliğe sahip yalnızca bir öğe vardır, ancak birçok öğe bir sınıfı paylaşabilir ve aranması gerekir.

o yavaş olacaktır tabii böylece aşağıdaki kod gereksiz iki kez DOM ayrıştırma: Tek başına

$("p").css("color", "blue"); 
$("p").text("Text changed!");