下面的标记包含10个具有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>
<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()函数与$(
).each()不同,后者用于以独占方式遍历jQuery对象。
但我不明白为什么在这种情况下,它不会遍历所有元素。
为什么会发生这种情况?
发布于 2012-11-30 23:51:46
$.each(".indent", function(index){
不会遍历$('.indent')
的元素,而是遍历长度为7个字符的".indent"
字符串。
请参阅reference
基于 的更详细说明
jQuery首先检查第一个参数obj
(这里是您的字符串)是否有length
:
var ...
length = obj.length,
isObj = length === undefined || jQuery.isFunction( obj );
如果字符串有一个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)};
记录这些信件,或者使用var f = function(){console.log(this)};
提醒您call
的一个微妙之处)
发布于 2012-11-30 23:52:12
您正在迭代字符串,应将对象或数组传递给$.each
方法:
$(function(){
$.each($(".indent"), function(index){
alert(index);
});
});
发布于 2012-11-30 23:53:29
$.each遍历一组数据。由于您传递了一个包含7个字符的字符串,因此它将对每个字符进行迭代。请参见使用示例:
$.each([52, 97], function(index, value) {
alert(index + ': ' + value);
});
https://stackoverflow.com/questions/13648515
复制相似问题