1. 程式人生 > >關於實現點選一行,下一行變色問題

關於實現點選一行,下一行變色問題

今天在做如題目說的效果(如下程式碼)時,發現在時間註冊函式中判斷迴圈值出現問題。所有的節點的點選事件後都是第一行高亮。

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