Подтвердить что ты не робот

Как перебрать выбранные элементы с помощью document.querySelectorAll

Я пытаюсь использовать цикл для выбранных элементов, которые запрашиваются с document.querySelectorAll, но как?

Например, я использую:

var checkboxes = document.querySelectorAll('.check');
for( i in checkboxes) {
  console.log(checkboxes[i]);
}

Вывод:

<input id="check-1" class="check" type="checkbox" name="check">
<input id="check-2" class="check" type="checkbox" name="check">
<input id="check-3" class="check" type="checkbox" name="check">
<input id="check-4" class="check" type="checkbox" name="check">
<input id="check-5" class="check" type="checkbox" name="check">
<input id="check-6" class="check" type="checkbox" name="check">
<input id="check-7" class="check" type="checkbox" name="check">
<input id="check-8" class="check" type="checkbox" name="check">
<input id="check-9" class="check" type="checkbox" name="check">
<input id="check-10" class="check" type="checkbox" name="check" checked="">

10
item()
namedItem()

Моя проблема заключается в том, что в конце этот метод возвращает 3 дополнительных элемента. Как я могу правильно это сделать?

4b9b3361

Ответ 1

Цикл

for in не рекомендуется для массивов и объектов типа массива - вы понимаете, почему. Здесь может быть больше, чем просто индексированных по номеру элементов, например, свойство length или некоторые методы, но for in будет проходить через все из них. Используйте

for (var i = 0, len = checkboxes.length; i < len; i++) {
    //work with checkboxes[i]
}

или

for (var i = 0, element; element = checkboxes[i]; i++) {
    //work with element
}

Второй способ не может быть использован, если некоторые элементы массива могут быть ложными (не ваш случай), но могут быть более читабельными, поскольку вам не нужно использовать везде [].

Ответ 2

Хорошая альтернатива:

[].forEach.call(
    document.querySelectorAll('.check'),
    function (el) {
        console.log(el);
    }
);

но, как указано, вы должны использовать цикл for.

Ответ 3

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

var div_list = document.querySelectorAll('div'); // returns NodeList
var div_array = [...div_list]; // converts NodeList to Array
div_array.forEach(div => {

// do something awesome with each div

});

Я код в ES2015 и использую Babel.js, поэтому не должно быть проблем с поддержкой браузера.

Ответ 4

С ES6 существует статический метод Array.from, чтобы воспользоваться преимуществами нестатических методов Array (forEach, map, filter,..):

Array.from(document.querySelectorAll('div')).forEach((element,index) =>

{

     // handle "element"

});

Другое, использование Array.from, поскольку querySelector предоставляет метод item:

var all=document.querySelectorAll('div');
// create range [0,1,2,....,all.length-1]
Array.from({length:all.length},(v,k)=>k).forEach((index)=>{
     let element=all.item(index);
});

Ответ 5

Похоже, что Firefox 50+, Chrome 51+ и Safari 10+ теперь поддерживают функцию .forEach для объектов NodeList. Примечание. .forEach не поддерживается в Internet Explorer, поэтому рассмотрите один из вышеперечисленных подходов, если требуется поддержка IE.

https://developer.mozilla.org/en-US/docs/Web/API/NodeList/forEach

const paragraphs = document.querySelectorAll('p');
paragraphs.forEach(p => console.log(p));
<p>paragraph 1</p>
<p>paragraph 2</p>
<p>paragraph 3</p>
<p>paragraph 4</p>
<p>paragraph 5</p>