Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   как изменить css свойсво нескольких елементов? (https://javascript.ru/forum/misc/20591-kak-izmenit-css-svojjsvo-neskolkikh-elementov.html)

IIIgun 10.08.2011 16:46

как изменить css свойсво нескольких елементов?
 
Есть проблема, имееться несколько тегов <a> с одинаковым идом, нужно изменить свойства ссылок при наступлении какого-то события, пытался изменить через document.getElementById(), меняет стиль только первого тега <a>, есть ли способ изменить стиль всех ссылок сразу?

ksa 10.08.2011 16:54

Цитата:

Сообщение от IIIgun
имееться несколько тегов <a> с одинаковым идом

Это уже неправильно. ИД должно быть уникально в пределах страницы...

Цитата:

Сообщение от IIIgun
есть ли способ изменить стиль всех ссылок сразу?

Да. :yes:

devote 10.08.2011 18:00

var a = document.getElementsByTagName('a');
for( var i in a ) {
   a[ i ].className = 'newcssstyle';
}

monolithed 10.08.2011 18:27

devote,
не нужно так делать :nono:

<ul id="ul">
   <li>1</li>
   <li>2</li>
</ul>

<script>
var li = document.getElementById('ul').children, i = li.length;
while(i--) {
     li[i].style.color = 'red';
}
</script>
почему?

e1f 10.08.2011 18:31

Цитата:

Сообщение от monolithed (Сообщение 119569)
devote,
не нужно так делать :nono:

То есть тут проход по массиву через for .. in большее зло, чем затирание className? :blink:

monolithed 10.08.2011 18:34

Цитата:

Сообщение от e1f
То есть тут проход по массиву через for .. in большее зло, чем затирание className?

ну, я имел ввиду проблему в скопе, начиная с определения родителя и реализации

devote 11.08.2011 02:16

Цитата:

Сообщение от monolithed
devote,
не нужно так делать

А в моем случае можно и нужно, ибо getElementsByTagName возвращает не массив а объект "NodeList". Да и для пустого массива можно и хуже не будет. Понимаю что там методы могут быть такие какие добавляет тот же match или еще кто. но тут не match а просто пустой массив. Сотню проектов делал все норм пашет, не вижу смыла городить что-то лишнее. Ну а если он навешает прототипов на Array то конечно так лучше не стоит, но сообщу сразу... Учитывая то что он не в курсе как менять класс сомневаюсь что в ближайшее время он будет работать с прототипами.

Видимо это из-за того, что я не сторонник вешать прототипы на стандарные объекты.. И я не понимаю тех кто это делает.

kobezzza 11.08.2011 03:10

Дык даже если расширили прототип, hasOwnProperty ведь никто же не отменял

melky 11.08.2011 03:12

или модное enumerable:false

devote 11.08.2011 04:13

Цитата:

Сообщение от melky
или модное enumerable:false

верно сказано, полностью согласен с тобой. Повесил прототип, позаботься его скрыть.

B@rmaley.e><e 11.08.2011 08:51

Цитата:

Сообщение от kobezzza
Дык даже если расширили прототип, hasOwnProperty ведь никто же не отменял

Писать больше кода из-за упрямства?
Цитата:

Сообщение от melky
или модное enumerable:false

Есть не везде.
Цитата:

Сообщение от devote
А в моем случае можно и нужно, ибо getElementsByTagName возвращает не массив а объект "NodeList".

Чем частное решение лучше общего?

devote 11.08.2011 08:58

Цитата:

Сообщение от B@rmaley.e><e
Чем частное решение лучше общего?

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

B@rmaley.e><e 11.08.2011 09:32

Цитата:

Сообщение от devote
ничем, просто есть встроенные в ядро возможности перебора объектов, и они работают не для того что бы ими не пользоваться.

Они работают не для того, чтобы использовать их повсеместно. Как-то странно в одном случае итерировать массиво-подобные объекты через for-in, а в другом - как обычно, через for(var i = 0; i < length; ++i)

devote 11.08.2011 09:48

ну при желании можно как многие говорят, все опять же от ситуации зависит:
for( var i = 0; elems[ i ]; i++ ) { ... }

melky 11.08.2011 12:48

можно и

Array.prototype.forEach.call( myNodeList, function(element, index){...} )


а фор иач будет добавляться в прототип для поддержки старых браузеров

как это.. фасад ? :)

Kolyaj 12.08.2011 11:28

Цитата:

Сообщение от melky
можно и

Array.prototype.forEach.call( myNodeList, function(element, index){...} )

В IE не будет работать.

melky 12.08.2011 12:17

Цитата:

Сообщение от Kolyaj (Сообщение 119971)
В IE не будет работать.

из-за того, что нет forEach ?

так реализуют же

или какая-то другая причина?

Kolyaj 12.08.2011 12:20

Ой, нет, я обманул. Это стандартные методы массивов нельзя вызвать в контексте DOM-объектов, а кастомные можно.


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