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?
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),isObjisfalse.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 ofcallusingvar f = function(){console.log(this)};)