2012-10-01 13 views
97

私は最近PHPStorm IDEのバージョンをアップグレードしましたが、非効率的なjQueryの使用について警告しています。例えばPHPStorm IDEの非効率的なjQuery使用に関する警告

:jQueryのセレクタが効率的な方法で使用される

チェック:

var property_single_location = $("#property [data-role='content'] .container"); 

、この警告メッセージを表示します。 IDセレクタが先行する子孫セレクタを分割するために を提案し、 はキャッシュ可能な重複セレクタについて警告します。

だから私の質問は次のとおりです。

なぜこの非効率であり、上記のセレクタを行うための効率的な方法は何ですか?私が推測するだろう

var property_single_location = $("#property").find("[data-role='content']").find(".container"); 

は、これは正しい方法ですか?

答えて

151

私は今日同じ質問をしており、Scott Kosmanhereのおかげで解決策を見つけることができました。

基本的には、IDを個別に選択し、次に.find(...)を使用します。だからあなたの例を取る:

$("#property [data-role='content'] .container"); 

これにそれを変更すると、PhpStormを幸せにすると明らかにmore than twice as fastことができます。

$("#property").find("[data-role='content'] .container"); 
+1

私の好みでは$( '[data-role = "content"] .container'、 '#property');より読みやすいです。 – n3rd

+25

@ n3rd面白いですが、私はそのアプローチがまったく読めるわけではありません。 – MikeSchinkel

+2

しかし、なぜですか?クラスセレクタを使用している場合、IntelliJは警告を表示しません。 –

19

私は2つの方法の違いは、最近のjQueryのバージョンとブラウザを使用する場合には無視できると考えています。で、クラスによって、複数の子を選択するため

http://jsperf.com/jquery-find-vs-insel

:私はIDの組み合わせセレクタではなく、選択を行い、その後、非常に単純なケースを見つけるために、実際に今10%高速であることを示してテストを構築しましたあなたがいる場合、彼らは、ここで指摘したよう https://forum.jquery.com/topic/which-jquery-selection-is-efficient :任意の深さは、「見つける」速いように見えるん:

http://jsperf.com/jquery-find-vs-insel/7

jQueryのフォーラムでこのことについていくつかの議論がありましたが、その3歳同じidセ​​レクタで多くの操作を実行すると、最上位要素をキャッシュすることでパフォーマンスが最大限に向上します。 一方、いくつかの選択肢を行っている場合、パフォーマンスの違いはほとんどありません。

私はIntelliJがこのコードスタイルの重要性を誇張していると思います。

+4

最初のテストでは、ダイレクト選択解除の ">"を使用しています。私はあなたの最初のテストを ">"せずに使いました。そして、 "find"を使うことはより速いです。 http://jsperf.com/jquery-find-vs-insel/12 – beardedlinuxgeek

+0

私が最も興味深いのは、Safariの最新バージョンがダイレクトメソッドを約25%速く処理するということです。私は彼らが何をしたのかは分かりませんが、明らかに他のすべてのブラウザはそれに気づかなかったのです。 – Uxonith

13

最初の質問は、Alt + Enterキーを押してリストの最初のヒントを選択し、Enterキーを押すと、最も効果的な方法がわかります。

関連する問題