为什么$ .each()不遍历每个项目?

我有以下标记包含与类indent 10 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> <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()函数不同于$(selector).each(),它用于遍历一个jQuery对象。

但我不明白为什么在这种情况下,它不遍历所有元素。

为什么发生这种情况?

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

不会遍历$('.indent')的元素,而是遍历长度为7个字符的".indent"string。

参见参考


基于jQuery源代码的更详细的解释:

jQuery首先检查第一个参数obj (这里是你的string)是否有length

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

你的string有一个length (而不是一个函数), isObjfalse

在这种情况下,将执行以下代码:

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

所以,给定函数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)};来logging这些字母var f = function(i,v){console.log(v)};或者使用var f = function(){console.log(this)};来提醒其中一个细节var f = function(){console.log(this)};

你正在遍历string,你应该传递一个对象或数组到$.each方法:

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

$ .each迭代一组数据。 既然你传递了一个有7个字符的string,它将迭代每个字符。 看到使用的例子:

 $.each([52, 97], function(index, value) { alert(index + ': ' + value); });