2012-09-19 11 views
38

数ヶ月前、this articleは、実際にはウェブサイトの開発からクラスをすべて一緒に避けることができると指摘しました。データ属性のCSSセレクタはクラスセレクタより高速ですか?

私の質問は、データセレクタがクラスセレクタと比較してどのくらい効率的であるかです。

単純な例は、の要素に対してdata-component='something'の要素のクエリを比較することです。

セレクタは、スプリットするクラス文字列と比較して全体として値をチェックします。これを念頭に置くと、データ属性はより高速になるはずです。

したがって、CSSの場合、クラスセレクタやデータセレクタを使用する方がよいでしょうか?そして、javascriptの観点から、jQuery("[data-component='something']")jQuery(".something")より効率的ですか?

+1

私はどのように知らない試すことができますウェブプログラミングはその記事の倫理に関連していますが、私はそれが私がやることとは何の関係もないと確信しています。また、もしあなたがその記事をよく読んでいれば、私は、その作者がクラスと同じように 'data-'属性に関心を持っていると思われます。彼らは結局同じ "犯罪"を表しています。 – Pointy

+0

あなたの質問に関しては、いくつかの[jsperf](http://jsperf.com)テストがその質問に答えるのに役立つかもしれません。私は、 'querySelectorAll()'などの現代的なブラウザではどちらのアプローチでもほとんど問題がないと思う。 – Pointy

+0

データの属性やクラスを追加する代わりにスタイリングするほど、私はもっと好きです。例えば、ブロック要素(検索ボックスのような)が隠されているという事実は、data-state = 'hidden'によって示されます。これは、「コンポーネントウィジェット - ヘッダータッチ可能な隠し丸みを帯びたトップ」よりも、開発者が読める方が簡単です。 –

答えて

21

私は結論として と呼ぶわけではありませんが、クラスセレクタの方が速いと思われます...私はクイックテストのためにこれをまとめています。

http://jsperf.com/data-selector-performance

EDIT:パフォーマンスが問題(特にIE)であればヴラドさんと私のjsperfテストに基づい

... ...のクラスはまだ

+0

私はテストケースにいくつかのquerySelectorAllを追加してクラスもテストしています。 –

+2

http://jsperf.com/testing-data-atribute-selectorsええと、それはquerySelectorAllがデータアトリビュートの方が遅いようです。これは衝撃的です! \ "\"内に実際の値を取得するために文字列を分割しないので、より速くなることを期待していました。 –

+2

Wow .... IE9でのテスト...単一のクラスセレクタ_blows away_データセレクタ...そしてそれはその1つのテストのためのクロムよりも高速です。IE 6300 ops/secとChromeの4800 ... – BLSully

4

を移動するための方法ですセレクタのパフォーマンスは、モバイルブラウザでもすぐに十分速いという印象があります。セレクタをたくさん、データ属性やクラスベースで使用する予定がない限り(その場合は、すでにクエリされたセレクタをキャッシュしようとするためにコードを再訪することをお勧めします)、それほど悪くないと考えることができます。私は、他のスタイルよりもスタイルを使用するのが劇的ではないと言っています。

ブラウザのベンダーは、セレクタに対してクエリを実行するよりも、最もよく使用されるシナリオ(クラスに対してクエリ)を改善するために多くの時間を費やしたと思います。これは変化しており、他のケースの最適化を開始しても驚くことはありません。

9

彼が提供したBLSullyの答えとtest pageをチェックした後、比較のための実際の数字がここにあります。

毎秒jQueryのデータ属性セレクタ性能操作VS

jQueryのクラスセレクタ性能:高速27.0.1453

  • 140%速くFirefoxで15.0.1
  • 131パーセント高速でクロームで

    • 31% IE 10.0でFirefoxの21.0
    • 1267パーセント高速化IE 9.0で
    • 1356パーセント速く
  • 0

    私はすべてのこの答えについて知りませんが、私は自分のテストを実行し、属性が高速です。

    あなたはそれがあなたの自己はただ、最初に時間を節約する作業を行い、最終的な時間を取得、その後計算を行う

    \t \t var newDate = new Date().getTime(); 
     
    \t \t $('.test-t').removeClass('act'); 
     
    \t \t $('.t1r').addClass('act'); 
     
    \t \t var currentDate = new Date().getTime(); 
     
    \t \t var diff = currentDate-newDate; 
     
    \t \t console.log(diff); 
     
    
     
    \t \t var newDate = new Date().getTime(); 
     
    \t \t $('.test-t2').attr('this-act',''); 
     
    \t \t $('.t2r').attr('this-act','1'); 
     
    \t \t var currentDate = new Date().getTime(); 
     
    \t \t var diff = currentDate-newDate; 
     
    \t \t console.log(diff);

    +0

    それぞれの1つのインスタンスが大文字小文字を証明するのに十分かどうかはわかりません。あなたのスニペットを動かすことができなかったので、各アプローチの時間はどのくらい違っていますか? – miltonb

    +0

    おそらく、今質問が尋ねられてブラウザにクエリエンジンを更新する時間があってから数年経ってから、データ属性の方が速くなるかもしれません。これを指摘して良いことです。たぶん、今日の基準に合わせて質問を更新する必要があります。 –

    関連する問題