jqueryセレクタの原理紹介($()の使い方
jQueryの対象を申明するたびに、戻ってくるのはjQuery.prototype.initの対象です。分からない人が多いです。initはjQuery.fnの方法なのに、実はここは方法ではなく、initの構成関数です。jsのプロトタイプの対象は継承できます。jsの対象は引用コピーではないです。new jQuery。new jQuery.fnとnew jQuery.fn.initのサブオブジェクトは同じですが、initに実行されているかどうかの違いがあります。
セレクタを使うと、intiではどのように実行されているかを確認します。
上のコードを分析してみます。このような簡単なセレクタではないなら、いずれもfind関数を実行します。findは一体使うものですか?
このように書くと、プログラムはこのようにしか実行されません。初めてinitを実行した時に、ステップgetElement ByIdを実行したら、returnを実行します。続けてfind('.className',divDcument)を実行します。divDocumentは私達が初めて選んだのが、divタグがたくさんあります。そして初めてidを選ぶ速度も遍歴よりずっと速いです。
今は皆さん分かりましたよね。つまり、第1層はIDが一番いいということではなく、簡単なセレクタを選択して、範囲を定義し、速度を上げることが目的です。
セレクタを使うと、intiではどのように実行されているかを確認します。
if ( typeof selector == "string" )
{
// , HTML #id
var match = quickExpr.exec( selector );
// DOM 、 jQuery 。
//selector #id
if ( match && (match[1] || !context) )
{
// HANDLE: $(html) -> $(array)
//HTML , clean HTML
if ( match[1] ){
selector = jQuery.clean( [ match[1] ], context );
}
// : $("#id")
else {
// id Dom
var elem = document.getElementById( match[3] );
if ( elem ){
if ( elem.id != match[3] )
return jQuery().find( selector );
return jQuery( elem );// return
}
selector = [];
}
// id . context
}
else{
return jQuery( context ).find( selector );
}
}
ここではセレクタだけが$('葏id')と書く時が一番早いと説明しています。一度getElement ByIdを実行したのと同じです。後のプログラムはもう実行しなくてもいいです。もちろん、私たちが必要とするセレクタはそんなに簡単ではありません。例えば、idの下のCSSはクラスNameであり、このような書き方があります。この2つの書き方の実行結果は同じです。例えば<div id=”id><span class=”class Name>帰ってきたのはきっとclass Name>ですが、実行の効率は全然違います。上のコードを分析してみます。このような簡単なセレクタではないなら、いずれもfind関数を実行します。findは一体使うものですか?
find: function( selector ) {
//
var elems = jQuery.map(this, function(elem){
return jQuery.find( selector, elem );
});
// ,
// js test
//indexOf("..") xpath , selector
//
return this.pushStack( /[^+>] [^+>]/.test( selector ) || selector.indexOf("..") > -1 ?
jQuery.unique( elems ) :
elems );
}
このように$を書くと、拡張されたfindに実行されます。現在のthisはdocumentのjQuery配列ですから、拡張されたfindの実現を見ています。コードが多いので、列挙しません。つまり、第二のパラメータ伝達のために、documentのjQuery配列を探しています。会って.Class Nameに対して、あります:<+-などは処理します。私達は最適化したいです。第二のパラメータcontextの範囲を最小にする方法を考えていますか?それなら遍歴が少ないですか?このように書くと、プログラムはこのようにしか実行されません。初めてinitを実行した時に、ステップgetElement ByIdを実行したら、returnを実行します。続けてfind('.className',divDcument)を実行します。divDocumentは私達が初めて選んだのが、divタグがたくさんあります。そして初めてidを選ぶ速度も遍歴よりずっと速いです。
今は皆さん分かりましたよね。つまり、第1層はIDが一番いいということではなく、簡単なセレクタを選択して、範囲を定義し、速度を上げることが目的です。