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

xiaoxiao2021-03-01  23

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

<!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>

 

转载请注明原文地址: https://www.6miu.com/read-3200195.html

最新回复(0)