2010-11-18 2 views

ответ

14

Первой причиной было бы неправильное использование петли for.

JQuery имеет идиомы для цикла по выбранным элементам ..

var top = 0; 
$('.positionableDiv').each(function() { 
    $(this).css('top',top+'px'); 
    top = top + 30; 
}); 

Пожалуйста, обратите внимание на for...in для лучшего понимания образом для ... в цикл работает в JavaScript, он не перечисляет так же, как сказать .NET или Java.

Из статьи:

Хотя это может быть заманчивым использовать это как способ для перебора элементов массива, это плохая идея.

+2

спасибо за указание на мое неправильное использование цикла javascript, вы только что сбили мне немного вреда – Yarin

1

$ ('. PositionableDiv') в вашем заявлении является объектом jQuery с большим количеством свойств. То, что вы хотите, - это итерация через согласованные элементы, которые не выполняются таким образом.

Попытка:

var top = 0; 
$('.positionableDiv').css('top', function(index, value) { 
    var cTop = top; 
    top = top + 30; 
    return cTop + 'px'; 
}); 
+0

Как утверждает Квинтин, использование метода .each() - это более общий способ итерации по коллекции совпадающих элементы. Метод .css() предоставляет способ обработки с помощью функции обратного вызова напрямую, поэтому я продемонстрировал это, как указано выше. Вероятно, в этом случае немного менее понятно, из-за того, что переменная в игре устанавливается после того, как значение нужно вернуть. – Orbling

+0

Я ценю альтернативу, которую вы предоставили, всегда хорошо знать все варианты. Спасибо – Yarin

+0

@Yarin Какой метод является более подходящим, зависит от ситуации. jQuery отличается тем, что делает код кратким и понятным, поэтому приятно видеть ряд аналогичных, но альтернативных методов. – Orbling

2

"За (вар ключ в OBJ)" подходит для перебора членов объекта. Он работает для собственных JavaScript-массивов, пока их прототип не расширен. Объект jQuery может выглядеть как собственный массив JavaScript, но это не значит, что «for (in)» терпит неудачу.

Вы можете использовать .each для перебора объекта jQuery: var top = 0;

$('.positionableDiv').each(function() { 
    $(this).css('top', top); 
    top += 30; 
}); 
+1

Кроме того, даже если это был массив, вы не хотели бы использовать for-in, как указывает @Quintin ... и я только что узнал – Yarin

6

Правильный путь для перебора набора соответствующих элементов с .each, как и другие ответы упоминали. Попытка использовать цикл for..in будет перебирать свойства объекта jQuery, а не элементы, которые он согласовал.

Чтобы немного улучшить некоторые другие примеры .each, вы можете опустить переменную top, чтобы немного почистить вещи. Первый параметр, равный .each, находится в индексе элемента в наборе согласованных элементов; вы можете достичь того же, умножив его на 30 на каждом шаге. Там нет инкрементации и нет top переменного захламления вещи вверх:

$('.positionableDiv').each(function(i) { 
    $(this).css('top', (i * 30) + "px"); 
}); 
3

Это будет работать:

var top = 0; 
for (var pdiv in $('.positionableDiv').get()) { 
    $(pdiv).css('top', top + 'px'); 
    top = top + 30; 
} 

В принципе, можно использовать get() для получения массива элементов.

Смежные вопросы