为什么$ .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
(而不是一个函数), isObj
是false
。
在这种情况下,将执行以下代码:
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); });