2016-10-16 2 views
0

Я чувствую себя немного глупо, чтобы спросить об этом, потому что это должно быть так просто, но я очень расстроен.Использование querySelectorВсе внутри цикла for-in-loop

У меня есть несколько div, которые я хочу показать только по одному, поэтому я хочу скрыть остальные. Мой подход:

var elements = document.querySelectorAll("div"); 

for (i in elements) { 
    elements[i].style.setProperty("display", "none"); 
} 

Firefox всегда говорит elements[i].style.setProperty(); неопределен. Я сделал обходной путь с использованием обычного цикла for без использования in, но мне все равно хотелось бы знать, почему это не работает.

Заранее благодарен!

ответ

2

Заменить

elements[i].style.setProperty("display", "none"); 

с

elements[i].style.display = "none"; 

Как HTMLElement.style свойство возвращает CSSStyleDeclaration объект, представляющий встроенные стили элемента как свойства, т.е. style.property = 'value'

И использовать обычный для цикла, когда итерация по объектам, подобным массивам, которые имеют длину, например nodeLists

var elements = document.querySelectorAll("div"); 

for (var i=0; i<elements.length; i++) { 
    elements[i].style.display = "none"; 
} 
+0

Huh. На самом деле, это то, что я сделал в качестве обходного пути. Я думал, что более правильным кодом будет использовать метод для установки 'style', чем установка его с помощью прямой модификации свойств. И почему я должен использовать обычный цикл for, точно? Я вижу, что это работает, но не почему моя версия не будет ... –

+0

Во-первых, использование цикла 'in..in' выполняет итерацию по всем перечислимым свойствам, что может вызвать проблемы в некоторых редких случаях. Кроме того, в цикле 'for ... in' нет гарантированного порядка, и часто вам нужно будет перебирать элементы по порядку, особенно если они изменяются, поэтому рекомендуется использовать регулярный цикл' for' для нолисты, и поэтому они имеют длину, чтобы быть «подобной массиву». – adeneo

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