2014-02-01 3 views
1

Мой код не работает. Я пытаюсь получить доступ к первому ребенку в DIV и установить атрибут, но консоль дает мне эту ошибку:Ошибка при вызове .setAttribute() для первого дочернего элемента элемента

TypeError: Object # has no method 'setAttribute'

Мой код:

<div> 
    <p id="one"><span id="uno">1</span></p> 
    <p id="two"><span id="dos">2</span></p> 
    <p id="three"><span id="tres">3</span></p> 
</div> 
<script> 
var divvy = document.getElementsByTagName("div").item(0) 
divvy.firstChild.setAttribute("style", "color: violet;"); 
</script> 
+0

и ошибка есть ...? –

+1

, поскольку у вас есть пробел между вашими тегами элементов ('div>

'), firstChild - это текстовый индекс, который не имеет функции setAttribute. –

+0

Это в названии, извините –

ответ

5

Используйте коллекцию .children, чтобы избежать текстового узла.

divvy.children[0].setAttribute("style", "color: violet;"); 

В современных браузерах (например, IE9 +), вы можете использовать .firstElementChild вместо .firstChild.

divvy.firstElementChild.setAttribute("style", "color: violet;"); 

И по теме, но я бы не использовать setAttribute, чтобы установить цвет. Я бы использовал свойство .style.

divvy.firstElementChild.style.color = "violet"; 
+0

Ницца. Я не знал о firstElementChild. Похоже, это IE9 +, если кто-то еще задавался вопросом. – Chuck

+0

в современном браузере вы также можете использовать querySelector/querySelectorAll –

+0

@PatrickEvans: Я уверен, что более примитивные методы DOM по-прежнему довольно эффективны, чем querySelector. Не то, чтобы это имело значение во многих случаях, но это все еще имеет значение достаточно часто, чтобы иметь в виду. – Chuck

0

Первый ребенок из DIV является текст узел, содержащий пустое пространство перед элементами P. Вместо этого попробуйте это:

var divvy = document.getElementsByTagName("div").item(0) 
divvy.getElementsByTagName('p')[0].setAttribute("style", "color: violet;"); 

Это явно выбирает первый элемент P.

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