2013-02-19 3 views
0

я в состоянии изменить цвет фона этого элемента:как изменить свойство первого ребенка

<div onmouseover="this.style.backgroundColor='blue'" onmouseout="this.style.backgroundColor='red'" style="background-color:green; width:100px; height:40px;"> 
</div> 

Но я хочу, чтобы изменить цвет первого ребенка, который я предполагал, должен работать как это:

<div onmouseover="this.firstChild.style.backgroundColor='blue'" onmouseout="this.firstChild.style.backgroundColor='red'" style="background-color:green; width:100px; height:40px;"> 

    <div style="background-color:white; height:10px; width:10px; margin:20px;">This is the first child, I think.</div> 

</div> 

Но это не работает. Что не так? Как я могу изменить стиль firstChild?

PS: Я позже хочу использовать display = block и none и некоторые другие свойства (а не только стиль) для ребенка. Цвет был только для тестирования.

+3

Пожалуйста, прекратите использование встроенного CSS/JavaScript. Это не то, как написано программное обеспечение. – meagar

+0

/согласен с @meagar. также, пожалуйста, используйте javascript-библиотеку или фреймворк, например jquery – Populus

+4

@Populus: Почему вы рекомендуете библиотеку JavaScript? У вас нет способа узнать, требует ли ситуация одна. –

ответ

3

Вам нужно будет использовать .firstElementChild, или вам нужно будет избавиться от форматирования пробелов. Это пробел становится текстовым узлом, который является .firstChild.

Свойство .firstElementChild не поддерживается некоторыми более старыми браузерами, поэтому, если вы его поддерживаете, вам нужно будет закрепить его функцией.


<div onmouseover="changeColor(this, 'blue')" onmouseout="changeColor(this, 'red')" style="background-color:green; width:100px; height:40px;"> 

    <div style="background-color:white; height:10px; width:10px; margin:20px;">This is the first child, I think.</div> 

</div> 

function changeColor(el, color) { 
    firstElemChild(el).style.backgroundColor=color; 
} 
function firstElemChild(el) { 
    if (el.firstElementChild) 
     return el.firstElementChild; 

    el = el.firstChild 

    while (el && el.nodeType !== 1) 
     el = el.nextSibling; 

    return el; 
} 
+1

Или проведите по элементам children и найдите первый, который не является текстовым узлом? – Ian

+0

Благодарим вас за этот ответ. Мне нравятся оба ответа и не знаю, какой из них принять. – erik

+2

@erik: Идем дальше и принимаем другую. Для меня это не имеет значения. Но имейте в виду, что некоторые версии IE имеют quirk с '.children' в том, что он будет включать узлы комментариев. Не проблема, если нет комментариев HTML. И FF3 его не поддержал, но на данный момент это не проблема. Для получения дополнительной информации о совместимости посетите http://www.quirksmode.org/compatibility.html –

4

Как "система" уже упоминалось, вы ориентируетесь на текстовый узел, а не узел элемента. Попробуйте использовать children[0] вместо firstChild.

jFiddle here

+0

Спасибо. И дети [i] хороши для всех (большинства) браузеров? – erik

+1

Совместимость браузера для 'children' приведена здесь: https://developer.mozilla.org/en-US/docs/DOM/Element.children – showdev

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