文档对象模型DOM概述及DOM树

1.Dom概述

* 什么是DOM

  docuemnt object model 文档对象模型

* 它的作用   

重构整个 HTML 文档。您可以添加、移除、改变或重排页面上的项目

* 分类

Core DOM :   定义了一套标准的针对任何结构化文档的对象 
XML  DOM :   定义了一套标准的针对 XML 文档的对象 
HTML DOM :   定义了一套标准的针对 HTML 文档的对象。 

*.xml介绍

expensible markup language : 可扩展标记语言.
<penson>
<name>张无忌</name>
<age>23</age>
</person>

2.DOM树

* 结点 :   

文档中的每个成分都是一个节点.(包括文本也是节点)

*.结点的属性

a. nodeName(节点名称) 
元素节点的 nodeName 是标签名称 
属性节点的 nodeName 是属性名称 
文本节点的 nodeName 永远是 #text 
文档节点的 nodeName 永远是 #document 


b. nodeValue(节点值) 
对于文本节点,nodeValue 属性包含文本。
对于属性节点,nodeValue 属性包含属性值。
nodeValue 属性对于文档节点和元素节点是不可用的。


c. nodeType(节点类型)  : nodeType 属性可返回节点的类型。
标签节点的类型值是 1
属性节点的类型值是 2
文本节点的类型值是 3
<title>DOM节点的属性</title>
 </head>
 <body>
	<p id = "p">你好</p>
	<script type="text/javascript">
	<!--
		var p = document.getElementById("p") ;
		alert(p.nodeName + " :" + p.nodeValue + ":" + p.nodeType) ; //P:null:1
	//-->
	</script>
 </body>
</html>


*. 结点的分类

整个文档是一个文档节点 
每个 XML 标签是一个元素节点 
包含在 XML 元素中的文本是文本节点 
每一个 XML 属性是一个属性节点 
注释属于注释节点 

*.结点的关系

只有父子和兄弟关系
parentNode  : 父节点
childNodes  :所有的子标签
firstChild  :第一个儿子
lastChild  :最后一个儿子
nextSibling :下一个兄弟节点

previousSibling : 上一个兄弟节点

<title>节点导航</title>
 </head>
 <body>
	<table>
	<tr>
		<td>刘德华</td>
		<td>男</td>
		<td>50</td>
	</tr>
	<tr>
		<td>成龙</td>
		<td>男</td>
		<td>60</td>
	</tr>
	<tr>
		<td>小龙女</td>
		<td>女</td>
		<td>18</td>
	</tr>
	</table>
	<script type="text/javascript">


	
		//示例: 拿到成龙的年龄

		//拿到根节点
		var root = document.documentElement ; //HTML
		//alert(root.nodeName) ;
		//拿到body节点
		var body = root.lastChild ; //BODY
		//alert(body.nodeName) ;
		//拿到table节点
		var table = body.firstChild ; //TABLE
		//拿到tbody节点 
		var tbody = table.firstChild ; //TBODY
		//拿到成龙的年龄
		var age = tbody.firstChild.nextSibling.lastChild.firstChild.nodeValue ;
		alert(age);
	</script>
 </body>
</html>


<title>Document</title>
 </head>
 <body>
		<input type="text" name="name" id = "txt">
		<script type="text/javascript">
		<!--
			//拿到文本框对象
			var txt = document.getElementById("txt") ;
			//拿到属性节点
			var atts = txt.attributes ;
			//拿到name属性的值
			//alert(atts[1].nodeValue) ;
			for(var i = 0 ;i<atts.length ;i++){
				alert(atts[i].nodeName + ":" + atts[i].nodeValue) ;
			}
		//-->
		</script>
 </body>
</html>




*. 对结点进行CRUD操作

*.查找结点

两种方式: 

a. 采用节点之间的关系去拿 根节点: document.documentElement ;

b. 采用方法去拿
getElementById() : 根据标签的ID拿到此标签节点
getElementsByTagName() : 根据标签的名字拿到此标签节点数组
getElementsByName(): 适用于表单控件。根据标签的name属性值拿到控件的数组。
<title>获取标签节点对象的方法</title>
 </head>
 <body>
	 <p name = "p">你好</p>
	 <input type="text" name="username"><br>
	 <input type="text" name="username"><br>
	 <input type="text" name="username"><br>
	 <script type="text/javascript">
	 <!--
		   //采用document.getElementById()
		   //第二种方法
		   //document.getElementsByName: 只能用于表单对象
		  /* var p = document.getElementsByName("p") ;
		   //alert(p.length) ;  //拿不到
			var inputs = document.getElementsByName("username") ;
			//alert(inputs.length) ;
			inputs[1].value = "你好" ;*/

			//第三种方式
			var ps = document.getElementsByTagName("p") ;
			//alert(ps.length) ;
			alert(ps[0].firstChild.nodeValue) ;
	 //-->
	 </script>
 </body>
</html>


<title>Document</title>
 </head>
 <body>
	<h1 id = "h1">明天休息</h1>
	<script type="text/javascript">
	<!--
		//示例: 拿到明天休息的文本
		//第一种方法
		//var h1 = document.getElementById("h1") ;
		//第二种方式
		var h1 = document.getElementsByTagName("h1") ;
		alert(h1[0].innerHTML) ;
		//alert(h1.innerHTML) ;
		//alert(h1.firstChild.nodeValue) ;
		//alert(h1.lastChild.nodeValue) ;
		 //alert(h1.innerText) ;

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


<title>Document</title>
 </head>
 <body>
   <ul>
		<li id="bj" value="beijing">
			北京
			<h1>海淀</h1>
			奥运
		</li>
		<li id="sh" value="shanghai">
			上海
		</li>
		<br/>
		<input type="button" value="li取值" οnclick="getLi()"/>
	</ul>
	
	<script type="text/javascript">
	<!--
		function getLi(){
			//拿到北京节点
			var li = document.getElementById("bj") ;
			//拿到北京节点的所有儿子
			var childs = li.childNodes ;
			for(var i = 0 ; i<childs.length ;i++){
				//alert(childs[i].nodeName + ":" + childs[i].nodeValue + ":" + childs[i].nodeType ) ;
				if(childs[i].nodeType == 1){
					alert(childs[i].firstChild.nodeValue) ;
				}else{
					alert(childs[i].nodeValue) ;
				}
			}
		}
	//-->
	</script>
 </body>
</html>

<title>获取下拉框的文本的值</title>
 </head>
 <body>
	<select name="edu" id="edu">
		<option value="本科">本科</option>
		<option value="专科">专科</option>
		<option value="高中">高中</option>
		<option value="小学">小学</option>
		<option value="幼儿园">幼儿园</option>
	</select>


	<script type="text/javascript">
	<!--
		var ops = document.getElementsByTagName("option") ;
		for(var  i =0 ; i<ops.length ;i++){
			//alert(ops[i].text) ;
			alert(ops[i].innerHTML) ;
		}
	//-->
	</script>
 </body>
</html>

*.删除结点

removeChild() : 采用父节点删除子节点

*创建节点:

document.createElement()  : 创建一个标签节点
docuemnt.createTextNode("内容") :创建一个文本节点
节点的setAttribute() :添加属性节点

<title>添加表格行</title>
 </head>
	<script type="text/javascript">
	<!--
		function addtr(){
			//拿到填写的信息
			var name = document.getElementById("name").value ;
			var email = document.getElementById("email").value ;
			var age = document.getElementById("age").value ;

			//创建一个行及4个单元格
			var tr = document.createElement("tr") ;

			//创建4个单元格,并赋值
			var nameTd = document.createElement("td") ;
			nameTd.innerHTML = name ;
			var emailTd = document.createElement("td") ;
			emailTd.innerHTML = email ;
			var ageTd = document.createElement("td") ;
			ageTd.innerHTML = age ;
			var btnTd = document.createElement("td") ;
			btnTd.innerHTML = "<button onclick = 'delTr(this)'>删除</button>" ;

			//组合各个控件“”
			tr.appendChild(nameTd) ;
			tr.appendChild(emailTd) ;
			tr.appendChild(ageTd) ;
			tr.appendChild(btnTd) ;

			//拿到第二个表格对象
			var table = document.getElementsByTagName("table")[1] ;

			//将创建的新行添加到tbody中
			table.firstChild.appendChild(tr);
		}

		function delTr(btn){
			//删掉行
			//采用removeChild()
			//父亲(tbody)干掉儿子(tr)
			//拿到曾爷爷
			var tbody = btn.parentNode.parentNode.parentNode ;
			//拿到爷爷
			var tr =  btn.parentNode.parentNode ;
			//曾爷爷干掉爷爷
			tbody.removeChild(tr);
		}
	//-->
	</script>
 <body>
   <table width = 600 height = 100 align = center>
      <tr>
		<td>姓名:</td>
		<td><input type="text" name="" id = "name"></td>
		<td>邮箱:</td>
		<td><input type="text" name="" id = "email"></td>
		<td>年龄</td>
		<td><input type="text" name="" id = "age"></td>
      </tr>
      <tr>
		<td align = "center" colspan = "6"> <input type="button" value="添加" οnclick="addtr()"></td>		
      </tr>
      </table>
	  <br>
	  <br>
	  <br>
	  <br>
	  <hr>
	  <table width = "500" border =1 align = center>
		  <tr>
			<td>姓名</td>
			<td>邮箱</td>
			<td>年龄</td>
			<td>操作</td>
		  </tr>
	  </table>

*.添加结点

appendChild() : 添加子节点

<title>添加下拉框选项</title>
 </head>
	<script type="text/javascript">
	<!--
		function addOptions(){
			//创建一个新的节点
			//第一种方式
			/*var option = document.createElement("option") ;
			option.value = "小学" ;
			option.text = "小学" ;
			//或者通过创建option的方式:
			/* var option = new Option() ;
				  option.text = "小学" ;  //text:设置或返回某个选项的纯文本值。
				  option.value = "小学" ;*/  //value:设置或返回被送往服务器的值。

			//拿到下拉框,加入小学
			document.getElementsByTagName("select")[0].options.add(option) ;*/
			//options集合可返回包含 <select> 元素中所有 <option> 的一个数组。
			
			//第二种方式
			//获得select对象
			//var select = document.getElementsByTagName("select")[0] ;

			//select.innerHTML = select.innerHTML + "<option value = '小学'>小学</option>" ;

			//第三种
			var option = document.createElement("option") ;
			option.value = "小学" ;
			option.text = "小学" ;

			//获得select对象
			var select = document.getElementsByTagName("select")[0] ;
			select.appendChild(option); 


		}

		function fun(){
			//拿到div对象
			var d = document.getElementById("d") ;
			//创建一个img标签对象
			var img = document.createElement("img") ;
			//指定属性
			img.src = "images/1.jpg" ;
			img.style.width = "200px" ; //css中的属性 ,必须带单位
			img.height = "300" ; //html中的属性,可以不要单位

			//将图片添加到div标签中
			d.appendChild(img) ;
		}
	//-->
	</script>
 <body>
	<input type="button" value="添加选项" οnclick="addOptions()"/>
	<input type="button" value="添加一副图片" οnclick="fun()">
	<select>
		<option>本科</option>
		<option>专科</option>
		<option>高中</option>
		<option>初中</option>
	</select>
	
	<div id = "d"></div>

 </body>
</html>


*.修改或替换结点

replaceNode(): 替换节点(适用于IE)

replaceChild() : 替换子节点

<title>替换节点的操作</title>
 </head>
	<script type="text/javascript">
	<!--
		function changeNode(){
			//拿到北京节点
			var bjNode = document.getElementById("bj");
			//拿到打灰机对象
			var gameNode = document.getElementById("game");
			//替换
			//bjNode.replaceNode(gameNode) ;
			//bjNode.parentNode.replaceChild(gameNode,bjNode) ;

			//克隆一份打灰机
			var node = gameNode.cloneNode(true) ;
			//布尔类型的参数:true:连内容一起复制
			//false:只复制标签 ,不复制内容
			
			
			bjNode.parentNode.replaceChild(node,bjNode) ;

		}
	//-->
	</script>
 <body>
	 <ul >
		<li id="bj" οnclick="changeNode()">北京</li>
		<li>湖南</li>
		<li>山东</li>
	</ul>
	<ul>
		<li  id="game">打<p>灰机</p></li>
		<li>抓泥鳅</li>
		<li>斗地主</li>
	</ul>
	
 </body>
</html>

<title>Document</title>
 </head>
	<script type="text/javascript">
	<!--
		function checkAll(flag){
			//拿到所有的多选框
			var hobbys = document.getElementsByName("hobby") ;
			//循环赋值
			for(var i =0 ;i<hobbys.length ;i++){
				hobbys[i].checked = flag ;
			}
		}

		function reverseCheck(){
			//拿到所有的多选框
			var hobbys = document.getElementsByName("hobby") ;
			//循环赋值
			for(var i =0 ;i<hobbys.length ;i++){
				hobbys[i].checked = !hobbys[i].checked ;
			}
		}
	//-->
	</script>
 <body>
   <h1>请选择你的爱好:</h1>
  全选/全不选<input type="checkbox" name="hobbys" οnclick="checkAll(this.checked)" /><br/>
 <input type="checkbox" name="hobby" value="football"/>足球
 <input type="checkbox" name="hobby" value="basketball" />篮球
 <input type="checkbox" name="hobby" value="swim" />游泳
 <input type="checkbox" name="hobby" value="singing"/>唱歌<br/>

 <input type="button" value="全选" οnclick="checkAll(true)"/> <input type="button" value="全不选" οnclick="checkAll(false)"/>
 <input type="button" value="反选" οnclick="reverseCheck()"/> </body>



 </body>
</html>

在javascript中想调用html代码: 只能通过属性innerHTML
在javascript中想调用CSS代码: 只能通过属性clasName可以调用样式表

 .style.属性

<title>移动下拉框选项(单项)</title>
 </head>
	<script type="text/javascript">
	<!--
		function removeLeft(){
			//拿到左边下拉框的对象
			var leftSel = document.getElementById("left") ;
			//拿到右边的下拉框对象
			var rightSel = document.getElementById("right") ;
			
			//拿到左边下拉框选中的option
			var op = leftSel.options[leftSel.selectedIndex] ; //leftSel.selectedIndex:选中项的索引

			//将选中选项添加到右边下拉框中
			rightSel.appendChild(op) ;
		}

		function removeLeftAll(){
			//拿到左边下拉框的对象
			var leftSel = document.getElementById("left") ;
			//拿到右边的下拉框对象
			var rightSel = document.getElementById("right") ;
			
			//循环添加
			var length = leftSel.options.length ;
			for(var i =0 ;i < length ;i++){
				rightSel.appendChild(leftSel.options[0]);
			}

		}
	//-->
	</script>
 <body>
	<table align="center">
		<tr>
			<td>
				<select size="10" id="left"> <!--size属性 表示当前显示多少项-->
					<option>选项1</option>
					<option>选项2</option>
					<option>选项3</option>
					<option>选项4</option>
					<option>选项5</option>
					<option>选项6</option>
					<option>选项7</option>
					<option>选项8</option>

				</select>
			</td>
			<td>
				<input type="button" value="--->" οnclick="removeLeft()"/><br/>
				<input type="button" value="===>" οnclick="removeLeftAll()"/><br/>
				<input type="button" value="<---" οnclick=""/><br/>
				<input type="button" value="<===" οnclick=""/><br/>
			</td>
			<td>
				<select size="10" id="right">

					<option>选项9</option>
				</select>
			</td>
		</tr>
	</table>

 </body>
</html>

<title>下拉框选项的移动(多项)</title>
 </head>
	<script type="text/javascript">
	<!--
		function removeLeft(){
			//拿到左边下拉框的对象的option数组
			var leftOps = document.getElementById("left").options ;
			//拿到右边的下拉框对象
			var rightSel = document.getElementById("right") ;
			
			for(var i = 0 ; i < leftOps.length ; i++){
				if(leftOps[i].selected){
					//说明选中了
					rightSel.appendChild(leftOps[i]) ;
					i--;
				}
			}
		}

		function removeLeftAll(){
			//拿到左边下拉框的对象
			var leftSel = document.getElementById("left") ;
			//拿到右边的下拉框对象
			var rightSel = document.getElementById("right") ;
			
			//循环添加
			var length = leftSel.options.length ;
			for(var i =0 ;i < length ;i++){
				rightSel.appendChild(leftSel.options[0]);
			}

		}
	//-->
	</script>
 <body>
  <table align="center">
		<tr>
			<td>
				<select size="10" id="left" multiple> <!--multiple:选择多项-->
					<option>选项1</option>
					<option>选项2</option>
					<option>选项3</option>
					<option>选项4</option>
					<option>选项5</option>
					<option>选项6</option>
					<option>选项7</option>
					<option>选项8</option>

				</select>
			</td>
			<td>
				<input type="button" value="--->" οnclick="removeLeft()"/><br/>
				<input type="button" value="===>" οnclick="removeLeftAll()"/><br/>
				<input type="button" value="<---" οnclick=""/><br/>
				<input type="button" value="<===" οnclick=""/><br/>
			</td>
			<td>
				<select size="10" id="right">

					<option>选项9</option>
				</select>
			</td>
		</tr>
	</table>
 </body>
</html>







  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值