關于移動鼠標的幾種寫法求人指點下
是這樣的 我開始寫關于這個鼠標移動的代碼然后寫了幾種形式發現都不能實現 一開始以為是寫錯了或者語法有誤 ?請大家看看
window.onload?=?function?shubiao(){
????????var?a=document.getElementsByTagName("tr")
?????//?鼠標移動改變背景,可以通過給每行綁定鼠標移上事件和鼠標移除事件來改變所在行背景色。
?????
???????for(i=0;i<a.length;i++){
? ? function sb(a){
tr[a].style.backgroundColor="#f2f2f2"
}
?function sq(a){
tr[a].style.backgroundColor="#fff"
}
????
???????a[i].onmouseover=sb(i)
???????a[i].onmouseout=sq(i)
???????
???????}
這種在for里面定義函數的方法感覺有問題 但是我感覺定義在for外面也不對
我后面自己在網上研究了之后得到的結果是
window.onload = function(){
? ? ? ? ? ? ? ? ??
? ? ?// 鼠標移動改變背景,可以通過給每行綁定鼠標移上事件和鼠標移除事件來改變所在行背景色。
? ? ? ? ?var tr=document.getElementsByTagName("tr")
function sb(a){
? ? return function (){
? ? ? ? ? tr[a].style.backgroundColor="#f2f2f2" ??
? ? } ??
}
? ? ? ? ? ? function sq(b){
? ? return function (){
? ? ? ? ? tr[b].style.backgroundColor="#fff" ??
? ? } ??
}
? ? ?for(i=0;i<tr.length;i++){
? ? ? ? ?tr[i].onmouseover=sb(i);
? ? ? ? ?tr[i].onmouseout=sq(i);
? ? ?}
?
}
? ? ?
請高手指點下 ?謝謝!
2015-05-31
你循環了N次,sb(a)也聲明了多次……但這不是重點,重點是你以為sb(a)的a會分別根據i來賦值,每個sb都有自己的i值,但其實他們引用的都是最后一個i,因為每個sb的作用域鏈都保存著匿名函數的活動對象。
下面是用了閉包的方法,這樣每個sb(a)就會有不同的i,sb有創建了一個閉包,這個閉包保存了i值的副本,所以可以返回不同的數值。