重写.each()循环和循环优化,如何复制$(this).attr()

时间:2012-12-12 17:00:58

标签: for-loop jquery

我在IE中运行时编写的jquery脚本遇到了一些性能问题所以我正在尝试以任何可能的方式进行优化。显然使用for循环比使用jQuery .each方法更快。这让我想到了一个关于for循环中$(this)的等价物的问题。我正在简化我在循环中所做的事情,直到使用attr()函数,因为它遇到了我的主要基础问题。

我这样做(简化)

var existing = $('#existing').find('div');
    existing.each(function(){
    console.log($(this).attr('id'));
});

我尝试将其重写为for循环:

var existing = $('#existing').find('div');
for(var i = 0;i < existing.length;i++)
{
    console.log(existing[i].attr('id'));
}

它抛出错误说:

Uncaught TypeError: Object #<HTMLDivElement> has no method 'attr'

3 个答案:

答案 0 :(得分:2)

要获取元素的id,只需执行

existing[i].id

请注意,jQuery循环也会更快

existing.each(function(){
  console.log(this.id);
}); 

更一般地说,你不应该使用attr('id'),特别是如果你担心表演,因为DOM对象有一个属性id

答案 1 :(得分:2)

您需要existing.eq()获取jQuery个对象,existing[]会为您提供DOM个对象。应该使用jQuery对象调用函数attr(),而不是使用DOM(javascript)对象调用函数。

var existing = $('#existing');
for(var i = 0;i < existing.length;i++)
{
    console.log(existing.eq(i).attr('id'));
}

你可以使用每个索引而不用for循环。

existing.each(function(index, item){
     alert(index);
     alert(item);
});

答案 2 :(得分:1)

。在我给出答案之前,我必须问你一个问题,为什么你需要在单个元素上执行循环,#exists不是Id,因此它是你页面上的一个独特元素。 你可以简单地做

$('#existing').prop('id');  

如果您有多个元素,您应该使用类或其他属性,如果是这种情况,您可以使用以下内容:

$.each('.existing',function(index,item){
    console.log(item.prop('id'));
});

更好地使用attr()的prop(),因为attr已被弃用