2012-02-13 10 views
1

私は道場のクエリチュートリアルを読み、Dojoはクエリを制限しますか?

// retrieve an array of nodes with the class name "odd" 
// from the first list using a selector 
var odds1 = query("#list .odd"); 

// retrieve an array of nodes with the class name "odd" 
// from the first list using a DOM node 
var odds2 = query(".odd", document.getElementById("list")); 

を見て、彼らは#listのDOM内.oddためodds2検索全体ではなく、HTMLのDOMためodds1よりも高速odds2であることを説明しました。私はodds1の利点は何か(クリーナーコード以外のものだと思います)でしょうか?クエリがid要素内のオブジェクトを検索している場合は、odds2スタイルを常に使用する必要があります(適切なID、クラスhtmlが使用されていると仮定する)ので、dojoは自動的にodds1のクエリ文字列を呼び出して呼び出しますオッズ2?

答えて

2

クエリのコード(http://svn.dojotoolkit.org/src/dojo/trunk/query.jsクエリとデフォルトのセレクタエンジンhttp://svn.dojotoolkit.org/src/dojo/trunk/selector/acme.js)を見ると、 "大きな"パフォーマンスの向上は、クエリメソッドにいくつかのヘルプを与えると、最初のDOMNodeリストが減少するdocument.getElementById("list")しかし、クエリメソッドに親ノードのIDの文字列を渡すだけで、同じパフォーマンスが得られるようです。

query(".odd", "list"); 

次に、あなたが変数にdocument.getElementById("list")の結果を格納することにより、DOMNodeをリストをキャッシュし、それを再利用することができるという事実があります。しかし、一般的な可読性(これは些細な問題では)がパフォーマンスを上回る傾向があります。悪いJavaScriptインタプリタが隠すことができる問題の数を考えると、読めるコードを持つことで多くの手間を省くことができます。

+0

私はそれを得ますが、なぜdojoは単純にodds1のクリーンな構文を使用しますが、より効率的なodds2を呼び出します。 – Derek

+0

したがって、セレクタエンジン(http://svn.dojotoolkit.org/src/dojo/trunk/selector /lite.js)実際にはそうであるようです。 odd2クエリは、idが "list"のルートノードが1つのみ存在し、odd1クエリは共通のクラス値(または有効なHTMLではない共通のid値)を持つ複数の要素に対応できます。コードをもっと見るほど、セレクタ解析のステップとルートノードのキャッシング以外の2つのパフォーマンスに違いはありません。 –

+0

私はacme.js(http://svn.dojotoolkit.org/src/dojo/trunk/selector/acme.js)セレクタエンジンを読んでいました(私はそれがデフォルトのエンジンだと思います)、クエリ解析のみが行われていますクエリが最初に実行されたときに、非効率的なクエリへのその後の呼び出しにも違いはありません。このdojoクエリのチュートリアルはどこですか? –

関連する問題