DOM

一、DOM

1.简介

Document Object Model,文档对象模型,主要操作整个文档

可以使用js中DOM中对象的属性和方法,操作html和css

工作原理:想要对标记性文档【html】进行操作,首先需要将标记性文档中的所有内容【包括元素,属性,文本】封装成对象,封装成对象的目的是为了使用其中的属性和方法

明确一点:在加载html页面时,web浏览器会生成一个树形结构,用来表示页面的内部结构,DOM被称为由节点组成的节点树

2.常用方法和属性
2.1元素节点对象的获取方式

getElementById():根据指定的id属性值获取元素对象

getElementByTagName():根据指定的标签名称获取元素对象

getElementByName():根据指定的name属性值获取元素对象

getElementByClassName():根据指定的class属性值获取元素对象

代码演示:

<!DOCTYPE html>
<html>
	<head>aaaa
		<meta charset="UTF-8">
		<title></title>
	</head>
	<body>
		<!--<input type="text" id="input1" value="aaaa" />
		<input type="text" id="input2" value="bbbb" />
		<input type="text" name="input1" value="aaaa" />
		<input type="text" class="input2" value="bbbb" />
		<input type="text" name="input1" value="aaaa" />
		<input type="text" class="input2" value="bbbb" />-->
		
		
		<input type="text" class="class1" value="bbbb" id="id1" name="name1"/>
		
		<!--
getElementById():根据指定的id属性值获取元素对象

getElementByTagName():根据指定的标签名称获取元素对象

getElementByName():根据指定的name属性值获取元素对象

getElementByClassName():根据指定的class属性值获取元素对象

		-->
		<script>
			//1.getElementById():根据id的值获取标签对象,获取的结果只有一个,就是标签对象
			//注意:一个id值只能在一个html页面中使用一次
			var input1 = document.getElementById("input1");
			document.write(input1);
			document.write("<br />");
			//获取标签对象中属性的值:对象.属性
			document.write(input1.value);
			//设置值
			input1.value = "hello";
			
			document.write("<br />");
			
			//2.getElementByTagName(),返回的是元素集合,如果要获取其中的某个标签对象,需要通过遍历
			var input2 = document.getElementsByTagName("input");
			document.write(input2);
			document.write("<br />");
			
			document.write(input2.length);
			document.write("<br />");
			
			//遍历集合,获取其中的每个标签对象
			for(var i = 0;i < input2.length;i++){
				document.write(input2[i]);
				document.write("<br />");
				document.write(input2[i].value);
			}
			
			//3.getElementByName()
			var input3 = document.getElementsByName("input1");
			document.write(input3);
			document.write("<br />");
			
			document.write(input3.length);
			
			
			//4.getElementByClassName()
			var input4 = document.getElementsByClassName("input2");
			document.write(input4);
			document.write("<br />");
			
			document.write(input4.length);
			
			
			
			/*getElementById:元素对象
			 * getElementByTagName:HTMLCollection
			 * getElementByClassName:HTMLCollection
			 * getElementByName:NodeList
			 * 统统当做数组处理,遍历获取元素对象
			 */
			
			
			//特殊情况:如果标签只有一个
			document.getElementById("id1");
			document.getElementsByTagName("input")[0];
			document.getElementsByName("name1")[0];
			document.getElementsByClassName("class1")[0];
		
		</script>	
		
	</body>
</html>
2.2添加子标签【增】

appendChild():将新的节点追击到指定节点的子节点末尾

insertBefore():在指定子节点的前面插入一个子节点

代码演示:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
	</head>
	<body>
		<ul id="ulid">
			<li>111</li>
			<li>222</li>
			<li>333</li>
			<li>444</li>
			<!--<li>555</li>-->
		</ul>
		
		<input type="button" value="add" onclick="add();"/>
		
		<script>
			//appendChild:使用父节点的对象调用
			
			function add(){
				//1.创建标签对象
				var liElement = document.createElement("li");
				
				//2.创建文本对象
				var textNode = document.createTextNode("555");
				
				//3.将555的文本添加给li
				liElement.appendChild(textNode);
				
				//4.获取ul标签对象
				var ulElement = document.getElementById("ulid");
				
				//5.将li对象添加给ul对象
				ulElement.appendChild(liElement);
				
			}
		</script>
	</body>
</html>
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
		<style type="text/css">
			div{
				width: 200px;
				height: 200px;
				background-color: orange;
			}
		</style>
	</head>
	<body>
		<!--需求:将div1中的内容添加到div2中-->
		<div id="div1">
			<ul id="ulid">
				<li>111</li>
				<li>222</li>
				<li>333</li>
				<li>444</li>
			</ul>
		</div>
		<div id="div2">
			
		</div>
		
		<input type="button" value="add" onclick="add();"/>
		
		<script>
			//appendChild:使用父节点的对象调用
			
			function add(){
				//1.获取div2
				var div2 = document.getElementById("div2");
				
				//2.获取ul对象
				var ul = document.getElementById("ulid");
				
				//3.添加
				div2.appendChild(ul);
				
			}
		</script>
	</body>
</html>
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
	</head>
	<body>
		<ul id="ulid">
			<li>111</li>
			<li>222</li>
			<!--<li>555</li>-->
			<li id="li3">333</li>
			<li>444</li>
		</ul>
		
		<input type="button" value="add" onclick="insert();"/>
		
		<script>
			//insertBefore:使用父节点的对象调用
			
			function insert(){
				
				//1.创建标签对象
				var liElement = document.createElement("li");
				
				//2.创建文本对象
				var textNode = document.createTextNode("555");
				
				//3.将555的文本添加给li
				liElement.appendChild(textNode);
				
				//4.获取ul标签对象
				var ulElement = document.getElementById("ulid");
				
				//5.获取指定的标签
				var li3Element = document.getElementById("li3");
				
				//6.在li3的前面插入一个li
				//insertBefore(新节点,指定节点)
				ulElement.insertBefore(liElement,li3Element);
				
			}
		</script>
	</body>
</html>
2.3删除子节点【删】

removeChild();删除某个节点的子节点

removeAttribute:删除指定标签的指定属性

代码演示:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
	</head>
	<body>
		<ul id="ulid">
			<li>111</li>
			<li>222</li>
			<li id="li3">333</li>
			<li>444</li>
		</ul>
		
		<input type="button" value="remove" onclick="remove();"/>
		
		<script>
			//removeChild:使用父节点的对象调用
			
			function remove(){
				//1.获取父标签
				var ul = document.getElementById("ulid");
				
				//2.获取需要被删除的额子标签
				var li3 = document.getElementById("li3");
				
				//3.删除
				//注意:通过父标签删除子标签,只能删除一次
				ul.removeChild(li3);	
			}
		</script>
	</body>
</html>
2.4修改【改】

replaceChild():替换子节点

setAttribute();修改指定的属性值

代码演示:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
	</head>
	<body>
		<ul id="ulid">
			<li>111</li>
			<li>222</li>
			<!--<li id="li3">aaaa</li>-->
			<li id="li3">333</li>       
			<li>444</li>
		</ul>
		
		<input type="button" value="replace" onclick="replace();"/>
		
		<script>
			//replaceChild(新,旧):使用父节点的对象调用
			
			function replace(){
				//1.获取需要被替换的标签对象
				var li3 = document.getElementById("li3");
				
				
				//2.创建一个新的li对象
				var newLi = document.createElement("li");
				
				//3.创建一个文本对象
				var text = document.createTextNode("aaaa");
				
				//4.将text添加给newLi
				newLi.appendChild(text);
				
				//5.获取父标签对象
				var ul = document.getElementById("ulid");
				
				//6.替换
				ul.replaceChild(newLi,li3);
				
			}
		</script>
	</body>
</html>
2.5获取【查】

getAttribute():获取指定的属性值

代码演示:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
	</head>
	<body>
		
		<input type="text" name="name1" id="input1" value="hello" class="aaa" />
		
		
		<script>
			//getAttribute    setAttribute
			
			//获取标签对象
			var input = document.getElementsByName("name1")[0];
			
			//获取value属性的值
//			document.write(input.value);
			//修改value属性的值
//			input.value = "html";


			
			//1.获取value属性的值:getAttribute("属性名")
			document.write(input.getAttribute("value"));	
			document.write("<br />");
			document.write(input.getAttribute("name"));	
			document.write("<br />");
			document.write(input.getAttribute("class"));
			document.write("<br />");
			document.write(input.getAttribute("type"));	
			document.write("<br />");
			
			
			//2.设置属性的值
			//input.setAttribute("属性名","值")
			input.setAttribute("class","hahahah");
			
			document.write(input.getAttribute("class"));
			document.write("<br />");
			
			
			//3.removeAttribute():删除属性.删除之后,获取的结果为null,相当于没有给该标签添加该属性
			input.removeAttribute("class");
			document.write(input.getAttribute("class"));
			document.write("<br />");
			
		</script>
	</body>
</html>
2.6其他方法

createElement():创建标签对象

createTextNode():创建文本对象

cloneChild():复制节点

代码演示:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
		<style>
			div{
				width: 200px;
				height: 200px;
				background-color: red;
			}
		</style>
	</head>
	<body>
		<ul id="ulid">
			<li>111</li>
			<li>222</li>
			<li>333</li>       
			<li>444</li>
		</ul>
		
		
		<div id="div1">
			
		</div>
		
		<input type="button" value="clone" onclick="clone();"/>
		
		<script>
			//cloneChild(新,旧):使用父节点的对象调用
			
			function clone(){
				//1.获取ul对象
				var ul = document.getElementById("ulid");
				
				//2.执行复制方法,拷贝了一个副本,放到一个类似剪切板的地方
				var ulCopy = ul.cloneNode(true);
				
				
				//3.获取div对象
				var div = document.getElementById("div1");
				
				//4.将ul副本添加到div的下面
				div.appendChild(ul);
				
				
				//每个标签对象只有一个,如果想要保留原来的标签,还需要用该标签做其他的操作,首先最好拷贝一个副本
				
			}
		</script>
	</body>
</html>
2.7属性

innerHTML:设置或者获取指定标签的文本值 常用


parentNode:获取节点的父节点

childNodes:获取节点的所有子节点 ****

nextSibling:返回一个给定节点的下一个兄弟节点
previousSibling:返回一个给定节点的上一个兄弟节点

firstChild:获取指定节点的第一个子节点

lastChild:获取指定节点的最后一个子节点


attributes:获取节点的属性节点

value:值

nodeName:节点名称,是只读的

​ 元素节点:标签名称

​ 属性节点:属性名

​ 文本节点:#text

​ 文档节点:#document

nodeValue:节点的值

​ 元素节点:undefined/null

​ 属性节点:属性值

​ 文本节点:文本本身

nodeType:节点类型,nodeType是只读的

​ 元素节点:1

​ 属性节点:2

​ 文本节点:3

​ 文档:9

​ 注释:8

代码演示:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
	</head>
	<body>
		<span id="span1">哈哈哈哈哈</span>
		<script>
			document.write("<hr />");
			//获取span标签对象
			var span = document.getElementById("span1");
			//标签名称的大写
			document.write(span.nodeName);  
			document.write("<hr />");
			document.write(span.nodeType);
			document.write("<hr />");
			document.write(span.nodeValue);
			document.write("<hr />");
			
			
			//获取属性对象
			var id1 = span.getAttributeNode("id");
			document.write(id1.nodeName);  
			document.write("<hr />");
			document.write(id1.nodeType);
			document.write("<hr />");
			document.write(id1.nodeValue);
			document.write("<hr />");
			
			
			//获取文本对象
			var text1 = span.firstChild;
			document.write(text1.nodeName);  
			document.write("<hr />");
			document.write(text1.nodeType);
			document.write("<hr />");
			document.write(text1.nodeValue);
			document.write("<hr />");
				
		</script>
	</body>
</html>
3.事件
3.1模式

内联模式:

​ 将js中的事件当做html的属性使用

脚本模式:

​ 将js和html分离

代码演示:

内联模式:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
	</head>
	<body>
		<!--内联模式:html和js并未分离-->
		<input type="button" value="按钮一" onclick="func1();" />
		<button onclick="func2();">按钮二</button>
		
		<script type="text/javascript">
			
			function func1(){
				alert("func1");
			}
			
			
			function func2(){
				alert("func2");
			}
			
		</script>
	</body>
</html>

脚本模式:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
	</head>
	<body>
		
		<input type="button" value="按钮一" />
		<button id="btn">按钮二</button>
		
		<script type="text/javascript">
			/*function func1(){
				alert("func1");
			}
			
			
			function func2(){
				alert("func2");
			}
			
			//获取按钮的标签对象
			var input = document.getElementsByTagName("input")[0];
			input.onclick = func1;*/
			
			
			//获取按钮的标签对象
			var input = document.getElementsByTagName("input")[0];
			//给input标签绑定一个单击事件,结合匿名函数使用
			input.onclick = function(){
				alert("func~~~~~1");
			}
			
			
			var btn = document.getElementById("btn");
			btn.onclick = function(){
				alert("hello");
			}
			
			
		</script>
	</body>
</html>
3.2事件对象

事件对象一般称为event对象,其实是一个隐藏的对象,是浏览器通过函数将该对象作为参数传递进去的,如果需要使用该对象,则可以显式的写出来

代码演示:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
	</head>
	<body>
		<input type="button" value="按钮一" />
		
		<script type="text/javascript">
			/*function func1(){
				//arguments是一个全局的对象,表示所有的参数,主要获取系统默认的参数
				alert(arguments.length);
			}
			
			func1();*/
			
			
			var input = document.getElementsByTagName("input")[0];
			//如果事件是鼠标触发的,则eve表示MouseEvent对象,如果是键盘触发的,eve表示keyboardEvent
			//注意:eve只是一个标识符,可以是任何合法的标识符
			input.onclick = function(eve){
				alert(arguments.length);
				alert(arguments[0]); //[object MouseEvent]
				alert(eve);  //[object MouseEvent]
			}
			
		</script>
	</body>
</html>
3.3鼠标事件分类

js中所有事件都由两部分组成:on+事件名称

使用方式:标签对象.事件= 匿名函数

​ click:单击事件或者按下回车键触发

​ dblclick:双击事件

​ mousedown:用户按下鼠标但是还未弹起

​ mouseup:用户释放鼠标触发

​ mouseover:当鼠标移动到某个元素的上方【鼠标悬浮】

​ mouseout:当鼠标移出某个元素

​ mousemove:当鼠标在某个元素的上方移动

​ submit:表单提交的时候触发【可以阻止表单提交】

​ scroll:滚动事件

注意:可以通过事件对象可以获取鼠标按钮信息和屏幕坐标

按钮信息:button的属性

​ 0----》左键

​ 1-----》滚轮

​ 2----》右键

3.4鼠标事件使用

代码演示:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
		<style>
			#box{
				width: 200px;
				height: 200px;
				background-color: cyan;
			}
		</style>
	</head>
	<body>
		<!--给任意的html都可以添加事件-->
		<div id="box"></div>
		<script type="text/javascript">
			
			//获取div的标签对象
			var divObj = document.getElementById("box");
			
			//绑定事件
			/*divObj.onclick = function(){
				alert("单击");
			}*/
			
			/*divObj.ondblclick = function(){
				alert("双击");
			}*/
			
			//鼠标悬浮
			/*divObj.onmouseover = function(){
//				alert("悬浮");
				//在js中操作css:标签对象.style.需要修改的属性  = “值”;
				divObj.style.backgroundColor = "red";
			}*/
			/*divObj.onmouseout = function(){
//				alert("移出");
				divObj.style.backgroundColor = "cyan";
			}*/
			
			//移动事件
			/*divObj.onmousemove = function(){

				divObj.style.backgroundColor = "blue";
			}*/
			
			
			divObj.onmousedown = function(){

				divObj.style.backgroundColor = "green";
			}
			
			
			divObj.onmouseup = function(){

				divObj.style.backgroundColor = "yellow";
			}
				
		</script>
	</body>
</html>
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
		<style>
			#msg_id{
				width: 200px;
				/*根据内容自适应*/
				height: auto;
				background-color: gray;
				border: 1px solid black;
				/*初始状态下,div需要被隐藏起来*/
				display: none;
				/*定位属性:*/
				/*如果设置了定位属性,必须结合left,top,right或者bottom使用*/
				position: absolute;
			}
			
			
			#div1 a{
				margin: 30px;
				/*行内标签:设置宽高和内外边距无效,如果要使用,则需要设置display为inline-block或者block*/
				display: inline-block;
			}
		</style>
	</head>
	<body>
		
		<div id="div1">
			<a href="#">大娃(红娃)</a><br />
			<a href="#">二娃(橙娃)</a><br />
			<a href="#">三娃(黄娃)</a><br />
			<a href="#">四娃(绿娃)</a><br />
			<a href="#">五娃(青娃)</a><br />
			<a href="#">六娃(蓝娃)</a><br />
			<a href="#">七娃(紫娃)</a><br />
			<a href="#">葫芦小金刚</a><br />		
			<!--详细介绍-->
			<div id="msg_id"></div>
		</div>
		
		<script type="text/javascript">
			//当所有的页面内容加载完毕之后,才去执行,可以保证能够获取所有的标前对象以及属性以及文本
			window.onload = function(){
				var arrMsg = ["力大无穷,巨大化。(弱点:比较鲁莽,不知随机应变)", "千里眼,顺风耳,灵活聪明,机敏过人,最善于谋划计策(弱点:攻击力与其兄弟相比较过于弱小了,眼睛和耳朵太脆弱)", "铜头铁臂,钢筋铁骨,刀枪不入(弱点:第一部中根本就是没有弱点,但可以以柔克刚降服他。可是到了第二部就被强行加入了一个致命弱点:怕打屁股。性急骄傲)。", "喷火,吸火,霹雳(弱点:受不了激将法,也怕冷)", "吸水,吐水,口吐闪电产生降雨(弱点:水火不相溶,意气用事。第一部中水娃的能力也是没有弱点的,不用吸水也能喷水喷得无穷无尽。到了第二部就变得需要先吸水才能吐水,水量有限。)", "隐身术,透体术,来无影去无踪,聪明机灵,最善于偷盗和行动(弱点:太顽皮。在第一部里能够在被金蛇冰封的情况下透体而出,在第二部前半段能够使用透体术逃出鳄鱼头领爪子的紧紧捉拿,直到被捉的那一下透体术就使不出来了)", "最小,没多大本领,倍受哥哥们的关爱,有宝葫芦,可以吸入魔法、兵器和妖怪,在第一部刚出世时蒙蔽双眼,十分听从妖精的话,把六位哥哥吸进宝葫芦。(弱点:失去宝葫芦,到第二部中宝葫芦那么容易就碎了)", "葫芦娃的合体,七颗葫芦娃的心都溶在他的胸中,七个葫芦娃的本领都长在他的身上,同时也具有七个葫芦娃的弱点。他大闹妖精洞府后,闯入十八层地道,毁掉青蛇精的两件宝物。后变成一座大山,镇压了青蛇精."];
			
				//获取标前对象
				var oDiv = document.getElementById("div1");
				var oAs = oDiv.getElementsByTagName("a");
				var oMsg = document.getElementById("msg_id");
				
				//遍历集合,获取具体的a标签对象
				for(var i = 0;i < oAs.length;i++){
					//oAs[i]
					//给每一个a标签做一个标记
					oAs[i].index = i;
					
					
					//1.移入的时候,超链接文字颜色变为橙色,将对应的描述信息赋值给msg的div
					oAs[i].onmouseover = function(){
						
						this.style.color = "orange";
						
						//显示出来
						oMsg.style.display = "block";
						
						//设置文字
						oMsg.innerHTML = arrMsg[this.index];
						
						
						/*oMsg.style.left = 20 + "px";
						oMsg.style.top = 20 + "px";*/
					}
					
					
					//2.移出的时候,超链接的文字颜色变为蓝色,将msg的div隐藏
					oAs[i].onmouseout = function(){
						this.style.color = "blue";
						oMsg.style.display = "none";
					}
					
					//3.当鼠标在a标签的文字上面移动的时候,msg的div跟着移动
					oAs[i].onmousemove = function(eve){
						
						//兼容不同的浏览器
						var e = eve || window.event;
						
						oMsg.style.display = "block";
						
						
						//通过事件对象获取鼠标点击的位置:e.clientX   e.clientY,相对于父标签的
						oMsg.style.left = e.clientX + 5 + "px";
						oMsg.style.top =e.clientY + 2 + "px";
						
					}
				}
			}
			
		</script>
	</body>
</html>
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
		<style>
			#box{
				width: 200px;
				height: 200px;
				background-color: orange;
				position: absolute;
			}
		</style>
	</head>
	<body>
		<div id="box"></div>
		
		<script type="text/javascript">
			/*
			 * 拖拽事件的实现思路
			 * 1.拖拽触发的条件:在元素上面有按下动作之后,才可以拖拽
			 *     div.onmousedown
			 * 2.在移动过程中,计算坐标
			 * 3.释放资源
			 */
			window.onload = function(){
				
				//获取div标签对象
				var box = document.getElementById("box");
				
				
				//拖拽的第一步:按下鼠标
				box.onmousedown = function(eve){
					var e = eve || window.event;
					
					//记录最初,鼠标相对于div的位置
					var offsetX = e.offsetX;
					var offsetY = e.offsetY;
					
					
					//拖拽的第二步:移动
					//移动的并不是div,而是在整个文档对象内部移动
					document.onmousemove = function(eve){
						var e = eve || window.event;
						
						//获取的clientX和clientY
						var clientX = e.clientX;
						var clientY = e.clientY;
						
						
						//计算移动的距离 
						box.style.left = clientX  - offsetX + "px";
						box.style.top = clientY  - offsetY + "px";
					}
					
					//当鼠标抬起的时候,释放资源【不让move,不让执行move的函数】
					document.onmouseup = function(){
						document.onmousemove = null;
					}
				}	
			}
		</script>
	</body>
</html>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值