2016-11-13 5 views
4

У меня есть следующий код яваскрипта (чистый JS, не ЛИЭС), однако, когда его запуска он возвращает только один элемент вместо двухJavascript document.getElementsByClassName не возвращает все элементы

function changeButtonStyles() { 
    var actualButtons = document.getElementsByClassName("read-more"); 
    for (var i = 0; i < actualButtons.length; i++) { 
     actualButtons[i].parentNode.className = "basic"; 
     actualButtons[i].className = "btn btn-xs btn-default"; 
    } 

Он должен вернуть два элемента из страницу, поэтому я могу изменить их оба, но он возвращает только один или цикл только итерации через один. Почему это?

jsfiddle

+0

хорошо вы изменить свой первоначальный класс так после щелчка по верхней ссылке функция выполняется один раз, а затем после нажать на нижняя ссылка функция ничего не делает .. –

ответ

3

Попробуйте выбрать все элементы с помощью метода

document.querySelectorAll(".read-more"); 

Я обновляю скрипку https://jsfiddle.net/rzdkr2gL/7/

И вы можете использовать метод forEach

actualButtons.forEach(function (el) { 
    el.parentNode.className = "basic"; 
    el.className = "btn btn-xs btn-default"; 
}) 

или (рекомендуемый способ)

Array.prototype.forEach.call(actualButtons, function (el) { 
    el.parentNode.className = "basic"; 
    el.className = "btn btn-xs btn-default"; 
}) 

или

NodeList.prototype.forEach.call(actualButtons, function (el) { 
    el.parentNode.className = "basic"; 
    el.className = "btn btn-xs btn-default"; 
}) 

Окончательный код может быть выглядит как https://jsfiddle.net/rzdkr2gL/8/

+2

Это работает, потому что 'querySelectorAll' не возвращает живую коллекцию. – 4castle

+0

Также обратите внимание, что ['forEach'] (https://developer.mozilla.org/en-US/docs/Web/API/NodeList/forEach) не поддерживается в IE или Safari. – 4castle

+0

@ 4castle конкретно IE8 и ниже, частично IE9. Но работает с IE10 и выше http://caniuse.com/#search=foreach – starcorn

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