关于实现点击一行,下一行变色问题

在实现点击某行后下一行变色的功能时,遇到点击事件中循环变量i值错误导致总是第一行高亮的问题。问题源于循环完成与事件触发的时间不一致。解决方案是使用事件源this标识当前点击对象,并将涉及循环次数的判断移到循环外部。通过调整后,成功实现了预期效果。
摘要由CSDN通过智能技术生成

今天在做如题目说的效果(如下代码)时,发现在时间注册函数中判断循环值出现问题。所有的节点的点击事件后都是第一行高亮。

<!doctype html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
</head>
<body>
<ul id = "node">
	<li>下一个兄弟节点高亮</li>
	<li>下一个兄弟节点高亮</li>
	<li>下一个兄弟节点高亮</li>
	<li>下一个兄弟节点高亮</li>
	<li>下一个兄弟节点高亮</li>
</ul>
	<script>
	var node = document.getElementById("node");
	var li = node.children;
    
	for(var i=0; i<li.length-1; i++){
		var link = li[i];
		link.onclick = function(){
			if(i<li.length-1){
				for(var j=0; j<li.length; j++){
			    	var templink = li[j];
			    	templink.style.backgroundColor = "";
			    }
			    	console.log("this......");
	          		this.nextElementSibling.style.backgroundColor = "blue";
	          	}else{
	          		for(var j=0; j<li.length; j++){
			    	var templink = li[j];
			    	templink.style.backgroundColor = "";
			    }
			    	console.log("this......");
	          		li[0].style.backgroundColor = "blue";
	          	}
				
			

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

问题定位:循环操作和注册事件发生的时间不一致。循环是即时完成,而事件则是在用户操作界面触发事件时才发生的。在事件触发时,循环已经完成,所以事件中的i值是循环的终点值(li.length)。

1.基于上面的原因,在循环中,采用this来识别当前的点击对象,因为事件处理函数中的this:指的是事件源,谁调用的事件函数,this就指向谁;

2.在函数中如果需要判断循环体的控制次数的变量值,必须将判断放在循环体外面。

最终的实现代码如下:

<!doctype html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
</head>
<body>
<ul id = "node">
	<li>下一个兄弟节点高亮</li>
	<li>下一个兄弟节点高亮</li>
	<li>下一个兄弟节点高亮</li>
	<li>下一个兄弟节点高亮</li>
	<li>下一个兄弟节点高亮</li>
</ul>
	<script>
	var node = document.getElementById("node");
	var li = node.children;
    
	for(var i=0; i<li.length-1; i++){
		var link = li[i];
		link.onclick = function(){
				for(var j=0; j<li.length; j++){
			    	var templink = li[j];
			    	templink.style.backgroundColor = "";
			    }
			    	console.log("this......");
	          		this.nextElementSibling.style.backgroundColor = "blue";
			

		}
	}	
	li[li.length-1].onclick = function(){
				for(var j=0; j<li.length; j++){
			    	var templink = li[j];
			    	templink.style.backgroundColor = "";
			    }
			    	console.log("this......");
	          		li[0].style.backgroundColor = "blue";
			

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值