Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
226 views
in Technique[技术] by (71.8m points)

javascript - Why doesn't $.each() iterate through every item?

I have the following markup containing 10 pre elements with the class indent:

?<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>?

I'm using the following jQuery .each() function to iterate through each element:

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

I would expect to see 10 alerts, however I only see 7

-- See Fiddle --


However, this works as expected with $(".indent").each():

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

-- See Fiddle --


Looking at the $.each() documentation, I understand theres a difference:

The $.each() function is not the same as $(selector).each(), which is used to iterate, exclusively, over a jQuery object.

But I don't understand why in this instance, it doesn't iterate through all elements.

Why is this happening?

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)
$.each(".indent", function(index){

doesn't iterate over the elements of $('.indent') but over the ".indent" string whose length is 7 chars.

See reference


A more detailed explanation based on jQuery source code :

jQuery first checks if the first parameter, obj (here your string), has a length :

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

Your string having a length (and not being a function), isObj is false.

In this case, the following code is executed :

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

So, given the function f, the following code

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

is equivalent to

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

(you can log the letters using var f = function(i,v){console.log(v)}; or be reminded one of the subtleties of call using var f = function(){console.log(this)};)


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...