迭代jQuery $(this).attr('class')。split(“”)给出奇怪的结果

时间:2010-07-05 17:21:22

标签: javascript jquery css arrays iteration

我有一个页面,我正在尝试为许多共享一个公共类的div获取类的数组。例如:

<div class="common lorem ipsum"></div>
<div class="common dolor sit"></div>
<div class="common hello world"></div>

我想获取每个common类div并获取它的类的数组。目前,我正在使用这个jQuery:

$('.common').each(function(index) {
  var classes = $(this).attr('class').split(" ");
  for(var i in classes) {
    alert(classes[i]);
  }
});

查看第一个生成的classes变量得出:

classes: Array (3)
0: "common"
1: "lorem"
2: "ipsum"
length: 3
__proto__: Array

问题在于for(var i in classes)似乎正在迭代__proto__阵列并深入研究它 - 有没有人曾经遇到过这个问题?我使用的是最新版本的Chrome(6.0.453.1)。

5 个答案:

答案 0 :(得分:17)

for ( var i = 0, l = classes.length; i<l; ++i ) {
 alert( classes[i] );
}

使用常规for循环遍历数组,而不是for...in,否则它会枚举数组的属性(因为它仍然是一个对象,除了里面的元素之外还有其他属性)。

答案 1 :(得分:4)

要添加其他有效答案,因为您已经在使用jQuery,所以可以利用jQuery.each

$.each(classes, function (i, cls) {
    alert(cls);
});

答案 2 :(得分:2)

@meder恰到好处地回答了你的问题,我只是想补充一点,如果枚举的顺序不重要,你可以随时使用这种简化形式:

for ( var i = classes.length; i--; ) {
  alert( classes[i] );
}

它更短,更快。

答案 3 :(得分:1)

添加到meder的答案......

有一种方法可以安全地迭代对象,而不会被对象的继承属性所困扰。 hasOwnProperty()救援:

for(var i in classes) {
  if (classes.hasOwnProperty(i)) {
    var safeValue = classes[i];
  }
}

答案 4 :(得分:0)

我见过这个用here

我不确定对(i in this) 0-n的{​​{1}}重复检查是什么。

var thisp = arguments[1];
for (var i = 0, len = this.length; i < len; i++){
  if (i in this){
    fun.call(thisp, this[i], i, this); // fun(element,index,array)
  }
}