js中firstChild与firstElementChild及childNodes与children的区别

firstChild:
获取指定元素的第一个子节点 (包括元素节点和文本节点) 。

若父元素与第一个子元素之间存在空白节点,firstChild 获取到的将是空白节点而不是第一个子元素。这时可以使用 firstElementChild 属性 (IE6/7/8 中不支持)。
例:

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0" />
        <title>Document</title>
    </head>
    <body>
        <ul>
            <li>111111 first</li>
            <li>111111</li>
            <li>111111</li>
            <li>111111</li>
            <li>111111</li>
        </ul>
        <script>
            var ul = document.getElementsByTagName("ul")[0];

            alert(ul.firstChild.innerHTML);     // undefined
            alert(ul.firstElementChild.innerHTML);     // 111111 first
        </script>
    </body>
</html>

firstElementChild:
获取指定元素的第一个子元素节点 (不包括文本节点)

childNodes:
返回指定元素的子元素集合,包括html节点,所有属性,文本 (nodeType==1是元素节点,2是属性节点,3是文本节点)。代码中的换行、空格会增加文本节点,因此用它来返回真正的子节点会不准确。
可以通过增加一个节点判断过程来获取准确的子节点:

function childs(element) {
    var nodes = element.childNodes;
    var arr = new Array();

    for (let i = 0; i < nodes.length; i++) {
        if (nodes[i].nodeType == 1) {
            arr[arr.length] = nodes[i];
        }
    }

    return arr;
}

// 按照上面的例子
alert(ul.childNodes.length);       // 11,存在空白节点
alert(childs(ul).length);        // 5,准确

除了IE9和Firefox,其他浏览器都支持通过 childNodes[i] 获取第 i 个子节点。推荐以后使用 children 方法来替代 childNodes。

children:
指DOM Object类型的子对象,返回指定元素的子元素集合 (只包括元素节点,不包括文本节点),且在IE中包含注释节点。
除了IE9和Firefox,其他浏览器都支持通过 children[i] 获取第 i 个子节点。

  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值