Перебор jQuery $ (this) .attr ('class'). Split ("") дает странные результаты - PullRequest
10 голосов
/ 05 июля 2010

У меня есть страница, на которой я пытаюсь получить массивы классов для множества элементов 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 ]

17 голосов
/ 05 июля 2010
for ( var i = 0, l = classes.length; i<l; ++i ) {
 alert( classes[i] );
}

Итерация по массиву с регулярным циклом for, а не for...in, в противном случае он перечисляет свойства массива (так как он все еще является объектом и имеет другие свойства в дополнение к элементам внутри).

4 голосов
/ 05 июля 2010

Чтобы добавить к другим действительным ответам, так как вы уже используете jQuery, вы можете воспользоваться jQuery.each:

$.each(classes, function (i, cls) {
    alert(cls);
});
2 голосов
/ 05 июля 2010

@ meder точно ответил на ваш вопрос, я просто хотел добавить, что если порядок перечисления не важен, вы всегда можете использовать эту упрощенную форму:

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

Это короче и быстрее.

1 голос
/ 26 апреля 2012

Добавление к ответу meder ...

Существует способ безопасно перебирать объекты, не раздражаясь от унаследованных свойств объекта. hasOwnProperty () на помощь:

for(var i in classes) {
  if (classes.hasOwnProperty(i)) {
    var safeValue = classes[i];
  }
}
0 голосов
/ 05 февраля 2012

Я видел это использованное здесь .

Я не уверен, что (i in this) двойная проверка против 0-n отсеивает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...