理解DOM

DOM就是Document Object Model 的缩写,翻译成中文是文档对象模型的意思,国人都这么翻译,这里不纠结它的真正中文意思。先来说说DOM这个东西在js中的各种问题。

DOM是由W3C来定义的,该组织把访文档定义为一个虚拟的物(对象,在程序的世界里,你可以把万事万物都当成对象)

文档:指的是html文档

对象:指的是html文档页面中的元素(也叫节点)

DOM定义了让javascript程序能够去操作文档中的元素节点。DOM把html文档虚拟成一棵树:

 

DOM同时还定义了很多操作文档节点的方法,例如我们经常在用的getElementById,getElementByTagName等。

有了这一点点的铺垫,我们接下就是要开始操作DOM了,代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</script>    
</head>
<body>
    <div id="dvi1">
        <p>
            11111
        </p>
        <ul id="ul1" style="border:1px solid 1px;">
            <li>11111</li>
            <li>22222</li>
            <li>33333</li>
        </ul>
    </div>
</body>
</html>

现在我想获取ul下的子节点,怎么获取?

DOM中,Object对象有一个属性:childNodes,从它的这个s你就能够猜得出来,这是一个集合。

我们先找到ul:

1 var oUl = document.getElementById('ul1');

然后我们就可以通过oUl的属性childNodes来获取它的子节点了:

alert(oUl.childNodes.length);

这句代码会输出oUl下的子字节的个数,不过有个问题来了,在标准浏览器下,输出7,在非标准的IE(<ie9 )下,输出3,什么意思?这种奇葩问题也只有微软才做得到,原来在标准下,节点中的文本也被当成了一个节点,叫文本节点,注意,还有一个:换行也是文本,所以也算一个节点:

 

这回就能解释为啥标准下输出ul的子节点是7个了:三个li+三个文本节点+ 一个换行的空文本节点。

PS,关于DOM节点的一些定义,请看w3c的官方文档:

http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/DOM2-Core.txt

其中,DOM节点(Node)的种类(Node Type)有12种:

 // NodeType
            const unsigned short      ELEMENT_NODE                   = 1;
            const unsigned short      ATTRIBUTE_NODE                 = 2;
            const unsigned short      TEXT_NODE                      = 3;
            const unsigned short      CDATA_SECTION_NODE             = 4;
            const unsigned short      ENTITY_REFERENCE_NODE          = 5;
            const unsigned short      ENTITY_NODE                    = 6;
            const unsigned short      PROCESSING_INSTRUCTION_NODE    = 7;
            const unsigned short      COMMENT_NODE                   = 8;
            const unsigned short      DOCUMENT_NODE                  = 9;
            const unsigned short      DOCUMENT_TYPE_NODE             = 10;
            const unsigned short      DOCUMENT_FRAGMENT_NODE         = 11;
            const unsigned short      NOTATION_NODE                  = 12;

我们平时用得最多的,就是前面的三种了。它们分别是元素节点,属性节点,文本节点。

知道了DOM中的Node 有这么多类型,那我们怎么来判断获取到的childNodes是一个元素节点还是文本节点呢?因为我们很多时间要操作只是元素节点,不需要操作文件节点。

这些DOM都已经帮我们定义好了:

alert(oUl.childNodes[0].nodeType);

nodeType会返回节点的类型,这里输出3,对比上面的NodeType,那3就是TEXT_NODE,即文本。而这个正好是ul和第一个li之间的代码换行。

通过这个nodeType,我们就能精确知道哪个元素,如个是文本,这样我们要操作节点的样式就好办了。

 

然后来看看怎么操作节点的属性,如果获取到一个元素之后 ,那就可以用attributes来获取到元素的属性:

元素.attributes

alert(oUl.childNodes[1].attributes.length);

这里我们简单的返回元素上的属性个数。

其实要操作元素上的属性,我们还有两个方法,可以返回属性的名称和属性值 :

1  alert(oUl.attributes[0].name);
2 alert(oUl.attributes[0].value);

以上代码输出ul上的第一个属性名称和属性的值:id 和 ul1

注意:childNodes只包含一级子节点,不包含子节点下的孙级节点

1 <ul id="ul1" style="border:1px solid 1px;">
2             <li>11111</li>
3             <li>22222</li>
4             <li>33333<p>ppp</p></li>
5         </ul>

 

以上代码中,p标签不会被childNodes返回

 

posted @ 2015-06-13 23:07  newgudi  阅读(474)  评论(0)    收藏  举报