2014-11-02 4 views
2

Я пытаюсь написать это:Javascript для каждого цикла

$('.circle_div').each(function(){ 
     var $this = $(this), 
      thisWidth = $this.width(); 
     $this.css('height', thisWidth + 'px'); 
    }); 

в JavaScript, как это:

var circle_div = document.getElementsByClassName('circle_div'); 
for (el in circle_div){ 
    var thisWidth = el.style.width; 
    el.style.height = thisWidth + "px"; 
} 

Я также попытался for...of и for each и регулярный для контура приращения вара я. Функция jquery работает, но javascript этого не делает. Любая идея, что я делаю неправильно?

ответ

1

Если преобразовать NodeList объект, который возвращает getElementsByCLassName в обычный массив, вы можете использовать метод Array.prototype.forEach на нем:

// Get the divs, and convert the NodeList to a regular array. 
var circle_div = [].slice.call(document.getElementsByClassName('circle_div'), 0); 

circle_div.forEach(function (el) { 
    el.style.height = el.clientWidth + "px"; 
}); 

Этот способ выглядит более похожим на код JQuery.

Проверьте скрипку:http://jsfiddle.net/7ew39phu/


Изменить: Я понимаю, что я должен был использовать clientWidth вместо style.width. Причина в том, что свойства style доступны только в том случае, если они были установлены с использованием JavaScript, а не в том случае, если они были установлены с использованием таблицы sss.

Во всяком случае, я исправил код.

+0

этот вопрос кажется неубедительным. когда я пишу это в javascript, я не могу изменить высоту своих элементов circle_div, но когда я пишу в jquery, он отлично работает. –

+0

@Zack Исправлено, проверьте изменения и скрипку! –

+0

+1 для объяснения! –

3

Eeeck. Никогда не используйте for/in для итерации элементов массива или объекта, подобного массиву (при этом будут включены другие итеративные свойства в дополнение к элементам массива).

Плюс el в вашем цикле - это индекс, а не значение. Вы должны использовать circle_div[index], чтобы получить элемент от nodeList. Но вы должны переключиться на традиционный цикл, а не на for/in.

var circle_div = document.getElementsByClassName('circle_div'); 
for (var i = 0; i < circle_div.length; i++) { 
    var item = circle_div[i]; 
    item.style.height = item.style.width; 
} 

Вы также должны удалить + "px", потому что блоки уже есть в простом JavaScript.

+0

gotcha! я прочитал документацию и просто подумал, что я попробую их всех. –

+0

@ Zack - вы понимаете, что если вы получите ответ, который решает ваш вопрос, тогда вы должны выбрать лучший ответ и нажать зеленую галочку слева от этого ответа. Это вознаграждает человека, предоставившего ответ, и зарабатывает вам очки репутации за правильную процедуру. – jfriend00

+0

извинения, я действительно перешел с моим оригинальным jquery на пару дней, потому что свойство стиля было недоступно _ (см. Объяснение chris-l выше) _ –

0
var circle_div = document.getElementsByClassName('circle_div'); 
for (var i=0,l=circle_div.length; i<l; i++){ 
    circle_div[i].style.height = circle_div[i].style.width; 
} 
+0

К сожалению, это то, что я написал, но это что-то еще. это может быть getElementsByClassName? –

+0

Отредактировано ... хотя похоже, что вы уже получили свой ответ ... – Trott

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