可能是由于与遍历大集合相关的性能原因?如果只需要DOM对象,则可以节省循环次数。如果需要jQuery对象,那么可以轻松获取。
通常我不会提供each的第二个参数,这样可以使用$(this)。
在内部,jQuery为$("sel").each(function(){});
调用此函数。
if ( isObj ) {
for ( name in object ) {
if ( callback.call( object[ name ], name, object[ name ] ) === false ) {
break;
}
}
}
而 eq
则是一个简单的切片:
eq: function( i ) {
return i === -1 ?
this.slice( i ) :
this.slice( i, +i + 1 );
}
each
函数,而不是使用object[name]
,而是使用object:eq(i)
。$("*").slice(1,2).toSource() == $("*").eq(1).toSource();
each
函数:$.fn.each2 = function(callback)
{
for ( var i = 0; i < this.length; ++i ) {
callback.call( this.eq(i), i, this.eq(i) )
}
};
$("*").each2(function(i, obj) {
alert(obj); // now obj is a jQuery object
});
看起来each3
比each2
更快http://www.jsfiddle.net/m7pKk/2/
$.fn.each2 = function(callback)
{
for ( var i = 0; i < this.length; ++i ) {
var jObj = this.eq(i);
callback.call( jObj, i, jObj )
}
};
$.fn.each3 = function(callback)
{
for ( var i = 0; i < this.length; ++i ) {
var jObj = $(this[i]);
callback.call( jObj, i, jObj )
}
};
obj[i]
和obj.slice(i, i+1)
没有太大区别... 在这里可以看到例子http://www.jsfiddle.net/m7pKk/ - BrunoLM$(".foo")[i]
返回一个DOM对象,而$(".foo").eq(i)
则返回一个jQuery对象。这就是重点,鉴于eq
的实现是通过切片完成的,我几乎相信$($(".foo")[i])
会更快... - badpeach
返回jQuery对象的最快方法是在回调函数内使用$(obj)
。如果没有这个调用,它会更快。这就是为什么要这样做的原因。 - BrunoLM$(this).is(":checked")
而不是this.checked
。我相信由于jQuery使用包装对象,第一个方法使用原始包装器,只是删除包装器中除第一个元素外的所有内容,因此仍然保持它是一个jQuery对象。
然而,如果他们为each()
函数的每个节点提供一个jQuery对象,他们将会承担为每个节点创建包装器的开销。而且由于您不一定需要该包装器对象,这将会产生不必要的开销。
可能是因为在你的例子中甚至没有必要使用each
。可以改为:
$(".foo").each( function(idx, obj) {
$(obj).text("hi!");
)
只需使用:
$(".foo").text("hi!");
在处理 jQuery 集时,一切都自动成为复数。
.text()
更复杂的函数 :) - badp$(this).text($(this).hasClass("selected") ? "selected" : "")
或者其他一些愚蠢的事情,如果是这种情况,我会建议只是做jQuery(".foo.selected")或其他类似的事情。 - jpsimons你看到了.each和jQuery.each的区别吗?
你应该能够做到以下几点:
$('li').each(function(index) {
alert(index + ': ' + $(this).text());
});
$(this)
而不是$(obj)
。尝试
$(".foo").each( function(idx, obj) {
$(this).text("hi!")
}
)
$()
构造函数仍然存在。 - badp
$(".foo")
会生成 jQuery 对象,并在通过each()
时将它们削减为“基本”的 DOM 对象。我猜这里并不完全是这样 :) - badp$(selector).first()
确实返回一个jQuery对象。你不应该再次用$($(selector).first())
包装它。据我所知,唯一返回纯DOM元素的jQuery方法是.get(0)
,当你传递一个数字时。没有数字参数,你会得到一个DOM元素数组。 - user113716