JS中childNodes深入学习

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title></title>
</head>
<body>
    <div id="box">
        <div></div>
        <div></div>
        <div></div>
    </div>

    <script type="text/javascript">
        var getObjByID = function (id) {
            return document.getElementById(id);
        }

        var box = getObjByID("box");

        var child = box.childNodes;

        //初学者可能会以为这里输出的是3,其实不然,结果可能是 3 或者 7
        document.write("box下的子节点个数:" + child.length + "<br/>");

        /*   为什么可能会是7呢,说明如下:

             首先,一个元素的 childNodes 包含了3种类型的节点(元素节点; 属性节点; 文本节点)

             之前之所以会认为输出是3,是因为我们只关注了元素节点(即:里面的3个div),

             忽略了属性节点和文本节点的存在。

             我们可以通过 nodeType 属性来提取各个节点,nodeType值与节点关系如下:

             nodeType === 1 元素节点
             nodeType === 2 属性节点
             nodeType === 3 文本节点

             实现代码如下:

        */

        var arrElements = [], arrAttributes = [], arrTexts = [];

        for (var i = 0; i < child.length; i++) {
            //元素节点
            if (child[i].nodeType === 1) {
                arrElements.push(child[i]);
            }
            //属性节点
            if (child[i].nodeType === 2) {
                arrAttributes.push(child[i]);
            }
            //文本节点
            if (child[i].nodeType === 3) {
                arrTexts.push(child[i]);
            }

            //去除 空白符 文本节点
//            if (child[i].nodeType === 3 && /\S/.test(child[i].nodeValue)) {
//                arrTexts.push(child[i]);
//            }
        }

        /*我们将各个节点分别提取存储在数组中,现在输出查看结果:*/

        document.write("元素节点个数:" + arrElements.length + "<br/>");    //3
        document.write("属性节点个数:" + arrAttributes.length + "<br/>");  //0
        document.write("文本节点个数:" + arrTexts.length + "<br/>");       //4或0

        /*  这里存在一个浏览器兼容问题
            在 firefox,chrome,ie9+ 等浏览器中 文本节点 的个数是 4
            而在 ie8- 浏览器中 文本节点 的个数是 0

            原因:
            在 firefox,chrome,ie9+ 会把 换行(空白符) 也算作一个文本节点
            而在 ie8- 换行(空白符)是不算作文本节点的

            解决方案:
            获取文本节点时,多加一个判断条件,即:如果不是 空白符 则添加,反之则不添加

            代码如下:

            //文本节点
            if (child[i].nodeType === 3 && /\S/.test(child[i].nodeValue)) {
                arrTexts.push(child[i]);
            }

            在上面for循环代码中加上 /\S/.test(child[i].nodeValue) 这个条件后再运行,你就会
            发现所有浏览器 文本节点 个数都是0了

            如果对这个条件不懂的,可以去看下正则和test的用法。
            http://www.jb51.net/tools/zhengze.html

        */

        /*  节点 除了有 nodeType 属性外,还有两个常用属性 nodeName 和 nodeValue

            元素节点的 nodeName 是标签名称
            属性节点的 nodeName 是属性名称
            文本节点的 nodeName 永远是 #text

            因此判断一个节点是否为文本节点,除了 child[i].nodeType === 3
            还可以用 child[i].nodeName == "#text"

            元素节点的 nodeValue 是null
            属性节点的 nodeValue 是属性的值
            文本节点的 nodeValue 是文本节点的内容

            nodeValue 虽然是一个读/写 属性,但不能对 元素节点 设置 nodeValue 值

            将上面的html代码修改如下:

            <div id="box">
                111
                <div></div>
                <div></div>
                <div></div>
            </div>

            加了 111 ,此时运行,文本节点 个数为1,且其nodeValue为 111
            我们可将其打印查看。
            document.write("第1个文本节点的值为:"+ arrTexts[0].nodeValue);

            如果你没加 111, 那么运行此行代码会报错。因为没加 111 的话,文本节点个数为0个
            arrTexts[0] 不存在。
        */

        /*  通常我们都是获取元素节点,因此有个更好的办法

            代码如下:
        */

        var child_div = box.getElementsByTagName("div");

        document.write("box下div元素节点个数:" + child_div.length);

    </script>
</body>
</html>

所有讲解都写在注释里面了,有错误或不足的地方还望大神们指点,谢谢!

JS中childNodes深入学习,布布扣,bubuko.com

时间: 2024-12-05 10:15:12

JS中childNodes深入学习的相关文章

JS中模板嵌套学习(代码)

<script src="script/jquery-1.4.2.js"></script>    <script src="script/jsrender.js"></script>    <script id="header" type="text/x-jsrender">        <tr>               <th>序号&

js中关于prototype学习(2015年1月5号晚)

prototype在js中为原型,只要是对象都有原型,最高原型为Object. 函数作为一特殊的对象,下面探讨prototype(原型)和function(函数)之间的关系. function A (name){ this.name = name; this.f1= function(){ alert("这是A的对象方法,每个对象都可以调用"+this.name); } } A.fA=function (){ alert("这是类方法,只用类可以调用,对象不可以调用"

js 中location 的学习

alert(location.hash);// 空alert(location.host);//返回服务器名称和端口号alert(location.hostname);//返回不带端口号的服务器名称alert(location.href);//返回当前加载页面的完整的URLalert(location.toString());//返回当前加载页面的完整的URLalert(location.pathname);//返回URL的目录和文件名alert(location.port);//返回URL中指

JS中简单的this学习

我在学习JS初期,在使用this的时候经常出现问题,当然就是在现在,也有一些场景不能很好的明白this到底指代的是什么?看下面一个例子: ? 1 2 3 4 5 6 7 8 9 10 var x = 10;    var foo = {        x: 20,        bar: function() {            alert(this.x);        }    }    var bar = foo.bar;    foo.bar();    //20    bar()

JavaScript学习12 JS中定义对象的几种方式【转】

avaScript学习12 JS中定义对象的几种方式 转自:  http://www.cnblogs.com/mengdd/p/3697255.html JavaScript中没有类的概念,只有对象. 在JavaScript中定义对象可以采用以下几种方式: 1.基于已有对象扩充其属性和方法 2.工厂方式 3.构造函数方式 4.原型("prototype")方式 5.动态原型方式 一.基于已有对象扩充其属性和方法 <script type="text/javascript

JavaScript学习12 JS中定义对象的几种方式

JavaScript学习12 JS中定义对象的几种方式 JavaScript中没有类的概念,只有对象. 在JavaScript中定义对象可以采用以下几种方式: 1.基于已有对象扩充其属性和方法 2.工厂方式 3.构造函数方式 4.原型("prototype")方式 5.动态原型方式 一.基于已有对象扩充其属性和方法 <script type="text/javascript"> var object = new Object(); object.name

【JS学习笔记】js中关于传地址的问题

我觉得初学者应该会遇到很多这样的问题 条件1.不想定义全局变量的时候 条件2.定义了外围变量却又要引用并且修改其中内容的时候 以下转一篇文章 -------------------------------------------------------------------------------------------------------------------------------------------------------- 很多人,包括我,受书本知识消化不彻底的影响,认为 J

JavaScript学习-js中的数组/Boolean类/字符串String类

JavaScript学习 [js中的数组] 1.数组的概念:是在内存中连续储存对个有序元素的结构 元素的顺序称为下标,通过下标查找对象元素. 2.数组的声明: ① 字面量声明:var arr1 = []; js中,同一数组,可以储存多种不同的数据类型: 例如: var arr1 = [1,"2",true,{"name":"hahhah"},[1,2]] ② new关键字声明: var arr2 = new Arry(参数) >>&g

js中,表单中的选择框学习与使用总结

选择框脚本 选择框是通过<select>和<option>元素来创建.下面从对选择框的几个操作,来学习,总结Js中操作选择框的方法 一.选择选项 (1)只允许选择一项的选择框,访问选项中的最简单方式,就是使用选择框的selectIndex属性. selectedIndex 属性可设置或返回下拉列表中被选选项的索引号.设置selectedIndex会导致取消以前的所有选项并选择指定的那一项,而读取selectedIndex则只会返回选中项第一项的索引值.注意:若允许多重选择,则仅会返