Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Как сменить название класса у всех элементов (https://javascript.ru/forum/events/28522-kak-smenit-nazvanie-klassa-u-vsekh-ehlementov.html)

AlexJ 23.05.2012 07:40

Как сменить название класса у всех элементов
 
Задача - имеется некоторое количество элементов на странице с классом X. Как у таковых элементов сменить класс на Y? Подозреваю, что это вообще можно сделать одной строчкой.
Через getElementsByClass чтото не получается, догадываюсь почему.

bot87 23.05.2012 08:38

getElementsByClass не работает в ие http://caniuse.com/getelementsbyclassname ,но есть вариант эмуляции.
Сменить класс элемента для новых браузеров можно через classList .
Для всех используя
Element.className='имя класса'

AlexJ 23.05.2012 09:02

да не в этом дело
function changeclass(classoff,classto)
{
var elems = getElementsByClass(classoff);
for (var i = 0; i < elems.length; i++)
elems[i].className = classto;
}
Функция по какойто причине меняет класс только у каждого второго элемента. При смене класса массив elems коверкается? Я проверял, любое другое действие с элементами на ура. А смена класса с каждым вторым.

Gvozd 23.05.2012 09:25

Цитата:

Сообщение от AlexJ
При смене класса массив elems коверкается?

если вы используете встроенный в браузер document.getElementsByClassName(), то скорее всего так и есть, ведь он же возвращает NodeList, который прочно связан с DOM-деревом и изменяется вместе с ним.
В вашем случае происходит следующее:
1) вы взяли нулевой элемент NodeList, и изменили ему классю
2) так как у него теперь нету того класса, по которомы вы искали, то весь elems перестраивается: из него удаляется нулевой элемент, а все остальные смещаются влево.
3) теперь когда вы берет 1-й элемент elems, то на самом деле вы берете второй элемент от исходного массива.
так, на каждой итерации, elems уменьшается на один элемент, и вы идете только по четным элементам.

так что скопируйте elems в обычный массив, прежде чем делать такие операции, либо попробуйте применить forEach из прототипа массивов, хотя может и не удастся(зачеркнутый вариант оказался нерабочим, как я и думал)

vadim5june 23.05.2012 09:33

попробуйте вместо цикла for цикл while
while(elems.length>0)
elems[0].className = classto;


Часовой пояс GMT +3, время: 19:12.