54

preclass を持つ 10 個の要素を含む次のマークアップがありますindent

​&lt;pre class="indent"></pre>
<pre class="indent"></pre>
<pre class="indent"></pre>
<pre class="indent"></pre>
<pre class="indent"></pre>
<pre class="indent"></pre>
<pre class="indent"></pre>
<pre class="indent"></pre>
<pre class="indent"></pre>
<pre class="indent"></pre>​

次の jQuery.each()関数を使用して、各要素を反復処理しています。

​$(function(){    
    $.each(".indent", function(index){
       alert(index); 
    });    
});​

10 個のアラートが表示されるはずですが、7 個しか表示されません

-- フィドルを参照 --


ただし、これは次の場合に期待どおりに機能し$(".indent").each()ます。

$(function(){    
    $(".indent").each(function(index){
       alert(index); 
    });    
});​

-- フィドルを参照 --


ドキュメントを見ると$.each()、違いがあることがわかります。

$.each() 関数は、jQuery オブジェクトを排他的に反復処理するために使用される $(selector).each() と同じではありません。

しかし、この場合、すべての要素を反復処理しない理由がわかりません。

なぜこうなった?

4

3 に答える 3

145
$.each(".indent", function(index){

の要素を反復するのではなく$('.indent')".indent"長さが 7 文字の文字列を反復します。

リファレンスを参照


jQueryソースコードに基づくより詳細な説明:

jQuery は、最初のパラメーターobj(ここでは文字列) に次の値があるかどうかを最初に確認しlengthます。

var ...
        length = obj.length,
        isObj = length === undefined || jQuery.isFunction( obj );

を持つlength(関数ではない)文字列isObjは ですfalse

この場合、次のコードが実行されます。

for ( ; i < length; ) {
    if ( callback.call( obj[ i ], i, obj[ i++ ] ) === false ) {
        break;
    }
}

したがって、 function が与えられた場合f、次のコード

$.each(".indent", f);

と同等です

for (var i=0; i<".indent".length; i++) {
    var letter = ".indent"[i];
    f.call(letter, i, letter);
}

( を使用して文字を記録するか、使用var f = function(i,v){console.log(v)};の機微の 1 つを思い出させることができます)callvar f = function(){console.log(this)};

于 2012-11-30T15:51:45.920 に答える
38

文字列を繰り返し処理しているため、オブジェクトまたは配列を$.eachメソッドに渡す必要があります。

$(function(){    
    $.each($(".indent"), function(index){
       alert(index);
    });    
});
于 2012-11-30T15:52:11.550 に答える
22

$.each は、データのコレクションを反復処理します。7 文字の文字列を渡すため、文字ごとに繰り返されます。使用例を参照してください。

$.each([52, 97], function(index, value) { 
  alert(index + ': ' + value); 
});
于 2012-11-30T15:53:28.947 に答える