节点操作之父子节点和下拉框

发布于:2023-01-05 ⋅ 阅读:(396) ⋅ 点赞:(0)

1.父级节点:node.parentNode    

 node.parentNode,返回某节点的父节点,返回最近一个父节点,如果没有父节点返回null。

<!-- 父级节点:node.parentNode -->
		<div class="demo">
			<div class="box">
			<span class="erweima"></span>
		</div>
		</div>

 // 1.父级节点:node.parentNode
			 // node.parentNode,返回某节点的父节点,返回最近一个父节点,如果没有父节点返回null。
			// 这里的node 在书写的时候就是写声明之后获取到的一个元素
			 // 之前获取节点的方式
			 var erweima = document.querySelector('.erweima');
			 // var box = document.querySelector('.box');
			 
			 
			 erweima.parentNode;  //这样子书写就已经获得erweima的父节点了
			 console.log(erweima.parentNode);
			 // 得到的是离元素最近的父节点(亲爸爸),如果找不到父节点就返回null
			 // erweima.parentNode 这么写就可以直接得到二维码的父节点了
			// 相比之前的document.querySelector()这种方式获取更加的方便

2.子节点  childNodes   

childNodes返回包含指定节点的子节点的集合,返回所有子节点,包括文本节点,元素节点。

<ul>
			<li><a href="#">滚球兽</a></li>
			<li><a href="#">亚古兽</a></li>
			<li><a href="#">暴龙兽</a></li>
			<li><a href="#">机械暴龙兽</a></li>
			<li><a href="#">战斗暴龙兽</a></li>
		</ul>


// 2.子节点  childNodes
			// childNodes返回包含指定节点的子节点的集合,返回所有子节点,包括文本节点,元素节点。
			var ul = document.querySelector('ul')
			// var lis = ul.querySelectorAll('li')
			// console.log('lis');
			
			ul.childNodes  //这样子书写就已经获得ul的所有子节点了
			console.log(ul.childNodes);
			// 这里面打印输出的第一个元素是text ,因为ul后面跟着的是一个换行,因为换行是属于文本节点,所以第一个就是text  然后后面跟着li  然后li后面跟着的又是一个换行的文本,所以就又是text 依次类推,就可以跟获取的值相匹配了
			
		// 判断节点类型:nodeType
		// 元素节点:nodeType 为1;
		// 属性节点:nodeType 为2;
		// 文本节点:nodeType 为3;文本节点包含文字,空格,换行等
		
		
		console.log(ul.childNodes[0].nodeType);
		// 这里的返回值为3,所以他不是一个元素节点,是一个文本节点
		console.log(ul.childNodes[1].nodeType)
		// 这个的返回值是1,所以他是一个元素节点

3.children  子元素节点       只返回所有的子元素节点,其余节点不返回。

这个虽然是非标准的,但是所有的浏览器都是兼容的,可以放心大胆的使用,而且后面获取子节点的时候也是强烈推荐使用该种方法

ul.children  //这个是只获取ul底下的所有的li元素节点,不获取其他类型的节点
		console.log(ul.children);

4.  firstChild 返回第一个子节点

返回第一个子节点,找不到返回null,包含所有节点。它返回的节点不管是文本节点还是元素节点

5.lastChild 返回最后一个子节点,找不到返回null,包含所有节点。

返回最后一个子节点,找不到返回null,包含所有节点。它返回的节点不管是文本节点还是元素节点

 6.firstElementChild 返回第一个子元素节点,找不到返回null。Ie9以上支持。

7.lastElementChild 返回最后一个子元素节点,找不到返回null。Ie9以上支持。

<ol>
			<li><a href="#">滚球兽</a></li>
			<li><a href="#">亚古兽</a></li>
			<li><a href="#">暴龙兽</a></li>
			<li><a href="#">机械暴龙兽</a></li>
			<li><a href="#">战斗暴龙兽</a></li>
		</ol>

var ol = document.querySelector('ol');
		// 4.  firstChild 返回第一个子节点
		// 返回第一个子节点,找不到返回null,包含所有节点。它返回的节点不管是文本节点还是元素节点
		console.log(ol.firstChild);
		// 所以该方式打印输出的第一个节点是文本节点,不是我们想要获取的元素节点
		
		// 5.lastChild 返回最后一个子节点,找不到返回null,包含所有节点。
		// 返回最后一个子节点,找不到返回null,包含所有节点。它返回的节点不管是文本节点还是元素节点
		console.log(ol.lastChild);
		// 所以该方式打印输出的最后一个节点是文本节点,不是我们想要获取的元素节点
		
		
		// 6.firstElementChild 返回第一个子元素节点,找不到返回null。Ie9以上支持。
		console.log(ol.firstElementChild);
		
		// 7.lastElementChild 返回最后一个子元素节点,找不到返回null。Ie9以上支持。
		console.log(ol.lastElementChild);

8.在实际开发中的写法,既没有兼容性的问题又返回第一个子元素(下面的这种写法一定要重点掌握

// children获取到的元素组成的是一个伪数组的形式,我们在调用里面某一个元素的时候,直接使用索引的方式进行调用就可以了
		console.log(ol.children[0]);  
		//这是获取第一个子节点
		// 这里返回的是索引为0的子元素
		console.log(ol.children[3]);
		//返回索引号为3的子元素
		
		// 返回最后一个子元素(我们可以先获取li的长度,然后在这个长度的基础上,进行减一的操作
		console.log(ol.children[ol.children.length-1]);   
		//这是获取最后一个子节点

案例:下拉菜单
       案例分析: 
       1)导航栏里面的li都要有鼠标经过的效果,所以需要循环注册事件。
       2)核心原理:当鼠标经过li里面的第二个孩子ul显示 ,当鼠标离开,则ul隐藏 。

<style>
		    * {
		        margin: 0;
		        padding: 0;
		    }
		    
		    li {
		        list-style-type: none;
		    }
		    
		    a {
		        text-decoration: none;
		        font-size: 14px;
		    }
		    
		    .nav {
		        margin: 100px;
		    }
		    
		    .nav>li {
		        position: relative;
		        float: left;
		        width: 80px;
		        height: 41px;
		        text-align: center;
		    }
		    
		    .nav li a {
		        display: block;
		        width: 100%;
		        height: 100%;
		        line-height: 41px;
		        color: #333;
		    }
		    
		    .nav>li>a:hover {
		        background-color: #eee;
		    }
		    
		    .nav ul {
		        display: none;
		        position: absolute;
		        top: 41px;
		        left: 0;
		        width: 100%;
		        border-left: 1px solid #FECC5B;
		        border-right: 1px solid #FECC5B;
				border-top:1px solid #FECC5B;
		    }
		    
		    .nav ul li {
		        border-bottom: 1px solid #FECC5B;
		    }
		    
		    .nav ul li a:hover {
		        background-color: #FFF5DA;
		    }
		</style>
	</head>
	<body>
		<ul class="nav">
		    <li>
		        <a href="#">微博</a>
		        <ul>
		            <li>
		                <a href="">私信</a>
		            </li>
		            <li>
		                <a href="">评论</a>
		            </li>
		            <li>
		                <a href="">@我</a>
		            </li>
		        </ul>
		    </li>
		    <li>
		        <a href="#">微博</a>
		        <ul>
		            <li>
		                <a href="">私信</a>
		            </li>
		            <li>
		                <a href="">评论</a>
		            </li>
		            <li>
		                <a href="">@我</a>
		            </li>
		        </ul>
		    </li>
		    <li>
		        <a href="#">微博</a>
		        <ul>
		            <li>
		                <a href="">私信</a>
		            </li>
		            <li>
		                <a href="">评论</a>
		            </li>
		            <li>
		                <a href="">@我</a>
		            </li>
		        </ul>
		    </li>
		    <li>
		        <a href="#">微博</a>
		        <ul>
		            <li>
		                <a href="">私信</a>
		            </li>
		            <li>
		                <a href="">评论</a>
		            </li>
		            <li>
		                <a href="">@我</a>
		            </li>
		        </ul>
		    </li>
		</ul>
<script>
			// 1)获取元素
			var nav = document.querySelector('.nav');
			var lis = nav.children;  // 得到nav下面的四个小li
			//循环注册事件
			for(var i=0;i<lis.length; i++){
				// 当鼠标经过里面的的li的时候,让他们底下的ul得以显现出来
				lis[i].onmouseover = function(){
					this.children[1].style.display='block';
				}
				// 当鼠标离开里面的的li的时候,让他们底下的ul隐藏起来
				lis[i].onmouseout = function(){
					this.children[1].style.display='none';
				}
				
			}
			
			
		</script>

案例:左拉菜单

<style>
			* {
				margin: 0;
				padding: 0;
			}

			.cebianlan {
				width: 80px;
				/* height: 300px; */
				position: fixed;
				right: 0px;
				top: 100px;
				background-color: pink;
			}

			.cebianlan>a {
				display: block;
				width: 80px;
				height: 50px;
				line-height: 50px;
				font-size: 12px;
				padding-top: 10px;
				padding-bottom: 10px;
				cursor: pointer;
				color: #757575;
				text-decoration: none;
				position: relative;
				/* margin-top: -1px; */
				background-color: #fff;
				border: 1px solid #f5f5f5;
				text-align: center;

			}

			/* .cebianlan>a>p {
				opacity: 0.6;
			} */

			.pop-content {
				width: 150px;
				height: 150px;
				position: absolute;
				display: none;
				left: -180px;
				top: 0;
				padding: 14px;
				background: #fff;
				border: 1px solid #f5f5f5;
				opacity: 0.7;
				background-color: pink;
			}

			.pop-content>img {
				width: 100px;
				height: 100px;
				margin: 0 auto;
			}

			.pop-content>p {
				width: 130px;
				margin: 0 auto;
				color: #757575;
				text-align: center;
			}
		</style>
	</head>
	<body>
		<div class="cebianlan">
			<a href="">
				<span class="iconfont icon-shouji"></span>
				<p>手机APP</p>
				<div class="pop-content">
					<img src="14.png" alt="">
					<p>扫码领取新人百元礼包</p>
				</div>
			</a>
			<a href="">
				<span class="iconfont icon-geren"></span>
				<p>个人中心</p>
				<div class="pop-content">
					<img src="14.png" alt="">
					<p>
						扫码领取新人百元礼包
					</p>
				</div>
			</a>
			<a href="">
				<span class="iconfont icon-wodeshouhou"></span>
				<p>售后服务</p>
				<div class="pop-content">
					<img src="14.png" alt="">
					<p>
						扫码领取新人百元礼包
					</p>
				</div>
			</a>
			<a href="">
				<span class="iconfont icon-kefu"></span>
				<p>人工客服</p>
				<div class="pop-content">
					<img src="14.png" alt="">
					<p>
						扫码领取新人百元礼包
					</p>
				</div>
			</a>
			<a href="">
				<span class="iconfont icon-shangjiantou"></span>
				<p>回到顶部</p>
			</a>
		</div>
<script>
			var a = document.querySelectorAll('a');
			// console.log(a)
			// console.log(a[1].children[2])
			for (var i = 0; i < a.length; i++) {
				a[i].addEventListener('mouseenter', function() {
					// 主要是对点击的元素里面是否含有左拉菜单
					if (this.children[2]) {
						this.children[2].style.display = 'block';
					}
				})

				a[i].addEventListener('mouseleave', function() {
					if (this.children[2]) {
						this.children[2].style.display = 'none';
					 }

				})
			}
		</script>
本文含有隐藏内容,请 开通VIP 后查看