DOM编程 和 tab选项卡(6)

400 阅读11分钟

1.基本概念

DOM: Document 整篇文档 Object 文档对象 Model 模型 这里有个Dom树

DOM 是 JavaScript 操作网页的接口,全称为“文档对象模型”(Document Object Model)。它的作用是将网页转为一个 JavaScript 对象,从而可以用脚本进行各种操作(比如增删内容)。

浏览器会根据 DOM 模型,将结构化文档(比如 HTML 和 XML)解析成一系列的节点,再由这些节点组成一个树状结构(DOM Tree)。所有的节点和最终的树状结构,都有规范的对外接口。

DOM 只是一个接口规范,可以用各种语言实现。所以严格地说,DOM 不是 JavaScript 语法的一部分,但是 DOM 操作是 JavaScript 最常见的任务,离开了 DOM,JavaScript 就无法控制网页。另一方面,JavaScript 也是最常用于 DOM 操作的语言。后面介绍的就是 JavaScript 对 DOM 标准的实现和用法。


下边通过一些具体的代码来看一下:

1.需求:实现按键控制div的颜色

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>按键控制div颜色</title>
	<style>
		#box{
			width: 300px;
			height: 300px;
			background-color: red;
		}
	</style>
</head>
<body>
	<div id="box"></div>
	<button id="bt1">变成蓝色</button>
	<script>
		var bt1=document.getElementById("bt1")
		bt1.onclick=function(){
			var box=document.getElementById("box");
			box.style.backgroundColor="blue";
            //.style控制元素的样式,不过加的是行内样式。也只能获取到行内样式。
		}
	</script>
</body>
</html>

注意:.style控制元素的样式,不过加的是行内样式,也只能获取到行内样式。

2.按键控制div的颜色-进阶

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title按键控制div的颜色></title>
	<style>
		#box{
			width: 330px;
			height: 330px;
			background-color: pink;
		}
	</style>
</head>
<body>
	<div id="box"></div>
	<button>红色</button>
	<button>橙色</button>
	<button>黄色</button>
	<button>绿色</button>
	<button>蓝色</button>
	<button>黑色</button>
	<button>紫色</button>
	<script>
                 //找到页面中所有的button按钮放入一个数组中
		var bts=document.getElementsByTagName("button");
                //创建一个颜色数组一一对应;
		var Colors=["red","orange","yellow","green","blue","black","purple"];
	//给所有的button按钮分发点击事件
		for(var n=0;n<bts.length;n++){
			bts[n].index=n;//给每个button标签分发一个位置属性(给个序号)
			bts[n].onclick=function(){//需要知道当前点击的是第几个按钮
				var box=document.getElementById("box");
				box.style.backgroundColor=Colors[this.index]
				console.log(n);
			}
		}
	</script>
</body>
</html>

3.如何在js中查找元素

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>如何在js中查找元素</title>
</head>
<body>
	<ul id="nav1">
		<li>Song Dingfei</li>
		<li>Song Dingfei</li>
		<li>Song Dingfei</li>
	</ul>
	<ul id="nav2">
		<li>宋顶飞</li>
		<li>宋顶飞</li>
		<li>宋顶飞</li>
	</ul>
	<ul>
		<li class="a0">嗨嗨</li>
		<li class="a0">嗨嗨</li>
	</ul>
	<script>
	//需求:当点击每个li时,都弹出框输出“你好”,alert("你好")
	//1.document.getElemrntById(""),通过ID属性找到指定元素
	//2.document.getElementsByTagName("") 或者 对象.getElementByTagName(""),
	//这是通过标签名获取一组数据,并且把数据内容放入数组中,
	//3.document.getElementsByClassName("类名") 通过类名获取一组数据,
            并且把数据内容放入数组中,
	//如果可以使用标签名,就不要使用类名。
		function getId(id){
			var x=document.getElementById(id);
			return x;
		}
		function getTagName(TagName){
			var y=document.getElementsByTagName(TagName);
			return y;
		}
		var nav1=getId("nav1");
		var Lis1=getTagName("li");
		var nav2=getId("nav2");
		var Lis2=getTagName("li");
		var Lis3=document.getElementsByClassName("a0");
		// 通过循环依次拿出数组中的li,给其分发事件,
		for(var n=0;n<Lis1.length;n++){
			Lis1[n].onclick=function(){
				alert("你好");
			}
		}
		for(var j=0;j<Lis2.length;j++){
			Lis2[j].onclick=function(){
				alert("大家好");
			}
		}
		for(var i=0;i<Lis3.length;i++){
			Lis3[i].onclick=function(){
				alert("你们好");
			}
		}
	</script>
</body>
</html>

(1). document.getElemrntById(""),通过ID属性找到指定元素

(2). document.getElementsByTagName("") 或者 object(象).getElementByTagName(""),这是通过标签名获取一组数据,并且把数据内容放入数组中,

(3).document.getElementsByClassName("类名") 通过类名获取一组数据,并且把数据内容放入数组中,

注意:如果可以使用标签名,就不要使用类名。

4.this对象的使用

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>this对象的使用</title>
	<style>
		#box{
			width: 300px;
			height: 300px;
			background-color: red;
		}
	</style>
</head>
<body>
	<div id="box"></div>
	<ul id="nav">
		<li>sdf1</li>
		<li>sdf2</li>
		<li>sdf3</li>
	</ul>
	<script>
		function getId(id){
			return document.getElementById(id);
		}
		function getTagName(TagName){
			return document.getElementsByTagName(TagName);
		}
		// var box=getId("box");
		// box.onclick=function(){
		// 	this.style.backgroundColor="blue";
		// }
		// 需求:当点击每个li时背景色依次变成粉色
		var nav=getId("nav");
		var navLis=nav.getElementsByTagName("li");
		console.log(navLis.length);
		//利用循环给所有li添加事件,当函数触发的时候,分发函数早已经分发完成了
		for(var n=0;n<navLis.length;n++){
			navLis[n].onclick=function(){
				console.log(n);
		                console.log(this);
                                //在事件编程中,有一个this对象,谁触发的函数,this就指向谁。
				this.style.backgroundColor="pink"
			}
		}
	</script>
</body>
</html>

5.class的使用

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>class</title>
	<style>
		.box{
			width: 150px;
			height: 150px;
			background-color: red;
			margin-bottom: 10px;
		}
		.active{
			background-color: blue;
		}
	</style>
</head>
<body>
	<div class="box active"></div><!-- 一个元素可以有多个类名,每个类名之间用空格隔开 -->
	<div class="box"></div>
	<div class="box"></div>
	<div class="box"></div>
	<div class="box"></div>
	<script>
//需求:当点击div时,被点击的div颜色变成蓝色,其他的div还原成默认样式
//排他思想:先找到所有元素,设置成默认, 然后再找到指定的元素加上对应的属性;
	var divs=document.getElementsByClassName("box");
	for(var n=0;n<divs.length;n++){
		divs[n].onclick=function(){
			// console.log(14)
			for(var j=0;j<divs.length;j++){
				divs[j].className="box";//先将所有的div的class名称 都设置成box
			}//设置完成以后,再将指定的div都设置成选中样式
			this.className="box active";//如何在js中更改class名称   .className

		}
	}
	</script>
</body>
</html>

tab选项卡1


<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>tap选项卡</title>
	<style>
		*{
			padding: 0;
			margin: 0;
		}
		#tabNav{
			overflow: hidden;/*清除子集浮动对其的影响*/
		}
		#tabNav li{
			list-style-type: none;
			width: 100px;
			height: 40px;
			float: left;
			border:1px solid #ccc;
			text-align: center;
			line-height: 40px;
		}
		#tabNav .active{
			background-color: red;
		}
		#wrap{
			width: 406px;
			border:1px solid #ccc;
			height: 200px;
		}
		#wrap div{
			width: 406px;
			height: 200px;
			display: none;
		}
		#wrap .show{
			display: block;
		}
	</style>
</head>
<body>
	<ul id="tabNav">
		<li class="active">话费</li>
		<li>旅行</li>
		<li>车险</li>
		<li>游戏</li>
	</ul>
	<div id="wrap">
		<div class="show">话费</div>
		<div>旅行</div>
		<div>车险</div>
		<div>游戏</div>
	</div>
	<script>
		//需求:点击指定li时,li变成选中样式,其他li恢复默认,让其对应的div标签显示出来,
                        其他的div标签隐藏,
		//1.点击谁,谁变红,
		//2.显示出相应的div
		//事件编程:1.事件源 2.事件 3.事件处理函数
	//第一步,通过id先找到所有li的父级元素
		var tabNav=document.getElementById("tabNav");
	//第二步,通过父级元素找到所有子集的li,并且放入数组中,
		var tabNavLis=tabNav.getElementsByTagName("li");
	//找到所有的div元素,并且放入数组中,
		var wrap=document.getElementById("wrap");
		var wrapDivs=wrap.getElementsByTagName("div");
	//第三步,利用循环添加数组,给每个元素添加事件,
		for(var n=0;n<tabNavLis.length;n++){
			tabNavLis[n].index=n;
			tabNavLis[n].onclick=function(){
				//利用排他思想,先将所有的li类名清空,
				for(var j=0;j<tabNavLis.length;j++){
					tabNavLis[j].className="";
				}
				this.className="active";
				//console.log(this.index);
				for(var i=0;i<wrapDivs.length;i++){
					wrapDivs[i].className="";
				}
				wrapDivs[this.index].className="show";
			}
		}
	</script>
</body>
</html>

事件编程:1.事件源 2.事件 3.事件处理函数

tab选项卡2-淘宝网

1.划分布局(先判断是否需要利用定位属性) 

2.完成逻辑阶段  首先找到对应的事件源元素,给其分发事件 

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>tab选项卡加强版</title>
	<style>
		*{
			padding: 0;
			margin: 0;
		}
		#wrap{
			position: relative;
		}
		#tabnav{
			margin-top: 20px;
			margin-left: 80px;
		}
		#tabnav li{
			list-style-type: none;
			width: 150px;
			height: 50px;
			line-height: 50px;
			text-align: center;
			border-bottom: 1px solid #ccc;
			border-right: 1px solid #ccc;
		}
		#tabnav .active{
			background-color: pink;
		}
		#wrap #box{
			position: absolute;
			top: 0;
			left: 230px;
			display: none;
		}
		#wrap #box div{
			width: 180px;
			height: 252px;
			line-height: 252px;
			text-align: center;
			color: blue;
			background-color: purple;
			font-size: 20px;
			border: 1px solid #ccc;
			float: left;
			display: none;
		}
		#wrap #box .show{
			display: block;
		}
	</style>
</head>
<body>
	<div id="wrap">
		<ul id="tabnav">
			<li>女装/男装/内衣</li>
			<li>鞋靴/箱包/配件</li>
			<li>童装玩具/孕产/用品</li>
			<li>家电/数码/相机</li>
			<li>美妆/洗护/保健品</li>
		</ul>
		<div id="box">
			<div>女装/男装/内衣</div>
			<div>鞋靴/箱包/配件</div>
			<div>童装玩具/孕产/用品</div>
			<div>家电/数码/相机</div>
			<div>美妆/洗护/保健品</div>
		</div>
		<script>
			var tabnav=document.getElementById("tabnav");
			var tabnavLis=tabnav.getElementsByTagName("li");
			var box=document.getElementById("box");
			var boxLis=box.getElementsByTagName("div");
//注意:1.鼠标进入时,不仅需要控制对应div的显示和隐藏,还需要控制其容器父级的显示隐藏,
//2.当鼠标里离开导航时,所有的状态还原成默认(所有li都变成未选中,div容器隐藏)
//3.如果鼠标在对应div时,容器就一直显示,然后对应的li加上选中的样式,
//4.当鼠标离开内容区域容器时,所有样式还原成默认,
			for(var n=0;n<tabnavLis.length;n++){
				tabnavLis[n].index=n;
				tabnavLis[n].onmouseenter=function(){
					for(var j=0;j<tabnavLis.length;j++){
						tabnavLis[j].className="";
						boxLis[j].className="";
					}
					this.className="active";
					box.style.display="block";
					boxLis[this.index].className="show"
				}
			}
	//当鼠标移出整体导航条时,需要再次将box显示区域隐藏,并且将所有的li还原成默认样式,
	//.onmouseleave鼠标移出事件
			tabnav.onmouseleave=function(){
				for(var j=0;j<tabnavLis.length;j++){
					tabnavLis[j].className="";
					box.style.display="none";//并将box隐藏
				}
			}
		//如果鼠标在对应的div上时,div还是显示的,并且对应的li是选中样式,
			for(var n=0;n<boxLis.length;n++){
				boxLis[n].index=n;
				boxLis[n].onmouseenter=function(){
					box.style.display="block";
                                        //只要鼠标在div上,其内容区就永远显示
					tabnavLis[this.index].className="active";
				}
			}
			//当鼠标移出box区域,还原成默认状态;
			box.onmouseleave=function(){
				for(var j=0;j<tabnavLis.length;j++){
					tabnavLis[j].className="";
					box.style.display="none";//并将box隐藏
				}
			}
		</script>
	</div>
</body>
</html>

tab选项卡的封装

<style>
	*{
		padding: 0;
		margin: 0;
	}
	#tabNav{
		margin-left: 50px;
		margin-top: 30px;
		overflow: hidden;
	}
	#tabNav li{
		list-style-type: none;
		width: 100px;
		height: 40px;
		border: 1px solid #ccc;
		line-height: 40px;
			text-align: center;
			float: left;
		}
		#tabNav .active{
			background-color: red;
		}
		#tabWrap div{
			width: 406px;
			height: 300px;
			font-size: 20px;
			color: red;
			text-align: center;
			line-height: 300px;
			border: 1px solid #ccc;
			margin-left: 50px;
			display: none;
		}
		#tabWrap .show{
			background-color: pink;
			display: block;
		}

		#picNav{
			margin-left: 50px;
			overflow: hidden;
		}
		#picNav li{
			list-style-type: none;
			width: 100px;
			height: 40px;
			border: 1px solid #ccc;
			line-height: 40px;
			text-align: center;
			float: left;
		}
		#picNav .active{
			background-color: red;
		}
		#picWrap div{
			width: 406px;
			height: 300px;
			font-size: 20px;
			color: red;
			text-align: center;
			line-height: 300px;
			border: 1px solid #ccc;
			margin-left: 50px;
			display: none;
		}
		#picWrap .show{
			background-color: pink;
			display: block;
		}
	</style>
</head>
<body>
	<ul id="tabNav">
		<li class="active">话费</li>
		<li>游戏</li>
		<li>车险</li>
		<li>充值</li>
	</ul>
	<div id="tabWrap">
		<div class="show">话费板块</div>
		<div>游戏板块</div>
		<div>车险板块</div>
		<div>充值板块</div>
	</div>
	<ul id="picNav">
		<li class="active">话费</li>
		<li>游戏</li>
		<li>车险</li>
		<li>充值</li>
	</ul>
	<div id="picWrap">
		<div class="show">话费板块</div>
		<div>游戏板块</div>
		<div>车险板块</div>
		<div>充值板块</div>
	</div>
	<script>
	//相同功能的选项卡进行封装
		function tab(nav,box){
			var tabNav=document.getElementById(nav);
			var tabNavLis=tabNav.getElementsByTagName("li");
			var tabWrap=document.getElementById(box);
			var tabWrapDivs=tabWrap.getElementsByTagName("div");
			if (tabNavLis.length!=tabWrapDivs.length) throw "li的个数必须和div的个数保持一致";
			for(var n=0;n<tabNavLis.length;n++){
				tabNavLis[n].index=n;
				tabNavLis[n].onmouseenter=function(){
					for(var j=0;j<tabNavLis.length;j++){
						tabNavLis[j].className="";
						tabWrapDivs[j].className="";
					}
					this.className="active";
					tabWrapDivs[this.index].className="show";
				}
			}
		}
		tab("tabNav","tabWrap");
		tab("picNav","picWrap");
	</script>
</body>
</html>