5

私はこれについてjQueryソースを調べましたが、おそらく私の理解を超えていることを認めなければなりません-または私は間違った場所を探しています。 https://github.com/jquery/jquery/blob/master/src/core.js

行222の周りには再帰的に見える関数があり、行566の周りには.extend()名前空間で宣言された別の関数があります。

私はただ興味があります-これはどのように正確に機能しますか?たとえば、私が電話すると:

$('.item').each(function(){
    // Do Something
});

DOM要素の配列を循環すること、いつ停止するか、どのように関数を適用するかをどのように知るのですか?それはできません

$('.item').doThis()

doThis()はそのオブジェクトのメンバーではない可能性があるためです。

私に教えてください:)ありがとう。

4

4 に答える 4

2

私の知る限り、これは

$('selector').each(func);

これを行うのと同等です:

func = ...;
$selector = $('selector');
for (var i = 0; i < $selector.length; i++) {
    if (func.call($selector[i], i, $selector[i]) === false) {
        break;
    }
}

$ 選択によって返されるオブジェクトは、実際には DOM 要素の配列であり、追加のメソッドが多数関連付けられているため、基本的に配列と同じように操作できます。問題が解決することを願っています。

于 2012-11-01T23:44:01.837 に答える
2

いいえ、再帰的ではありません。222 行目の関数は jQuery のプロトタイプ ( $.fn) の関数ですが、それが呼び出す関数は566 行jQuery.each目に定義されている静的プロパティです。どのように機能するかに注意してください: 拡張するオブジェクトが指定されていない場合は、 を使用します。コードのさまざまなセクションに適用されます。extendthisjQueryjQuery.fn

それで、これはどのように正確に機能しますか?

$obj.each(callback)jQuery インスタンス (DOM ラッパー) 自体$.fn.eachに適用されるメソッドを呼び出しています:行 223$.each

では、提供された配列がある場合とない場合、および配列のような構造または他のオブジェクトの$.each場合の 4 つのケースがあります。args追加の引数を渡さず、jQuery インスタンスにはlengthプロパティがあり、数値インデックスに DOM 要素があるため、596 行目のループが実行されます。したがって、あなたの呼び出しは

for (var i=0, len=$obj.length; i<len; i++)
    if ( callback.call($obj[i], i, $obj[i]) === false ) break;
于 2012-11-01T23:46:39.577 に答える
0

jQuery で実行する各クエリは、配列のようなオブジェクトとして格納されます。つまり、次のようにして、クエリで見つかった DOM 要素のリストにアクセスできます。

$('.item')[0] //The first item found by your query

内部的に、$().each は $.each を使用します。これは、コレクションを反復処理し、引数として渡した関数を呼び出し、'Function.apply' を使用して 'this' を現在のオブジェクトに設定する方法です。繰り返されています。

于 2012-11-01T23:48:38.330 に答える
0

ソースの566 行から 605 行を確認してください。

これは反復的で、かなり単純です。

于 2012-11-01T23:55:06.033 に答える