zoukankan      html  css  js  c++  java
  • JavaScript学习笔记7 之DOM文档对象模型

    一、什么是DOM
    Document Object Model
    文档 -------对象 ----模型-------缩写DOM

    DOM是针对HTML和XML文档的一个API(应用程序编程接口)。DOM描绘了一个层次化的节点树,允许开发人员添加、移除和修改页面的某一部分。
    DOM树中的所有节点均可通过JS进行访问。所有HTML元素(节点)均可被修改创建删除

    二、节点类型
    1、节点类型

    HTML 文档中的所有内容都是节点(node):

    整个文档是一个文档节点
    每个 HTML 元素是元素节点
    HTML 元素内的文本是文本节点(回车也是文本节点)
    每个 HTML的属性是属性节点 getAttributeNode("id")
    注释是注释节点

    各节点获取的代码:


    2、nodeName 属性返回节点的名称
    元素节点的 nodeName 是标签名称 ( 大写 )
    属性节点的 nodeName 是属性名称
    文本节点的 nodeName 永远是 #text
    文档节点的 nodeName 永远是 #document
    注释节点的 nodeName 永远是 #comment


    3、nodeValue 属性返回节点的值
    对于元素节点,nodeValue 返回值是undefined 或 null
    对于文本节点,nodeValue 返回文本内容
    对于属性节点,nodeValue 返回属性值
    对于注释节点,nodeValue 返回注释内容
    对于元素节点,用innerHTML设置值 / 获取值

    4nodeType 属性返回一个整数,这个数值代表节点的类型
    常用的节点类型是:
    元素节点 返回 1 属性节点 返回 2 文本节点 返回 3
    注释节点 返回 8 文档节点 返回 9

     1 <body>
     2 <div id="box1">aaa<span>标签11</span></div>
     3 <div id="box2"><!-- 注释abc -->bbb<span>标签22</span></div>
     4 <script>
     5 /*节点的获取*/
     6 var box1=document.getElementById('box1');//元素节点
     7 var box2=document.getElementById('box2');//元素节点
     8 var attr=box1.getAttributeNode('id');//注释节点
     9 var txt=box1.firstChild;//文本节点
    10 var comme=box2.firstChild;//注释节点
    11 var doc=document;//文档节点
    12 
    13 /*nodeName 属性返回节点的名称*/
    14 console.log(box1.nodeName);//DIV(标签名称)---元素节点
    15 console.log(box2.nodeName);//DIV(标签名称)---元素节点
    16 console.log(attr.nodeName);//id(属性名称)---属性节点
    17 console.log(txt.nodeName);//#text---文本节点nodeName永远是#text
    18 console.log(comme.nodeName);//#comment---注释节点的nodeName永远是 #comment
    19 console.log(doc.nodeName);//#document---文档节点的nodeName永远是 #document
    20 
    21 /*nodeValue 属性返回节点的值*/
    22  console.log(box1.nodeValue);//null---元素节点返回值为undefined 或 null
    23  console.log(box1.innerHTML);//aaa<span>标签11</span>对于元素节点,用innerHTML设置值/获取值
    24  console.log(box1.innerText);//aaa标签11
    25  console.log(box2.nodeValue);//null
    26  console.log(attr.nodeValue);//box1
    27  console.log(txt.nodeValue);//aaa
    28  console.log(comme.nodeValue);//注释abc
    29  console.log(doc.nodeValue);//null
    30 
    31 /*nodeType 属性返回一个整数,这个数值代表节点的类型*/
    32 console.log(box1.nodeType);//1--元素节点
    33 console.log(box2.nodeType);//1--元素节点
    34 console.log(attr.nodeType);//2--属性节点
    35 console.log(txt.nodeType);//3--文本节点
    36 console.log(comme.nodeType);//8--注释节点
    37 console.log(doc.nodeType);//9--文档节点
    38 </script>
    39 </body>

    三、节点关系

    childNodes:所有子节点//IE6、7、8支持,其他“不支持”,弃之
    nextSibling:下一个兄弟节点//IE6、7、8支持
    nextElementSibling://其他支持
    previousSibling:上一个兄弟节点
    firstChild : 第一个子节点
    lastChild:最后一个子节点
    children:所有是标签类型的子节点//没毛病,都支持,可直接用
    parentNode:父节点

     1 <body>
     2 <div id="box">
     3     <ul id="list1">
     4         <li>11first<span>aa</span></li>
     5         <li>22<span>bb</span></li>
     6         <li>33new<span>cc</span></li>
     7         <li>44last<span>dd</span></li>
     8     </ul>
     9     <ul id="list2"><li>11<span>aa</span></li><li>22<span>bb</span></li><li>33<span>cc</span></li></ul>
    10 </div>
    11 <script>
    12     var list1=document.getElementById('list1');
    13     var lis2=list1.getElementsByTagName('li')[1];
    14     var list2=document.getElementById('list2');
    15     var lis22=list2.getElementsByTagName('li')[1];
    16 /*1、childNodes:所有子节点*/
    17     /*若按照list1方式缩进写的话,IE6、7、8支持,其他“不支持”
    18     若按照list2方式不缩进写的话,都支持
    19     但一般都按list1的缩进方式写,故弃之*/
    20     var nodes1=list1.childNodes;
    21     var nodes2=list2.childNodes;
    22     alert(nodes1.length);//9(4个元素节点(li)+5个文本节点(回车))
    23     alert(nodes2.length);//3(三个元素节点)
    24 
    25 /*2、nextSibling:下一个兄弟节点*///IE6、7、8支持
    26     var li31=lis2.nextSibling;//IE6、7、8支持,其他不支持
    27     var li32=lis2.nextElementSibling;//其他支持,IE6、7、8不支持
    28     alert(li31.innerHTML);//undefined
    29     alert(li32.innerHTML);//33<span>cc</span>
    30     //为获取下一个兄弟节点封装函数
    31     function nextNode(obj){
    32         if (obj.nextElementSibling) {
    33             return obj.nextElementSibling;//其他支持
    34         } else {
    35             return obj.nextSibling;//IE6、7、8支持
    36         }
    37     }
    38     var li3=nextNode(lis2);
    39     alert(li3.innerHTML);//33new<span>cc</span>
    40 
    41 /*3、previousSibling:上一个兄弟节点*/
    42     function previousNode(obj){//为获取上一个兄弟节点封装函数
    43         if (obj.previousElementSibling) {
    44             return obj.previousElementSibling;//其他支持
    45         } else {
    46             return obj.previousSibling;//IE6、7、8支持
    47         }
    48     }
    49     var li1=previousNode(lis2);
    50     alert(li1.innerHTML);//11first<span>aa</span>
    51 
    52 /*4、firstChild : 第一个子节点*/
    53     function firstChild(obj){
    54         if (obj.firstElementChild) {
    55             return obj.firstElementChild;//其他支持
    56         } else {
    57             return obj.firstChild;//IE6、7、8支持
    58         }
    59     }
    60     var list1child1=firstChild(list1);
    61     alert(list1child1.innerHTML);//11first<span>aa</span>
    62 
    63 
    64 /*5、lastChild:最后一个子节点*/
    65     function lastChild(obj){
    66         if (obj.lastElementChild) {
    67             return obj.lastElementChild;//其他支持
    68         } else {
    69             return obj.lastChild;//IE6、7、8支持
    70         }
    71     }
    72     var list1child4=lastChild(list1);
    73     alert(list1child4.innerHTML);//44last<span>dd</span>
    74 /*6、children:所有是标签类型的子节点*/
    75     lis=list1.children;//都支持,可以直接使用
    76     alert(lis.length);//4
    77     alert(lis[0].innerHTML);//11first<span>aa</span>
    78 /*7、parentNode:父节点*///都支持,可以直接使用
    79     alert(lis[0].parentNode.parentNode.id);//box
    80 </script>
    81 </body>

    四、常见操作节点方法

    1、查找方法:
    document.getElementById('');
    document.getElementsByTagName('');

    2、复制节点:
    cloneNode(boolean) : 复制一个节点
    true:深复制,复制节点及其整个子节点树
    false : 浅复制,只复制节点本身。
    注意:cloneNode()方法不会复制添加到DOM节点中的JavaScript属性,例如事件处理程序等。

    深复制与浅复制对比:

     1 <body>
     2 <div id="box1">
     3     <h1>深复制与浅复制</h1>
     4     <p>深复制,复制节点及其整个子节点树,浅复制,只复制节点本身</p>
     5 </div>
     6 <script>
     7     var box1=document.getElementById('box1');
     8     var box2=box1.cloneNode(true);//深复制
     9     var box22=box1.cloneNode(false);//浅复制
    10     document.body.appendChild(box2);
    11     document.body.appendChild(box22);
    12     //将节点复制到body底部,甚至是js代码下面
    13 </script>
    14 </body>

    3、操作节点:

    createElement("标签名") : 创建新元素
    createTextNode("") : 创建文本节点
    创建方法:document.createElement('div');
    appendChild(node) : 末尾插入一个节点node
    insertBefore(node,targetNode) : target之前插入节点node
    replaceChild(newNode,oldNode) : new替换节点old
    removeChild(node) : 移除父节点的某个子节点

     1 <body>
     2 <ul id="list">
     3     <li>11</li>
     4     <li>22</li>
     5     <li>33</li>
     6 </ul>
     7 <button id="btn">删除</button>
     8 <script>
     9     var list=document.getElementById('list');
    10     var btn=document.getElementById('btn');
    11     var lis=list.children;
    12 /*createElement("标签名") : 创建新元素*/
    13     var newLi1=document.createElement('li');//start、创建元素
    14     var newLi2=document.createElement('li');//start、创建元素
    15 /*把文本节点插入新建节点中--方法一*/
    16     //2、创建文本节点
    17     var txtnode=document.createTextNode('我是createTextNode创建的11');
    18     newLi1.appendChild(txtnode);//3、newLi末尾插入一个文本节点txtnode
    19     list.appendChild(newLi1);//end、list末尾插入一个节点newLi
    20 /*把文本节点插入新建节点中--方法二*/
    21     newLi2.innerHTML='我是innerHTML创建的22';//2、newLi文本中写入文本
    22     list.appendChild(newLi2);//end、list末尾插入一个节点newLi
    23 
    24 
    25 /*insertBefore(node,targetNode) : target之前插入节点node*/
    26     list.insertBefore(newLi1,lis[2]);
    27 /*replaceChild(newNode,oldNode) : new替换节点old*/
    28     list.replaceChild(newLi2,lis[1]);
    29 /*removeChild(node) : 移除父节点的某个子节点*/
    30     btn.onclick=function (){
    31         list.removeChild(lis[1]);
    32     }
    33 </script>
    34 </body>


    五、属性常见操作方法

    获取节点上name属性的值
    getAttribute("name")
    获取节点上type属性
    getAttributeNode("type")
    设置节点上name属性的值为value
    setAttribute("name","value")
    删除节点上的name属性
    removeAttribute("name")

     1 <head>
     2 <meta charset="utf-8">
     3 <title>标题</title>
     4 <style>
     5     *{margin:0; padding:0; list-style:none;}
     6     .red{
     7         background: red;
     8     }
     9     .blue{
    10         background: blue;
    11     }
    12 </style>
    13 </head>
    14 <body>
    15     <div id="box11" abc="0" class="red">1111</div>
    16     <div id="box22" abc="1">2222</div>
    17     <button id="btn">删除</button>
    18 <script>
    19     var box1=document.getElementById('box11');
    20     var box2=document.getElementById('box22');
    21     var btn=document.getElementById('btn');
    22     alert(box1.getAttribute('id'));//box11
    23     //1、获取节点上id属性的值
    24     alert(box1.id);///box11--->常用在获取内置属性
    25     alert(box1.getAttribute('abc'));//0-->常用在获取自定义属性
    26     //2、设置节点上class属性的值为blue
    27     box2.setAttribute('class','blue');
    28     //3、删除属性class
    29     btn.onclick=function (){
    30         box1.removeAttribute('class');
    31     }
    32 </script>
    33 </body>

    六、练习
    微博发布效果:
    点 '发布' 消息显示出来,点 '删除' 则消息删除

  • 相关阅读:
    Java 基础知识总结
    AppScan-文件参数Shell命令注入
    AndroidKiller-下载使用
    代码技巧之常用快捷键的整理
    z-index的特点
    定位元素的异同点
    定位之固定定位
    定位之相对定位
    clear的值和特点及伪元素before和after的使用
    如何让元素消失在我们的视野中(面试题)
  • 原文地址:https://www.cnblogs.com/paulirish/p/dom.html
Copyright © 2011-2022 走看看