JavaScript进阶 - 第9章 DOM对象,控制HTML元素
第9章 DOM对象,控制HTML元素
9-1 认识DOM
文档对象模型DOM(Document Object Model)定义访问和处理HTML文档的标准方法。DOM 将HTML文档呈现为带有元素、属性和文本的树结构(节点树)。
先来看看下面代码:
将HTML代码分解为DOM节点层次图:
HTML文档可以说由节点构成的集合,DOM节点有:
1. 元素节点:上图中<html>、<body>、<p>等都是元素节点,即标签。
2. 文本节点:向用户展示的内容,如<li>...</li>中的JavaScript、DOM、CSS等文本。
3. 属性节点:元素属性,如<a>标签的链接属性href="http://www.imooc.com"。
节点属性:
遍历节点树:
以上图ul为例,它的父级节点body,它的子节点3个li,它的兄弟结点h2、P。
DOM操作:
注意:前两个是document方法。
任务
在JavaScript入门篇中,对DOM进行了基础讲解(http://www.imooc.com/learn/36),我们通过任务来回顾下。
在右边编辑器第11行补充代码,通过getElementById获取id为con的h2标签。
在右边编辑第12行补充代码,修改h2标签的样式,将颜色设为红色。
在右边编辑器第13行补充代码,修改h2标签的样式,将背景颜色设为灰色(#CCC)。
在右边编辑第14行补充代码,通过style.display实现隐藏。
var mychar = document.getElementById("con");
mychar.style.color="red";
mychar.style.backgroundColor ="#ccc";
mychar.style.display="none";
代码:
1 <!DOCTYPE HTML> 2 3 <html> 4 5 <head> 6 7 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 8 9 <title>style样式</title> 10 11 </head> 12 13 <body> 14 15 <h2 id="con">I love JavaScript</H2> 16 17 <p> JavaScript使网页显示动态效果并实现与用户交互功能。</p> 18 19 <script type="text/javascript"> 20 21 var mychar = document.getElementById("con"); 22 23 mychar.style.color="red"; 24 25 mychar.style.backgroundColor ="#ccc"; 26 27 mychar.style.display="none"; 28 29 </script> 30 31 </body> 32 33 </html>
9-2 getElementsByName()方法
返回带有指定名称的节点对象的集合。
语法:
document.getElementsByName(name)
与getElementById() 方法不同的是,通过元素的 name 属性查询元素,而不是通过 id 属性。
注意:
1. 因为文档中的 name 属性可能不唯一,所有 getElementsByName() 方法返回的是元素的数组,而不是一个元素。
2. 和数组类似也有length属性,可以和访问数组一样的方法来访问,从0开始。
看看下面的代码:
运行结果:
任务
试一试,通过name属性来查询元素:
补充第6行代码,获取 name 为 myt 的元素,同时输出获取的元素节点的长度。
var mynode=document.getElementsByName("myt");
代码:
1 <!DOCTYPE HTML> 2 3 <html> 4 5 <head> 6 7 <script type="text/javascript"> 8 9 function getnum(){ 10 11 var mynode=document.getElementsByName("myt"); 12 13 alert(mynode.length); 14 15 } 16 17 </script> 18 19 </head> 20 21 <body> 22 23 <input name="myt" type="text" value="1"> 24 25 <input name="myt" type="text" value="2"> 26 27 <input name="myt" type="text" value="3"> 28 29 <input name="myt" type="text" value="4"> 30 31 <input name="myt" type="text" value="5"> 32 33 <input name="myt" type="text" value="6"> 34 35 36 37 <br /> 38 39 <input type="button" onclick="getnum()" value="看看有几项?" /> 40 41 </body> 42 43 </html>
9-3 getElementsByTagName()方法
返回带有指定标签名的节点对象的集合。返回元素的顺序是它们在文档中的顺序。
语法:
getElementsByTagName(Tagname)
说明:
1. Tagname是标签的名称,如p、a、img等标签名。
2. 和数组类似也有length属性,可以和访问数组一样的方法来访问,所以从0开始。
看看下面代码,通过getElementsByTagName()获取节点。
任务
试一试,使用三种获取节点的方法,完成下面的任务:
在第73行补充代码,通过ID获取标题H1。
在第78行补充代码,通过name获取值为sex的元素。
在第84行补充代码,通过标签名获取input元素。
1. var myH=document.getElementById("myHead");
2. var myS=document.getElementsByName("sex");
3. var myI = document.getElementsByTagName("input");
代码:
1 <!DOCTYPE HTML> 2 3 <html> 4 5 <head> 6 7 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 8 9 <title>JavaScript</title> 10 11 </head> 12 13 <body> 14 15 16 17 <form name="Input"> 18 19 <table align="center" width="500px" height="50%" border="1"> 20 21 <tr> 22 23 <td align="center" width="100px"> 24 25 学号: 26 27 </td> 28 29 <td align="center" width="300px"> 30 31 <input type="text" id=userid name="user" onblur="validate();"> 32 33 <div id=usermsg></div> 34 35 </td> 36 37 </tr> 38 39 <tr> 40 41 <td align="center" width="100px"> 42 43 姓名: 44 45 </td> 46 47 <td align="center"> 48 49 <input type="text" name="name"> 50 51 </td> 52 53 </tr> 54 55 <tr> 56 57 <td align="center" width="%45"> 58 59 性别: 60 61 </td> 62 63 <td align="center"> 64 65 <input type="radio" name="sex" value="男"> 66 67 男 68 69 <input type="radio" name="sex" value="女"> 70 71 女 72 73 </td> 74 75 </tr> 76 77 <tr> 78 79 <td align="center" width="30%"> 80 81 年龄: 82 83 </td> 84 85 <td align="center" width="300px"> 86 87 <input type="text" name="age"> 88 89 </td> 90 91 </tr> 92 93 <tr> 94 95 <td align="center" width="100px"> 96 97 地址: 98 99 </td> 100 101 <td align="center" width="300px"> 102 103 <input type="text" name="addr"> 104 105 </td> 106 107 </tr> 108 109 110 111 </table> 112 113 </form> 114 115 <h1 id="myHead" onclick="getValue()"> 116 117 看看三种获取节点的方法? 118 119 </h1> 120 121 <p> 122 123 点击标题弹出它的值。 124 125 </p> 126 127 <input type="button" onclick="getElements()" 128 129 value="看看name为sex的节点有几个?" /> 130 131 <Br> 132 133 <input type="button" onclick="getTagElements()" 134 135 value="看看标签名为input的节点有几个?" /> 136 137 138 139 <script type="text/javascript"> 140 141 function getValue() 142 143 { 144 145 var myH=document.getElementById("myHead"); 146 147 alert(myH.innerHTML) 148 149 } 150 151 function getElements() 152 153 { 154 155 var myS=document.getElementsByName("sex"); 156 157 alert(myS.length); 158 159 } 160 161 162 163 function getTagElements() 164 165 { 166 167 var myI=document.getElementsByTagName("input"); 168 169 alert(myI.length); 170 171 } 172 173 174 175 </script> 176 177 178 179 </body> 180 181 </html>
9-4 区别getElementByID,getElementsByName,getElementsByTagName以人来举例说明,人有能标识身份的身份证,有姓名,有类别(大人、小孩、老人)等。
1. ID 是一个人的身份证号码,是唯一的。所以通过getElementsById获取的是指定的一个人。
2. Name 是他的名字,可以重复。所以通过getElementsByName获取名字相同的人集合。
3. TagName可看似某类,getElementBysTagName获取相同类的人集合。如获取小孩这类人,getElementsByTagName("小孩")。
把上面的例子转换到HTML中,如下:
<input type="checkbox" name="hobby" id="hobby1"> 音乐
input标签就像人的类别。
name属性就像人的姓名。
id属性就像人的身份证。
方法总结如下:
注意:方法区分大小写
通过下面的例子(6个name="hobby"的复选项,两个按钮)来区分三种方法的不同:
<input type="checkbox" name="hobby" id="hobby1"> 音乐
<input type="checkbox" name="hobby" id="hobby2"> 登山
<input type="checkbox" name="hobby" id="hobby3"> 游泳
<input type="checkbox" name="hobby" id="hobby4"> 阅读
<input type="checkbox" name="hobby" id="hobby5"> 打球
<input type="checkbox" name="hobby" id="hobby6"> 跑步
<input type="button" value = "全选" id="button1">
<input type="button" value = "全不选" id="button1">
1. document.getElementsByTagName("input"),结果为获取所有标签为input的元素,共8个。
2. document.getElementsByName("hobby"),结果为获取属性name="hobby"的元素,共6个。
3. document.getElementById("hobby6"),结果为获取属性id="hobby6"的元素,只有一个,"跑步"这个复选项。
任务
1.在第27行处补充完整,实现当点击"全选"按钮时,将选中所有的复选项。
提示:document.getElementsByTagName("input")获取的是所有inupt标签,包括复选项和按钮,所以要判断是否是复选项,如是选中。
2.在第33行处补充完整,实现当点击"全不选"按钮时,将取消所有选中的复选项。
3.在第40行处补充完整,在文本框中输入输入1-6数值,当点击"确定"按钮时,根据输入的数值,通过id选中相应的复选项。
代码:
1 <!DOCTYPE HTML> 2 <html> 3 <head> 4 <meta http-equiv="Content-Type" content="text/html; charset=gb2312"> 5 <title>无标题文档</title> 6 </head> 7 8 <body> 9 <form> 10 请选择你爱好:<br> 11 <input type="checkbox" name="hobby" id="hobby1"> 音乐 12 <input type="checkbox" name="hobby" id="hobby2"> 登山 13 <input type="checkbox" name="hobby" id="hobby3"> 游泳 14 <input type="checkbox" name="hobby" id="hobby4"> 阅读 15 <input type="checkbox" name="hobby" id="hobby5"> 打球 16 <input type="checkbox" name="hobby" id="hobby6"> 跑步 <br> 17 <input type="button" value = "全选" onclick = "checkall();"> 18 <input type="button" value = "全不选" onclick = "clearall();"> 19 <p>请输入您要选择爱好的序号,序号为1-6:</p> 20 <input id="wb" name="wb" type="text" > 21 <input name="ok" type="button" value="确定" onclick = "checkone();"> 22 </form> 23 <script type="text/javascript"> 24 function checkall(){ 25 var hobby = document.getElementsByTagName("input"); 26 for(i = 0;i < hobby.length;i++){ 27 if(hobby[i].type == "checkbox") 28 { 29 hobby[i].checked = true; 30 } 31 } 32 } 33 function clearall(){ 34 var hobby = document.getElementsByName("hobby"); 35 for(i = 0;i < hobby.length;i++){ 36 hobby[i].checked = false; 37 } 38 } 39 40 function checkone(){ 41 var j=document.getElementById("wb").value; 42 var hobby = document.getElementById("hobby"+j); 43 hobby.checked = true; 44 } 45 46 </script> 47 </body> 48 </html>
9-5 getAttribute()方法
通过元素节点的属性名称获取属性的值。
语法:
elementNode.getAttribute(name)
说明:
1. elementNode:使用getElementById()、getElementsByTagName()等方法,获取到的元素节点。
2. name:要想查询的元素节点的属性名字
看看下面的代码,获取h1标签的属性值:
运行结果:
h1标签的ID :alink
h1标签的title :getAttribute()获取标签的属值
任务
试一试,使用getAttribute()方法,完成下面的任务:
在第20行补充代码,使用getAttribute()方法,获取LI标签的title值。
代码:
1 <!DOCTYPE HTML> 2 3 <html> 4 5 <head> 6 7 <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 8 9 <title>getAttribute()</title> 10 11 </head> 12 13 <body> 14 15 <p id="intro">课程列表</p> 16 17 <ul> 18 19 <li title="第1个li">HTML</li> 20 21 <li>CSS</li> 22 23 <li title="第3个li">JavaScript</li> 24 25 <li title="第4个li">Jquery</li> 26 27 <li>Html5</li> 28 29 </ul> 30 31 <p>以下为获取的不为空的li标签title值:</p> 32 33 <script type="text/javascript"> 34 35 var con=document.getElementsByTagName("li"); 36 37 for (var i=0; i< con.length;i++){ 38 39 var text=con[i].getAttribute("title"); 40 41 if(text!=null) 42 43 { 44 45 document.write(text+"<br>"); 46 47 } 48 49 } 50 51 </script> 52 53 </body> 54 55 </html>
笔记:
①
elementNode.getAttribute(name)
1. elementNode:使用getElementById()、getElementsByTagName()等方法,获取到的元素节点。
2. name:要想查询的元素节点的属性名字
②
con =
document.getElementsByTagName 返回的是数组
可以用 con.item(i ) 或者 con[i] 找到该标签的对象,用
con[i].getAttribute(" id/title/class ") 返回标签内的属性
③
getAttribute()方法
通过元素节点的属性名称获取属性的值。
语法:
elementNode.getAttribute(name)
说明:
1. elementNode:使用getElementById()、getElementsByTagName()等方法,获取到的元素节点。
2. name:要想查询的元素节点的属性名字
④ 注意for循环
9-6 setAttribute()方法
setAttribute() 方法增加一个指定名称和值的新属性,或者把一个现有的属性设定为指定的值。
语法:
elementNode.setAttribute(name,value)
说明:
1.name: 要设置的属性名。
2.value: 要设置的属性值。
注意:
1.把指定的属性设置为指定的值。如果不存在具有指定名称的属性,该方法将创建一个新属性。
2.类似于getAttribute()方法,setAttribute()方法只能通过元素节点对象调用的函数。
任务
试一试,使用getAttribute()和setAttribute()方法,完成下面的任务:
在第21行补充代码,使用getAttribute()方法获取元素属性值,保存在变量text。
在第25行补充代码,使用setAttribute()方法设置title属性值。
1. var text=Lists[i].getAttribute("title");
2. Lists[i].setAttribute("title","WEB前端技术");
代码:
1 <!DOCTYPE HTML> 2 3 <html> 4 5 <head> 6 7 <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 8 9 <title>使用getAttribute()和setAttribute()方法</title> 10 11 </head> 12 13 <body> 14 15 <p id="intro">我的课程</p> 16 17 <ul> 18 19 <li title="JS">JavaScript</li> 20 21 <li title="JQ">JQuery</li> 22 23 <li title="">HTML/CSS</li> 24 25 <li title="JAVA">JAVA</li> 26 27 <li title="">PHP</li> 28 29 </ul> 30 31 <h1>以下为li列表title的值,当title为空时,新设置值为"WEB前端技术":</h1> 32 33 <script type="text/javascript"> 34 35 var Lists=document.getElementsByTagName("li"); 36 37 for (var i=0; i<Lists.length;i++) 38 39 { 40 41 var text=Lists[i].getAttribute("title"); 42 43 document.write(text +"<br>"); 44 45 if(text=="") 46 47 { 48 49 Lists[i].setAttribute("title","WEB前端技术"); 50 51 document.write(Lists[i].getAttribute("title")+"<br>"); 52 53 } 54 55 } 56 57 </script> 58 59 </body> 60 61 </html>
9-7 节点属性
在文档对象模型 (DOM) 中,每个节点都是一个对象。DOM 节点有三个重要的属性 :
1. nodeName : 节点的名称
2. nodeValue :节点的值
3. nodeType :节点的类型
一、nodeName 属性: 节点的名称,是只读的。
1. 元素节点的 nodeName 与标签名相同
2. 属性节点的 nodeName 是属性的名称
3. 文本节点的 nodeName 永远是
#text
4. 文档节点的 nodeName 永远是
#document
二、nodeValue 属性:节点的值
1. 元素节点的 nodeValue 是 undefined 或 null
2. 文本节点的 nodeValue 是文本自身
3. 属性节点的 nodeValue 是属性的值
三、nodeType 属性: 节点的类型,是只读的。以下常用的几种结点类型:
元素类型 节点类型
元素
1
属性 2
文本 3
注释 8
文档 9
任务
试一试,在<script>的标签内容,获取所有LI标签,并输出相应节点的名称、节点的值、节点的类型。
1. 获取li标签使用getElementsByTagName()。
2. 输出所有li元素节点的属性,使用for和 nodeName 、 nodeValue 、nodeType属性。
代码:
1 <!DOCTYPE HTML> 2 3 <html> 4 5 <head> 6 7 <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 8 9 <title>节点属性</title> 10 11 </head> 12 13 <body> 14 15 <ul> 16 17 <li>javascript</li> 18 19 <li>HTML/CSS</li> 20 21 <li>jQuery</li> 22 23 </ul> 24 25 <script type="text/javascript"> 26 27 var list=document.getElementsByTagName("li"); 28 29 for(var i=0; i<list.length; i++) 30 31 { 32 33 document.write(list[i].nodeName+"<br>"); 34 35 document.write(list[i].nodeValue+"<br>"); 36 37 document.write(list[i].nodeType+"<br>"); 38 39 } 40 41 </script> 42 43 </body> 44 45 </html>
9-8 访问子结点childNodes
访问选定元素节点下的所有子节点的列表,返回的值可以看作是一个数组,他具有length属性。
语法:
elementNode.childNodes
注意:
如果选定的节点没有子节点,则该属性返回不包含节点的 NodeList。
我们来看看下面的代码:
运行结果:
IE:
UL子节点个数:3
节点类型:1
其它浏览器:
UL子节点个数:7
节点类型:3
注意:
1. IE全系列、firefox、chrome、opera、safari兼容问题
2. 节点之间的空白符,在firefox、chrome、opera、safari浏览器是文本节点,所以IE是3,其它浏览器是7,如下图所示:
如果把代码改成这样:
<ul><li>javascript</li><li>jQuery</li><li>PHP</li></ul>
运行结果:(IE和其它浏览器结果是一样的)
UL子节点个数:3
节点类型:1
任务
试一试,在script标签内,获取子节点,并输出相应属性。
1. 获取第一个DIV的子节点。
2. 使用for遍历每个节点。
3. 输出相应节点的属性。
注意: 输出内容可能和想的内容不同,想想为什么。
1. 使用getElementsByTagName与childNodes
2. 因为获取的孩子节点是一个数组,所以使用for循环。
3. 输出节点属性,nodeName、nodeType、nodeValue。
var x=document.getElementsByTagName("div")[0].childNodes;
for(i=0;i<x.length;i++){
document.write("节点类型:"+x[i].nodeName+x[i].nodeType+x[i].nodeValue+"<br>");}
代码:
1 <!DOCTYPE HTML> 2 3 <html> 4 5 <head> 6 7 <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 8 9 <title>访问子结点childNodes</title> 10 11 </head> 12 13 <body> 14 15 <div> 16 17 javascript 18 19 <p>javascript</p> 20 21 <div>jQuery</div> 22 23 <h5>PHP</h5> 24 25 </div> 26 27 <script type="text/javascript"> 28 29 var x=document.getElementsByTagName("div")[0].childNodes; 30 31 for(var i=0; i<x.length; i++){ 32 33 document.write("节点类型:"+x[i].nodeName+" "+x[i].nodeType+" "+x[i].nodeValue+"<br />");} 34 35 </script> 36 37 </body> 38 39 </html>
9-9 访问子结点的第一和最后项
一、firstChild
属性返回‘childNodes’数组的第一个子节点。如果选定的节点没有子节点,则该属性返回 NULL。
语法:
node.firstChild
说明:与elementNode.childNodes[0]是同样的效果。
二、 lastChild
属性返回‘childNodes’数组的最后一个子节点。如果选定的节点没有子节点,则该属性返回 NULL。
语法:
node.lastChild
说明:与elementNode.childNodes[elementNode.childNodes.length-1]是同样的效果。
注意: 上一节中,我们知道Internet Explorer 会忽略节点之间生成的空白文本节点,而其它浏览器不会。我们可以通过检测节点类型,过滤子节点。 (以后章节讲解)
任务
试一试,找到指定元素(div)的第一个和最后一个子节点。
1. 第15行输出指定元素(div)的第一个子节点。
2. 第16行输出指定元素(div)的最后一个子节点。
3. 也许结果和你想象的不一样,试着调整代码,输出正确代码。
1. document.write(x.firstChild.nodeName+"<br>");
2. document.write(x.lastChild.nodeName+"<br>");
3. 将 HTML 调整成 <div><p>javascript</p><div>jQuery</div><h5>PHP</h5></div>
代码:
1 <!DOCTYPE HTML> 2 3 <html> 4 5 <head> 6 7 <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 8 9 <title>访问子结点的第一和最后项</title> 10 11 </head> 12 13 <body> 14 15 <div id="con"><p>javascript</p><div>jQuery</div><h5>PHP</h5></div> 16 17 <script type="text/javascript"> 18 19 var x=document.getElementById("con"); 20 21 document.write(x.firstChild.nodeName+"<br />"); 22 23 document.write(x.lastChild.nodeName+"<br "); 24 25 </script> 26 27 </body> 28 29 </html>
9-10 访问父节点parentNode
获取指定节点的父节点
语法:
elementNode.parentNode
注意:父节点只能有一个。
看看下面的例子,获取 P 节点的父节点,代码如下:
<div id="text">
<p id="con"> parentNode 获取指点节点的父节点</p>
</div>
<script type="text/javascript">
var mynode= document.getElementById("con");
document.write(mynode.parentNode.nodeName);
</script>
运行结果:
parentNode 获取指点节点的父节点
DIV
访问祖节点:
elementNode.parentNode.parentNode
看看下面的代码:
<div id="text">
<p>
parentNode
<div id="con"> 获取指点节点的父节点</div>
</p>
</div>
<script type="text/javascript">
var mynode= document.getElementById("con");
document.write(mynode.parentNode.nodeName);
</script>
运行结果:
parentNode
获取指点节点的父节点
DIV
注意: 浏览器兼容问题,chrome、firefox等浏览器标签之间的空白也算是一个文本节点。
任务
试一试,通过获取的mylist节点,使用访问父节点parentNode,将"HTML/CSS"课程内容输出。
补充第30行代码,将"HTML/CSS"课程内容输出。
document.write(mylist.parentNode.parentNode.parentNode.lastChild.innerHTML);
代码:
1 <!DOCTYPE HTML> 2 3 <html> 4 5 <head> 6 7 <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 8 9 <title>访问父节点parentNode</title> 10 11 </head> 12 13 <body> 14 15 <ul id="con"> 16 17 <li id="lesson1">javascript 18 19 <ul> 20 21 <li id="tcon"> 基础语法</li> 22 23 <li>流程控制语句</li> 24 25 <li>函数</li> 26 27 <li>事件</li> 28 29 <li>DOM</li> 30 31 </ul> 32 33 </li> 34 35 <li id="lesson2">das</li> 36 37 <li id="lesson3">dadf</li> 38 39 <li id="lesson4">HTML/CSS 40 41 <ul> 42 43 <li>文字</li> 44 45 <li>段落</li> 46 47 <li>表单</li> 48 49 <li>表格</li> 50 51 </ul> 52 53 </li></ul> 54 55 <script type="text/javascript"> 56 57 var mylist = document.getElementById("tcon"); 58 59 document.write(mylist.parentNode.parentNode.parentNode.lastChild.innerHTML); 60 61 </script> 62 63 64 65 </body> 66 67 </html>
注:浏览器兼容问题,chrome、firefox等浏览器标签之间的空白也算是一个文本节点。这句话在这几节内容里,对程序的理解有很重要的作用
9-11 访问兄弟节点
1. nextSibling 属性可返回某个节点之后紧跟的节点(处于同一树层级中)。
语法:
nodeObject.nextSibling
说明:如果无此节点,则该属性返回 null。
2. previousSibling 属性可返回某个节点之前紧跟的节点(处于同一树层级中)。
语法:
nodeObject.previousSibling
说明:如果无此节点,则该属性返回 null。
注意: 两个属性获取的是节点。Internet Explorer 会忽略节点间生成的空白文本节点(例如,换行符号),而其它浏览器不会忽略。
解决问题方法:
判断节点nodeType是否为1, 如是为元素节点,跳过。
运行结果:
LI = javascript
nextsibling: LI = jquery
任务
试一试,编写get_previousSibling 函数,获得指定节点的上一个节点。
function get_previousSibling(n)
{
var x=n.previousSibling;
while (x.nodeType!=1)
{
x=x.previousSibling;
}
return x;
}
代码:
1 <!DOCTYPE HTML> 2 3 <html> 4 5 <head> 6 7 <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 8 9 <title>nextSibling</title> 10 11 </head> 12 13 <body> 14 15 <ul id="u1"> 16 17 <li id="a">javascript</li> 18 19 <li id="b">jquery</li> 20 21 <li id="c">html</li> 22 23 </ul> 24 25 <ul id="u2"> 26 27 <li id="d">css3</li> 28 29 <li id="e">php</li> 30 31 <li id="f">java</li> 32 33 </ul> 34 35 <script type="text/javascript"> 36 37 function get_nextSibling(n) 38 39 { 40 41 var x=n.nextSibling; 42 43 while (x.nodeType!=1) 44 45 { 46 47 x=x.nextSibling; 48 49 } 50 51 return x; 52 53 } 54 55 56 57 function get_preSibling(n) 58 59 { 60 61 var x=n.previousSibling; 62 63 while(x.nodeType!=1){ 64 65 x=x.previousSibling; 66 67 } 68 69 return x; 70 71 } 72 73 74 75 76 77 var x=document.getElementsByTagName("li")[0]; 78 79 document.write(x.nodeName); 80 81 document.write(" = "); 82 83 document.write(x.innerHTML); 84 85 86 87 var y=get_nextSibling(x); 88 89 90 91 document.write("<br />nextsibling: "); 92 93 document.write(y.nodeName); 94 95 document.write(" = "); 96 97 document.write(y.innerHTML+"<br/><br/>"); 98 99 100 101 var x=document.getElementsByTagName("li")[2]; 102 103 document.write(x.nodeName); 104 105 document.write(" = "); 106 107 document.write(x.innerHTML); 108 109 110 111 document.write("<br />previousSibling: "); 112 113 document.write(y.nodeName); 114 115 document.write(" = "); 116 117 document.write(y.innerHTML); 118 119 </script> 120 121 </body> 122 123 </html>
9-12 创建元素节点createElement
createElement()方法可创建元素节点。此方法可返回一个 Element 对象。
语法:
document.createElement(tagName)
参数:
tagName:字符串值,这个字符串用来指明创建元素的类型。
注意:要与appendChild() 或 insertBefore()方法联合使用,将元素显示在页面中。
我们来创建一个按钮,代码如下:
<script type="text/javascript">
var body = document.body;
var input = document.createElement("input");
input.type = "button";
input.value = "创建一个按钮";
body.appendChild(input);
</script>
效果:在HTML文档中,创建一个按钮。
我们也可以使用setAttribute来设置属性,代码如下:
<script type="text/javascript">
var body= document.body;
var btn = document.createElement("input");
btn.setAttribute("type", "text");
btn.setAttribute("name", "q");
btn.setAttribute("value", "使用setAttribute");
btn.setAttribute("onclick", "javascript:alert('This is a text!');");
body.appendChild(btn);
</script>
效果:在HTML文档中,创建一个文本框,使用setAttribute设置属性值。 当点击这个文本框时,会弹出对话框“This is a text!”。
任务
试一试,实现在HTML文档中创建一个链接,并设置相应属性。
1. 在右边编辑器补充代码,完善createa(url,text)创建链接函数,参数1为链接地址,参数2为链接文本。函数中添加链接地址、文本、文字颜色属性。
2. 调用createa函数,链接地址 http://www.imooc.com,文本为:慕课网
var body= document.body;
//创建链接
function createa(url,text)
{
var a = document.createElement("a");
a.href = url;
a.innerHTML = text;
a.style.color = "red";
body.appendChild(a);
}
// 调用函数创建链接
createa("http://www.imooc.com/","慕课网");
代码:
1 <!DOCTYPE HTML> 2 3 <html> 4 5 <head> 6 7 <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 8 9 <title>创建元素节点createElement</title> 10 11 </head> 12 13 <body> 14 15 <script type="text/javascript"> 16 17 var main = document.body; 18 19 //创建链接 20 21 function createa(url,text) 22 23 { 24 25 var a=document.createElement('a'); 26 27 a.innerHTML=text;//注意innerHTML的转换 28 29 a.setAttribute("href",url); 30 31 a.setAttribute("style","color:red;font-size:24px;"); 32 33 main.appendChild(a); 34 35 } 36 37 // 调用函数创建链接 38 39 createa("http://www.imooc.com","慕课网"); 40 41 </script> 42 43 </body> 44 45 </html>
9-13 创建文本节点createTextNode
createTextNode() 方法创建新的文本节点,返回新创建的 Text 节点。
语法:
document.createTextNode(data)
参数:
data : 字符串值,可规定此节点的文本。
我们来创建一个<div>元素并向其中添加一条消息,代码如下:
运行结果:
任务
在代码编辑器<script>标签中,创建一个P标签,设置className属性,使用createTextNode创建文本节点"I love JavaScript!"。
<script type="text/javascript">
var element = document.createElement("p");
element.className = "message";
var textNode = document.createTextNode("I love
JavaScript!");
element.appendChild(textNode);
document.body.appendChild(element);
</script>
代码:
1 <!DOCTYPE HTML> 2 3 <html> 4 5 <head> 6 7 <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 8 9 <title>创建文本节点createTextNode</title> 10 11 <style type="text/css"> 12 13 14 15 .message{ 16 17 width:200px; 18 19 height:100px; 20 21 background-color:#CCC;} 22 23 24 25 </style> 26 27 </head> 28 29 <body> 30 31 <script type="text/javascript"> 32 33 var p=document.createElement("p"); 34 35 p.className="message"; 36 37 var textNode=document.createTextNode("I love javescript!"); 38 39 p.appendChild(textNode); 40 41 document.body.appendChild(p); 42 43 </script> 44 45 46 47 </body> 48 49 </html>
9-14 插入节点appendChild()
在指定节点的最后一个子节点列表之后添加一个新的子节点。
语法:
appendChild(newnode)
参数:
newnode:指定追加的节点。
我们来看看,div标签内创建一个新的 P 标签,代码如下:
运行结果:
HTML
JavaScript
This is a new p
任务
试一试,完成为UL标签添加一个新项PHP。
1.在代码编辑器中,script标签内,为ul添加一个li。
2.设置li内容为PHP。
代码:
1 <!DOCTYPE HTML> 2 3 <html> 4 5 <head> 6 7 <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 8 9 <title>插入节点appendChild()</title> 10 11 </head> 12 13 <body> 14 15 <ul id="test"> 16 17 <li>JavaScript</li> 18 19 <li>HTML</li> 20 21 </ul> 22 23 24 25 <script type="text/javascript"> 26 27 var otest = document.getElementById("test"); 28 29 var newnode = document.createElement("li"); 30 31 var newtext= document.createTextNode("PHP"); 32 33 newnode.appendChild(newtext); 34 35 otest.appendChild(newnode); 36 37 </script> 38 39 </body> 40 41 </html>
9-15 插入节点insertBefore()
insertBefore() 方法可在已有的子节点前插入一个新的子节点。
语法:
insertBefore(newnode,node);
参数:
newnode:要插入的新节点。
node:可选,指定此节点前插入节点。
我们来看看下面代码,和 appendChild()效果一样。
运行结果:
JavaScript
HTML
This is a new p
我们在来看看下面代码,在指定节点前插入节点。
运行结果:
This is a new p
JavaScript
HTML
注意: otest.insertBefore(newnode,node); 也可以改为: otest.insertBefore(newnode,otest.childNodes[0]);
任务
试一试,在script 标签内补充代码,实现创建一个新li标签,内容为"php",并将新创建的li插入到内容为HTML的标签前。
<body>
<ul id="test"><li>JavaScript</li><li>HTML</li></ul>
<script type="text/javascript">
var otest = document.getElementById("test");
var newnode = document.createElement("li");
newnode.innerHTML = "PHP" ;
otest.insertBefore(newnode,otest.childNodes[1]);
</script>
</body>
代码:
1 <!DOCTYPE HTML> 2 3 <html> 4 5 <head> 6 7 <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 8 9 <title>插入节点insertBefore()</title> 10 11 </head> 12 13 <body> 14 15 <ul id="test"><li>JavaScript</li><li>HTML</li></ul> 16 17 18 19 <script type="text/javascript"> 20 21 var otest = document.getElementById("test"); 22 23 var newnode = document.createElement("li"); 24 25 newnode.innerHTML = "PHP"; 26 27 otest.insertBefore(newnode,otest.childNodes[1]); 28 29 </script> 30 31 32 33 </body> 34 35 </html>
9-16 删除节点removeChild()
removeChild() 方法从子节点列表中删除某个节点。如删除成功,此方法可返回被删除的节点,如失败,则返回 NULL。
语法:
nodeObject.removeChild(node)
参数:
node :必需,指定需要删除的节点。
我们来看看下面代码,删除子点。
运行结果:
HTML
删除节点的内容: javascript
注意: 把删除的子节点赋值给 x,这个子节点不在DOM树中,但是还存在内存中,可通过 x 操作。
如果要完全删除对象,给 x 赋 null 值,代码如下:
任务
试一试,定义clearText()函数,完成节点内容的删除。
1. 删除该节点的内容,先要获取子节点。
2. 然后使用 for 遍历每个子节点。
3. 使用removeChild()删除节点。
function clearText() {
var content=document.getElementById("content");
for(var i=content.childNodes.length-1;i>=0;i--){
var childNode = content.childNodes[i];
content.removeChild(childNode);
}
}
代码:
1 <!DOCTYPE HTML> 2 3 <html> 4 5 <head> 6 7 <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 8 9 <title>删除节点removeChild()</title> 10 11 </head> 12 13 14 15 <body> 16 17 <div id="content"> 18 19 <h1>html</h1> 20 21 <h1>php</h1> 22 23 <h1>javascript</h1> 24 25 <h1>jquery</h1> 26 27 <h1>java</h1> 28 29 </div> 30 31 32 33 <script type="text/javascript"> 34 35 function clearText() { 36 37 var content=document.getElementById("content"); 38 39 // 在此完成该函数 40 41 var j=content.childNodes.length; 42 43 for(var i=0;i<j;i++){ 44 45 var x=content.removeChild(content.childNodes[0]); 46 47 } 48 49 } 50 51 </script> 52 53 54 55 <button onclick="clearText()">清除节点内容</button> 56 57 58 59 </body> 60 61 </html>
9-17 替换元素节点replaceChild()
replaceChild 实现子节点(对象)的替换。返回被替换对象的引用。
语法:
node.replaceChild (newnode,oldnew )
参数:
newnode : 必需,用于替换 oldnew 的对象。
oldnew : 必需,被 newnode 替换的对象。
我们来看看下面的代码:
效果: 将文档中的 Java 改为 JavaScript。
注意:
1. 当 oldnode 被替换时,所有与之相关的属性内容都将被移除。
2. newnode 必须先被建立。
任务
试一试,补充函数 replaceMessage() 代码,实现将 b 标签替换成 i 标签。
function replaceMessage(){
var
oldnode=document.getElementById("oldnode");
var oldHTML= oldnode.innerHTML;
var
newnode=document.createElement("i");
oldnode.parentNode.replaceChild(newnode,oldnode);
newnode.innerHTML=oldHTML;
}
代码:
1 <!DOCTYPE HTML> 2 3 <html> 4 5 <head> 6 7 <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 8 9 <title>替换元素节点replaceChild()</title> 10 11 </head> 12 13 <body> 14 15 16 17 18 19 <div><b id="oldnode">JavaScript</b>是一个很常用的技术,为网页添加动态效果。</div> 20 21 <a href="javascript:replaceMessage()"> 将加粗改为斜体</a> 22 23 24 25 <script type="text/javascript"> 26 27 function replaceMessage(){ 28 29 var oldnode = document.getElementById('oldnode'); 30 31 var oldHTML = oldnode.innerHTML; 32 33 var newnode = document.createElement('i'); 34 35 oldnode.parentNode.replaceChild(newnode,oldnode); 36 37 newnode.innerHTML=oldHTML; 38 39 } 40 41 </script> 42 43 44 45 </body> 46 47 </html>
9-18 浏览器窗口可视区域大小
获得浏览器窗口的尺寸(浏览器的视口,不包括工具栏和滚动条)的方法:
一、对于IE9+、Chrome、Firefox、Opera 以及 Safari:
• window.innerHeight - 浏览器窗口的内部高度
• window.innerWidth - 浏览器窗口的内部宽度
二、对于 Internet Explorer 8、7、6、5:
• document.documentElement.clientHeight表示HTML文档所在窗口的当前高度。
• document.documentElement.clientWidth表示HTML文档所在窗口的当前宽度。
或者
Document对象的body属性对应HTML文档的<body>标签
• document.body.clientHeight
• document.body.clientWidth
在不同浏览器都实用的 JavaScript 方案:
var w= document.documentElement.clientWidth
|| document.body.clientWidth;
var h= document.documentElement.clientHeight
|| document.body.clientHeight;
任务
在script标签内,补充右边编辑器代码,获取浏览器当前窗口大小。
浏览器当前窗口大小的方法,要注意浏览器兼容问题。
代码:
1 <!DOCTYPE HTML> 2 3 <html> 4 5 <head> 6 7 <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 8 9 </head> 10 11 <body> 12 13 <script type="text/javascript"> 14 15 var h=document.documentElement.clientHeight||document.body.clientHeight; 16 17 var w=document.documentElement.clientWidth||document.body.clientWidth; 18 19 document.write("浏览器的高度:"+h+"px,宽度:"+w+"px"); 20 21 </script> 22 23 </body> 24 25 </html>
9-19 网页尺寸scrollHeight
scrollHeight和scrollWidth,获取网页内容高度和宽度(不包括滚动条)。
一、针对IE、Opera:
scrollHeight 是网页内容实际高度,可以小于 clientHeight。
二、针对NS、FF:
scrollHeight 是网页内容高度,不过最小值是 clientHeight。也就是说网页内容实际高度小于 clientHeight 时,scrollHeight 返回 clientHeight 。
三、浏览器兼容性
var w=document.documentElement.scrollWidth
|| document.body.scrollWidth;
var h=document.documentElement.scrollHeight
|| document.body.scrollHeight;
注意:区分大小写
scrollHeight和scrollWidth还可获取Dom元素中内容实际占用的高度和宽度。
任务
在script标签内,补充右边编辑器代码,获取网页的实际宽度和高度。
使用scrollHeight、scrollWidth获取网页的大小时,要注意浏览器兼容问题。
代码:
1 <!DOCTYPE HTML> 2 3 <html> 4 5 <head> 6 7 <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 8 9 10 11 </head> 12 13 <body> 14 15 <script type="text/javascript"> 16 17 var w=document.body.scrollWidth || document.documentElement.scrollWidth; 18 19 var h=document.body.scrollHeight || document.documentElement.scrollHeight; 20 21 document.write(w+"px"+"<br />"+h+"px"); 22 23 </script> 24 25 </body> 26 27 </html>
9-20 网页尺寸offsetHeight
offsetHeight和offsetWidth,获取网页内容高度和宽度(包括滚动条等边线,会随窗口的显示大小改变)。
一、值
offsetHeight = clientHeight + 滚动条 + 边框。
二、浏览器兼容性
var w= document.documentElement.offsetWidth
|| document.body.offsetWidth;
var h= document.documentElement.offsetHeight
|| document.body.offsetHeight;
任务
在script标签内,补充右边编辑器代码,获取网页的宽度和高度,并输出。
使用offsetHeight、offsetWidth获取网页的大小。
代码:
1 <!DOCTYPE HTML> 2 3 <head> 4 5 <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 6 7 </head> 8 9 <body> 10 11 <script type="text/javascript"> 12 13 var w= document.documentElement.offsetWidth 14 15 || document.body.offsetWidth; 16 17 var h= document.documentElement.offsetHeight 18 19 || document.body.offsetHeight; 20 21 document.write("宽:"+w+"px<br />"+"高:"+h+"px"); 22 23 </script> 24 25 </body> 26 27 </html>
9-21 网页卷去的距离
我们先来看看下面的图:
scrollLeft:设置或获取位于给定对象左边界与窗口中目前可见内容的最左端之间的距离 ,即左边灰色的内容。
scrollTop:设置或获取位于对象最顶端与窗口中可见内容的最顶端之间的距离 ,即上边灰色的内容。
offsetLeft:获取指定对象相对于版面或由 offsetParent 属性指定的父坐标的计算左侧位置 。
offsetTop:获取指定对象相对于版面或由 offsetTop 属性指定的父坐标的计算顶端位置 。
注意:区分大小写
任务
在右边编辑器中,调整横竖滚动条后,点击按钮后,查看offsetTop、offsetLeft、scrollTop、scrollLeft值的变化。
注意这四个方法的区别,请仔细学习知识讲解内容。
代码:
1 <!DOCTYPE HTML> 2 3 <head> 4 5 <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 6 7 <script type="text/javascript"> 8 9 function req(){ 10 11 var div = document.getElementById("div1"); 12 13 document.getElementById("li1").innerHTML = (div.offsetTop)+"px";//div1距离屏幕顶部的距离 14 15 document.getElementById("li2").innerHTML = (div.offsetLeft)+"px";//div1距离屏幕左部的距离 16 17 document.getElementById("li3").innerHTML = (div.scrollTop)+"px";//div1纵向滚动条滚动的距离 18 19 document.getElementById("li4").innerHTML = (div.scrollLeft)+"px";//div1横向滚动条滚动的距离 20 21 } 22 23 </script> 24 25 </head> 26 27 <body style="border:10px solid #ccc;padding:0px 0px;margin:5px 10px"> 28 29 <div style="width:60%;border-right:1px dashed red;float:left;"> 30 31 <div style="float:left;"> 32 33 <div id="div1" style="border:5px red solid;height:300px;width:200px;overflow:auto"> 34 35 <div style="height:500px;width:400px">请调整横竖滚动条后,点击按钮后查看offsetTop、offsetLeft、scrollTop、scrollLeft值。</div> 36 37 </div> 38 39 <input type="button" value="点击我!" onclick="req()" style="border: 1px solid purple;height: 25px;"/> 40 41 </div> 42 43 44 45 </div> 46 47 <div style="width:30%;float:left;"> 48 49 <ul style="list-style-type: none; line-height:30px;">结果: 50 51 <li>offsetTop : <span id="li1"></span></li> 52 53 <li>offsetLeft : <span id="li2"></span></li> 54 55 <li> scrollTop : <span id="li3"></span></li> 56 57 <li>scrollLeft : <span id="li4"></span></li> 58 59 </ul> 60 61 </div> 62 63 <div style="clear:both;"></div> 64 65 </body> 66 67 </html>
9-22 编程练习
制作一个表格,显示班级的学生信息。
要求:
1. 鼠标移到不同行上时背景色改为色值为 #f2f2f2,移开鼠标时则恢复为原背景色 #fff
2. 点击添加按钮,能动态在最后添加一行
3. 点击删除按钮,则删除当前行
任务
第一步: 首先,我们创建删除函数,并在删除按钮上添加点击事件;
提示: 使用removeChild()。
第二步: 编写一个函数,供添加按钮调用,动态在表格的最后一行添加子节点;
提示: 使用createElement()、innerHTML、appendChild()。
第三步: 更改鼠标移动改变背景则可以通过给每行绑定鼠标移上事件和鼠标移除事件来改变所在行背景色。
提示:
1. 获取表格的行,getElementsByTagName 。
2. 使用for进行循环,为每行添加事件及背景颜色设置。
代码:
1 <!DOCTYPE html> 2 3 <html> 4 5 <head> 6 7 <title> new document </title> 8 9 <meta http-equiv="Content-Type" content="text/html; charset=gbk"/> 10 11 <script type="text/javascript"> 12 13 window.onload = function(){ 14 15 var tbody = document.getElementById('table').lastChild; 16 17 trs = tbody.getElementsByTagName('tr'); 18 19 for(var i =1;i<trs.length;i++){ 20 21 trs[i].onmouseover = function(){ 22 23 this.style.backgroundColor ="#f2f2f2"; 24 25 } 26 27 trs[i].onmouseout = function(){ 28 29 this.style.backgroundColor ="#fff"; 30 31 } 32 33 } 34 35 } 36 37 function addOne(obj){ 38 39 var tbody = document.getElementById('table').lastChild; 40 41 var tr = document.createElement('tr'); 42 43 44 45 var td = document.createElement("td"); 46 47 td.innerHTML = "<input type='text'/>"; 48 49 tr.appendChild(td); 50 51 52 53 td = document.createElement("td"); 54 55 td.innerHTML = "<input type='text'/>"; 56 57 tr.appendChild(td); 58 59 60 61 td = document.createElement("td"); 62 63 td.innerHTML = "<a href='javascript:;' onclick='deleteRow(this)'>删除</a>"; 64 65 tr.appendChild(td); 66 67 68 69 tbody.appendChild(tr); 70 71 72 73 } 74 75 76 77 function deleteRow(obj){ 78 79 var tbody = document.getElementById('table').lastChild; 80 81 var tr = obj.parentNode.parentNode; 82 83 tbody.removeChild(tr); 84 85 } 86 87 88 89 90 91 </script> 92 93 </head> 94 95 <body> 96 97 <table border="1" width="50%" id="table"> 98 99 <tr> 100 101 <th>学号</th> 102 103 <th>姓名</th> 104 105 <th>操作</th> 106 107 </tr> 108 109 110 111 <tr> 112 113 <td>xh001</td> 114 115 <td>王小明</td> 116 117 <td><a href="javascript:;" onclick="deleteRow(this)">删除</a></td> 118 119 </tr> 120 121 122 123 <tr> 124 125 <td>xh002</td> 126 127 <td>刘小芳</td> 128 129 <td><a href="javascript:;" onclick="deleteRow(this)">删除</a></td> 130 131 </tr> 132 133 134 135 </table> 136 137 <input type="button" value="添加一行" onclick="addOne()" /> 138 139 </body> 140 141 </html>