更改第一个孩子的文本

hom*_*rrr 2 javascript

我有代码假设找到一个 div 的第一个子节点(div)而不是改变它的内容,这是我的代码:

var headDiv = document.getElementById('sliderContainer');
var childDiv = headDiv.childNodes[0];
childDiv.innerHTML = 'Working';
Run Code Online (Sandbox Code Playgroud)

这似乎不起作用,这是什么问题?

直播:http : //jsbin.com/aqozef/edit#javascript,html,live

完整代码:

<!doctype html>
<html>
<head>
    <script type="javascript">
        function scrollit(){
            var headDiv = document.getElementById('sliderContainer');
            var childDiv = headDiv.childNodes[0];
            childDiv.innerHTML = 'Working';
        }
    </script>
    <style type="text/css">
        #sliderContainer{width:100px;height:100px;overflow:hidden;}
        .sliderContent{width:100px;height:100px;float:left;}
    </style>
</head>

<body>
    <div id="sliderContainer">
        <div class="sliderContent" style="background-color:blue;">s</div>
        <div class="sliderContent" style="background-color:yellow;">a</div>
    </div><br/><br/>
    <button onclick="scrollit();">scroll it</button>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

Fel*_*ing 5

第一个子节点很可能是文本节点而不是元素节点。例如,当您的 HTML 如下所示时,就是这种情况:

<div>
    <div> I'm the first element child</div>
</div>
Run Code Online (Sandbox Code Playgroud)

第一个之后的换行符div和第二个之前的空格是一个文本节点。

要获取元素节点,请使用children [MDN]

headDiv.children[0].innerHTML = "Working";
Run Code Online (Sandbox Code Playgroud)

注意: IE6 - IE8 也包含注释节点children。只要你在那里没有评论,就可以了。


或者,您可以遍历子节点,寻找第一个元素节点:

var child = element.firstChild;
while(child && child.nodeType !== 1) child = child.nextSibling;
Run Code Online (Sandbox Code Playgroud)

参考: Node.firstChild , Node.nodeType, Node.nextSibling


如果你想改变一个文本节点的值,你必须改变nodeValue [MDN]属性:

node.nodeValue = "Working";
Run Code Online (Sandbox Code Playgroud)