JavaScript DOM编程

一、基础知识点

  1、概念:文档对象模型Document  Object  Model,DOM定义了访问和处理HTML文档的标准方法

  2、页面加载过程:

     浏览器接收到html代码,开始解析。解析过程是先构建dom树,再根据dom树构建渲染树,最后浏览器将渲染树绘制到页面上。构建dom树的过程即根 据html代码自上而下进行构建,当遇到script文件加载/执行会阻塞后面dom树的构建(javascript可能会改变dom树),而遇到css文件则会阻塞渲染树的构建,即dom树依然继续构建(除非遇到script标签并且css文件依旧未加载完成),但不会渲染绘制到页面上。

                                               

  3、节点

      Node:构成HTML文档最基本的单元

      分类:

        元素节点:HTML标签

        属性节点:标签的属性,键值对形式,属性名为键,属性值为值

        文本节点:HTML标签中的文本内容

                            

  4、document对象

        document是一个文档节点,代表整个文档,所有节点都是他的后代节点;是window的对象属性,可以直接使用

        每个载入浏览器的 HTML 文档都会成为 Document 对象。

        Document 对象使我们可以从脚本中对 HTML 页面中的所有元素进行访问

二、DOM查询

   1、获取文档元素的子节点:

        通过document对象调用:

            document.getElementById();    通过id属性获取一个元素节点对象

          //查找id为bj的节点
          var btn01=document.getElementById("btn01");    btn01.onclick=function(){ var btnEle=document.getElementById("bj"); alert(btnEle.innerHTML); }

            document.getElementsByTagName();  通过标签名获取一组元素节点对象

          //查找所有li节点
          var btn02=document.getElementById("btn02");    btn02.onclick=function(){ var liEles=document.getElementsByTagName("li"); for(var i=0;i<liEles.length;i++){ alert(liEles[i].innerHTML); } }

            document.getElementsByName();    通过name属性获取一组元素节点对象

          //查找name=genger的所有节点
         var btn03=document.getElementById("btn03");    btn03.onclick=function(){ var Eles=document.getElementsByName("gender"); for(var i=0;i<Eles.length;i++){ alert(Eles[i].value); } }

   2、获取某一元素的子节点

通过具体的元素节点调用
  类型 作用
getElementsByTagName();  方法 返回当前节点的指定标签名的子节点
childNodes 属性 表示当前节点的所有子节点
firstChild  属性 表示当前节点的第一个子节点
lastChild 属性 表示当前节点的最后一个子节点
parentNode 属性 表示当前节点的父节点
previousSibling 属性 表示当前节点的前一个兄弟节点
nextSibling 属性 表示当前节点的后一个兄弟节点

 

 

      元素节点的属性:

          获取:元素对象.属性名

          设置:元素对象.属性名=新的值

      其他属性:

          nodeValue:元素节点nodeValue属性值为null,文本节点可以通过nodeValue属性获取和设置文本节点的内容

          innerHTML:元素节点通过该属性获取和设置标签内部的html代码

3、练习1:

                                          

 

  封装为按钮绑定事件的方法:

1        function myQuery(idStr,func){
2                 var btn=document.getElementById(idStr);
3                 btn.onclick=func;
4             };

                           以下代码都写在window.onload=function(){  }中

  1.查找id为bj的节点

1        myQuery("btn01",function(){
2                 var bjEle=document.getElementById("bj");
3                 alert(bjEle.innerHTML);
4             });

   2.查找所有li节点

1        myQuery("btn02",function(){
2                 var liEles=document.getElementsByTagName("li");
3                 for(var i=0;i<liEles.length;i++){
4                     alert(liEles[i].innerHTML);
5                 }
6             });

  3.查找name=gender的所有节点

1        myQuery("btn03",function(){
2                 var Eles=document.getElementsByName("gender");
3                 for(var i=0;i<Eles.length;i++){
4                     alert(Eles[i].value);
5                 }
6             });

  4.查找id为city的节点下所有li节点

1        myQuery("btn04",function(){
2                 var cityEle=document.getElementById("city")
3                 var liEles=cityEle.getElementsByTagName("li");
4                 for(var i=0;i<liEles.length;i++){
5                     alert(liEles[i].innerHTML);
6                 }
7             });

  5.返回id为city的节点的所有子节点

1        myQuery("btn05",function(){
2                 var cityEle=document.getElementById("city");
3                 var allNodes=cityEle.childNodes;
4                 for(var i=0;i<allNodes.length;i++){
5                     if(allNodes[i].nodeType==1){
6                         alert(allNodes[i].innerHTML);
7                     }
8                 }
9             });

  6.返回id为phone的节点的第一个子节点

1        myQuery("btn06",function(){
2                 var phoneEle=document.getElementById("phone");
3                 var currentNode=phone.firstChild;
4                 while(currentNode.nodeType!=1){
5                     currentNode=currentNode.nextSibling;
6                 }
7                 alert(currentNode.innerHTML);
8             });

  7.返回id为bj的节点的父节点

1        myQuery("btn07",function(){
2                 var bjEle=document.getElementById("bj");
3                 var parNode=bjEle.parentNode;
4                 alert(parNode.innerHTML);
5             });

  8.返回id为android的节点的前一个兄弟节点

1        myQuery("btn08",function(){
2                 var andrEle=document.getElementById("android");
3                 var preNode=andrEle.previousSibling;
4                 while(preNode.nodeType!=1){
5                     preNode=preNode.previousSibling;
6                 }
7                 alert(preNode.innerHTML);
8             });

  9.读取id为username的节点的value属性值

1        myQuery("btn09",function(){
2                 var userEle=document.getElementById("username");
3                 alert(userEle.value);
4             });

  10.设置id为username的节点的value属性值

1        myQuery("btn10",function(){
2                 var userEle=document.getElementById("username");
3                 //userEle.setAttribute("value","邹梦洁");
4                 userEle.value="邹梦洁";
5                 alert(userEle.value); 
6             });

4、练习2

                                   

  封装按钮单击事件按钮函数:

1    function myClick(btnStr,func){
2         var btn=document.getElementById(btnStr);
3         btn.onclick=func;
4     };

  功能实现:

 1 window.onload = function() {
 2         var items=document.getElementsByName("items");
 3         var checkedAllBox=document.getElementById("checkedAllBox");
 4         //①全选按钮checkedAllBtn:点击后所有爱好都选中
 5         myClick("checkedAllBtn",function(){
 6             checkedAllBox.checked=true;
 7             for(var i=0;i<items.length;i++){
 8                 items[i].checked=true;
 9             }
10         });
11         
12         //②全不选按钮checkedNoBtn:点击后所有爱好都不选中
13         myClick("checkedNoBtn",function(){
14             checkedAllBox.checked=false;
15             for(var i=0;i<items.length;i++){
16                 items[i].checked=false;
17             }
18         });
19         
20         //③反选按钮checkedRevBtn:点击后所有爱好选中状态反转
21         myClick("checkedRevBtn",function(){
22             for(var i=0;i<items.length;i++){
23                 items[i].checked=!items[i].checked;
24             }
25             var isAllChecked=true;
26             for(var j=0;j<items.length;j++){
27                 if(!items[j].checked){
28                     isAllChecked=false;
29                 }
30             }
31             checkedAllBox.checked=isAllChecked;
32         });
33         
34         //④提交按钮sendBtn:点击后依次弹出选中内容
35         myClick("sendBtn",function(){
36             for(var i=0;i<items.length;i++){
37                 if(items[i].checked){
38                     alert(items[i].value);
39                 }
40             }
41         });
42         
43         //⑤复选框全选、全不选
44         checkall.onclick=function(){
45             for(var i=0;i<items.length;i++){
46                 items[i].checked=this.checked;   //this表示此函数当前对象
47             }
48         };
49         
50         //⑥全选、全不选复选框根据爱好选择改变状态
51         for(var i=0;i<items.length;i++){
52             items[i].onclick=function(){
53                 var isAllChecked=true;
54                 for(var j=0;j<items.length;j++){
55                     if(!items[j].checked){
56                         isAllChecked=false;
57                     }
58                 }
59                 checkedAllBox.checked=isAllChecked;
60             };
61         }
62             
63     };

 三、DOM增删改

 

方法 描述
createElement("元素名") 创建元素节点 
createAttribute("属性名") 创建属性节点
createTextNode("文本") 创建文本节点
appendChild(新节点) 把新的子节点添加到指定节点,通过父节点添加
insertBefore(新节点,指定节点) 在指定的子节点前面插入新的子节点,通过父节点插入
removeChild(指定节点) 删除子节点,通过父节点删除
replaceChild(新节点,被替换节点) 替换子节点,通过父节点替换
getAttribute(“属性名”) 返回指定的属性值
setAttribute(“属性名”,“属性值”) 把指定属性设置或修改为指定的值

  1、练习1

    页面:

                                    

  封装为按钮添加单击事件的方法

1        function myClick(btnStr,func){
2                 var btn=document.getElementById(btnStr);
3                 btn.onclick=func;
4             };

  功能实现:

 1         window.onload = function() {
 2                 //①创建一个"广州"节点,添加到#city下
 3                 myClick("btn01",function(){
 4                     var cityEle=document.getElementById("city");
 5                     var gzNode=document.createElement("li");
 6                     var textNode=document.createTextNode("广州");
 7                     gzNode.appendChild(textNode);
 8                     cityEle.appendChild(gzNode);
 9                 });
10                 
11                 //②将"广州"节点插入到#bj前面
12                 myClick("btn02",function(){
13                     var bjEle=document.getElementById("bj");
14                     var gzNode=document.createElement("li");
15                     var textNode=document.createTextNode("广州");
16                     gzNode.appendChild(textNode);
17                     bjEle.parentNode.insertBefore(gzNode,bjEle);
18                 });
19                 
20                 //③使用"广州"节点替换#bj节点
21                 myClick("btn03",function(){
22                     var bjEle=document.getElementById("bj");
23                     var gzNode=document.createElement("li");
24                     var textNode=document.createTextNode("广州");
25                     gzNode.appendChild(textNode);
26                     bjEle.parentNode.replaceChild(gzNode,bjEle);
27                 });
28                 
29                 //④删除#bj节点
30                 myClick("btn04",function(){
31                     //自杀
32                     /* var bjEle=document.getElementById("bj");
33                     bjEle.parentNode.removeChild(bjEle); */
34                     //他杀
35                     var cityEle=document.getElementById("city");
36                     cityEle.removeChild(bjEle);
37                     
38                 });
39                 
40                 //⑤读取#city内的HTML代码
41                 myClick("btn05",function(){
42                     var cityEle=document.getElementById("city");
43                     alert(cityEle.innerHTML);
44                 });
45                 
46                 //⑥设置#bj内的HTML代码
47                 myClick("btn06",function(){
48                     var bjEle=document.getElementById("bj");
49                     //bjEle.innerHTML="北京欢迎你"; 
50                     bjEle.firstChild.nodeValue="北京欢迎你";
51                 });
52                 
53             };                

   2、练习2

    页面:

                               

  封装为<a>标签添加删除操作的方法:

 1    function adelete(){
 2         var trEle=this.parentNode.parentNode;  //找到要删除的行
 3         var firstTd=trEle.getElementsByTagName("td")[0];  //找到行的第一个单元格
 4         var name=firstTd.innerHTML;    //获取文本内容
 5         var flag=confirm("你确定要删除"+name+"吗?");  //confirm带有布尔类型的返回值
 6         if(flag){
 7             var table=trEle.parentNode;    //找到要删除行的父节点
 8             table.removeChild(trEle);
 9         }
10         return false;     //a标签onclick事件返回false,取消<a>的默认行为
11     };

  删除、添加功能

 1   window.onload = function(){
 2         //删除
 3         var as=document.getElementsByTagName("a");
 4         for(var i=0;i<as.length;i++){
 5             as[i].onclick=adelete;
 6         }
 7         
 8         //添加
 9         var btn=document.getElementById("addEmpButton");
10         btn.onclick=function(){
11             //获取name,email,salary对象
12             var name=document.getElementById("empName").value;
13             var email=document.getElementById("email").value;
14             var salary=document.getElementById("salary").value;
15             
16             //创建1个tr节点
17             var newtr=document.createElement("tr");
18             
19             //创建4个td节点
20             var nametd=document.createElement("td");
21             var emailtd=document.createElement("td");
22             var salarytd=document.createElement("td");
23             var deletetd=document.createElement("td");
24 
25             //创建4个文本节点
26             var nameText=document.createTextNode(name);
27             var emailText=document.createTextNode(email);
28             var salaryText=document.createTextNode(salary);
29             var deleteText=document.createTextNode("delete");
30             
31             //创建1个a标签,并添加文本
32             var aEle=document.createElement("a");
33             aEle.appendChild(deleteText);
34             aEle.href="#";
35             aEle.onclick=adelete;
36             
37             //将文本节点添加到td节点中
38             nametd.appendChild(nameText);
39             emailtd.appendChild(emailText);
40             salarytd.appendChild(salaryText);
41             deletetd.appendChild(aEle);
42             
43             //将td节点添加到tr中
44             newtr.appendChild(nametd);
45             newtr.appendChild(emailtd);
46             newtr.appendChild(salarytd);
47             newtr.appendChild(deletetd);
48             
49             //获取table节点,并将tr节点添加到table中
50             var table=document.getElementById("employeeTable");
51             table.appendChild(newtr);
52         };
53         
54     };

 

posted @ 2017-11-08 16:12  咕噜噜zmj  阅读(311)  评论(0编辑  收藏  举报