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
However, this works as expected with $(".indent").each()
:
$(function(){
$(".indent").each(function(index){
alert(index);
});
});
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?
You are iterating through the string, you should pass an object or an array to
$.each
method:$.each iterates over a collection of data. Since you pass a String that have 7 chars, it will iterate for each char. See the example of use:
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 alength
:Your string having a
length
(and not being a function),isObj
isfalse
.In this case, the following code is executed :
So, given the function
f
, the following codeis equivalent to
(you can log the letters using
var f = function(i,v){console.log(v)};
or be reminded one of the subtleties ofcall
usingvar f = function(){console.log(this)};
)