в чем различие между getElementById i getElementsByClassName? [дубликат]

319
12 марта 2017, 06:52

На данный вопрос уже ответили:

  • не работает .getElementsByClassName [дубликат] 1 ответ
  • Почему идет ошибка like.addEventListener is not a function? 1 ответ

Собственно сам вопрос: почему когда пишу код по getElementById работает, а с getElementsByclassName не работает ??

Это рабочий код

var img = document.getElementById('images');
var imagesArray = ["img/flower1.jpg", "img/flower2.jpg", "img/flower3.jpg", 
 "img/flower5.jpg", "img/flower6.jpg"];
var index = 0;
function changeimg(){
    img.setAttribute("src" ,imagesArray[index]);
    imdex++;
    if (imdex >= imagesArray.length) {
        imdex = 0;
    }
}
setInterval(changeimg, 5000);

Это не рабочий код

var img = document.getElementsByClassName('images');
var imagesArray = ["img/flower1.jpg", "img/flower2.jpg", "img/flower3.jpg", 
 "img/flower5.jpg", "img/flower6.jpg"];
var index = 0;
function changeimg(){
    img.setAttribute("src" ,imagesArray[index]);
    imdex++;
    if (imdex >= imagesArray.length) {
        imdex = 0;
    }
}
setInterval(changeimg, 5000);
Answer 1

getElementsById - это один элемент, а getElementsByClassName - это живая коллекция элементов. Вообще где указано getElements - это живая коллекция с элементами.

И что бы обратиться к элементу по getElementsByClassName нужно указывать индекс элемента, к которому ты хочешь обратиться. А если ты хочешь ко всем элементом с данным классом, то нужно создавать цикл:

Пример:

var elem = document.getElementsByClassName('class');
for(var i = 0; i < elem.length; i++){
  elem[i].innerHTML = 'Код'
};

Так же можно обращаться через новые функции: querySelector и querySelectorAll

document.querySelector('query selector') - это первый элемент с данным селектором.
document.querySelectorAll('query selector') - все элементы с данным селектором (коллекция элементов. Нужно обращаться через индекс).

Чем примечательная эта функция, так это тем, что в ней можно указывать те же селекторы, что и в CSS. То есть, можно обратиться к элементам по атрибуту - [атрибут="его значение"], по классу .element, по ID - #elem и по всем другим query селекторам.

Answer 2
getElementById
getElementsByClassName
          ^

Второй возвращает коллекцию элементов, а не 1 элемент, как первый.

Answer 3

Потому не работает, что getElementById возвращает один элемент, а getElementsByClassName возвращает массив элементов.

Чтобы получить первый элемент попробуйте написать так:

var img = document.getElementsByClassName('images')[0];

Литература:

MDN: document.getElementsByClassName()

MDN: document.getElementById()

READ ALSO
Как формировать JSON?

Как формировать JSON?

Есть массив строк произвольной длины, например ["12", "31", "3", "12"], назовём его tempКак можно его превратить в подобное представление:

339
Uncaught TypeError: Cannot read property &#39;addEventListener&#39; of undefined

Uncaught TypeError: Cannot read property 'addEventListener' of undefined

Ребят, решил помочь другуТеперь сам маюсь с этим и не знаю, в чем проблема

296
Автовоспроизведение аудио в js

Автовоспроизведение аудио в js

У меня есть html код, где есть аудио в js, и мне бы хотелось реализовать случайный следующий трек и что бы 1 и тот же трек для раза подряд не выпадал,...

318
Скрыть блок с возможностью обращения к нему [требует правки]

Скрыть блок с возможностью обращения к нему [требует правки]

Есть блок с текстом и скрипт, который сохраняет текст в буфер обмена при нажатие на кнопкуКак убрать (скрыть) блок с текстом со страницы, но оставить...

277