Индекс getElementsByClassName не определен, но не весь объект

Я пытаюсь перебрать элементы с определенным классом и прикрепить к ним идентификатор.

var items = document.getElementsByClassName("item");
for(var i = 0; i < items.length; i++)
{
    items[i].id = "item_" + i;
}

console.info(items);

Если я запускаю это, я получаю ошибку Cannot set property 'id' of undefined

Однако console.info(items) возвращает мне правильный набор элементов:

HTMLCollection []
    0: div.item
    1: div.item
    length: 2
    __proto__: HTMLCollection

Но как только я пытаюсь получить индекс console.info(testimonials[0]), это undefined.

HTML:

<div class = "slider">
   <div class = "item">
       Item 1
   </div>
</div>
<div class = "slider">
   <div class = "item">
       Item 2
   </div>
</div>

пожалуйста, поделитесь своим html

brk 11.02.2019 09:52

я попробовал ваш код в скрипке, он работает как положено jsfiddle.net/gx0e26qw

Prakash Saripaka 11.02.2019 10:00

Убедитесь, что ваш DOM отображается перед запуском JS.

Prem Raj 11.02.2019 10:00

@Mango D: проверь мой ответ, он тебе подойдет

Abdul Rauf 11.02.2019 10:17
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
4
697
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Попробуйте использовать

items[i].setAttribute("id", "item_" + i);

Для получения более подробной информации вы можете посетить документацию

https://www.w3schools.com/jsref/met_element_setattribute.asp
https://www.w3schools.com/jsref/met_element_getattribute.asp

Скрипка для этого:

https://jsfiddle.net/abdulrauf618/n14v58zs
Ответ принят как подходящий

Проблема может заключаться в том, что ваш скрипт запускается до того, как DOM будет полностью готов.

Чтобы решить эту проблему, вы можете поместить свой код внизу файла тело.

ИЛИ:

Попробуйте обернуть свой код DOMContentLoaded, это гарантирует, что ваш код будет выполнен, как только DOM будет полностью готов.

<script>
  document.addEventListener("DOMContentLoaded", function(event) {
    var items = document.getElementsByClassName("item");
    for(var i = 0; i < items.length; i++)
    {
      items[i].id = "item_" + i;
    }

    console.info(items);
  });
</script>


<div class = "slider">
   <div class = "item">
       Item 1
   </div>
</div>
<div class = "slider">
   <div class = "item">
       Item 2
   </div>
</div>

Это помогло, спасибо! Но по какой причине я не могу получить доступ к индексу items, хотя, как описано в моем вопросе, я могу получить console.info(items) и получить правильный вывод.

Mango D 11.02.2019 10:04

Проверьте этот код:

<html>
    <head>
        <script>
        window.onload = function(e){ 
            var allItem = document.getElementsByClassName("item");
            for(var i = 0; i < allItem.length; i++)
            {
                document.getElementsByClassName("item")[i].setAttribute("id", "item_" + i);                
            }
        };
        </script>    
    </head>
    <body>
        <div class = "slider">
            <div class = "item" id = "">
                Item 1
            </div>
        </div>
        <div class = "slider">
            <div class = "item" id = "">
                Item 2
            </div>
        </div>

    </body>
</html>

Надеюсь, это поможет вам.

С vanilla js всегда выполняйте операции, связанные с DOM, после того, как DOM готов к использованию. А также перед доступом/работой с любым элементом DOM проверьте, что он не допускает значение NULL (не равен нулю). С помощью этих методов вы не увидите никаких ошибок с элементами DOM, потому что это безопасный способ манипулирования элементами DOM. В обычном цикле всегда кэшируйте array.length. Избегайте использования анонимной функции, она не рассчитана на будущее и не удобна для отладки. Также запишите все js в отдельный файл js. HTML

<div class = "slider">
   <div class = "item">
       Item 1
   </div>
</div>
<div class = "slider">
   <div class = "item">
       Item 2
   </div>
</div>

JS

document.addEventListener("DOMContentLoaded", onDomReadyHandler);

function onDomReadyHandler(event) {
    var items = document.getElementsByClassName('item');
    var itemsLen = items.length;

    for(var i = 0; i < itemsLen; i++) {
      items[i].id = "item_" + i;
    }

    console.info(items);
}

Другие вопросы по теме