為什麼用for迴圈繫結的事件處理函式只有最後一個有效
在允許的情況下使用for迴圈批量繫結事件處理函式非常的便利,但是有時候發現,明明挨個便利都繫結了事件處理函式,卻自有最後一個有效,下面通過一個例項簡單介紹一下出現此種現象的原因。
程式碼如下:
[HTML] 純文字檢視 複製程式碼<!doctype html> <html> <head> <meta charset="UTF-8"> <title>事件處理函式批量繫結</title> <style> body, p, ul, li, ol, dt, dd, dt, h1, h2, h3, h4, h5, h6 { margin:0; padding:0; } ul{list-style:none} #main{ width:400px; margin:0px auto; } .nav{ width:100px; height:30px; float:left; position:relative; } .second{ position:absolute; left:0px; top:30px; display:none; } </style> <script type="text/javascript"> window.onload=function(){ var main=document.getElementById("main"); var uls=main.children; var lis=uls[0].children; for(var i=0;i<lis.length-1;i++){ lis[i].onmouseover=function(){ lis[i].children[1].style.display="block"; } lis[i].onmouseout=function(){ lis[i].children[1].style.display = "none"; } } } </script> </head> <body> <div id="main"> <ul> <li class="nav"> <a href="#">螞蟻部落</a> <ul class="second"> <li>div+css教程</li> <li>div+css教程</li> <li>div+css教程</li> </ul> </li> <li class="nav"> <a href="#">螞蟻部落</a> <ul class="second"> <li>div+css教程</li> <li>div+css教程</li> <li>div+css教程</li> </ul> </li> <li class="nav"> <a href="#">螞蟻部落</a> <ul class="second"> <li>div+css教程</li> <li>div+css教程</li> <li>div+css教程</li> </ul> </li> </ul> </div> </body> </html>
在以上程式碼中,當滑鼠放在主導航的時候,只有第三個導航會彈出二級選單,之所以出現這個現象,是由於當通過for迴圈將事件處理函式註冊完畢之後,i的值變成3了,所以當觸發事件呼叫事件處理函式的時候,只是控制的第三個二級選單。
程式碼修改如下:
[HTML] 純文字檢視 複製程式碼<!doctype html> <html> <head> <meta charset="UTF-8"> <title>事件處理函式批量繫結</title> <style> body, p, ul, li, ol, dt, dd, dt, h1, h2, h3, h4, h5, h6 { margin:0; padding:0; } ul{list-style:none} #main{ width:400px; margin:0px auto; } .nav{ width:100px; height:30px; float:left; position:relative; } .second{ position:absolute; left:0px; top:30px; display:none; } </style> <script type="text/javascript"> window.onload=function(){ var main=document.getElementById("main"); var uls=main.children; var lis=uls[0].children; for(var i=0;i<lis.length;i++){ lis[i].index=i; lis[i].onmouseover=function(){ lis[this.index].children[1].style.display="block"; } lis[i].onmouseout = function () { lis[this.index].children[1].style.display="none"; } } } </script> </head> <body> <div id="main"> <ul> <li class="nav"> <a href="#">螞蟻部落</a> <ul class="second"> <li>div+css教程</li> <li>div+css教程</li> <li>div+css教程</li> </ul> </li> <li class="nav"> <a href="#">螞蟻部落</a> <ul class="second"> <li>div+css教程</li> <li>div+css教程</li> <li>div+css教程</li> </ul> </li> <li class="nav"> <a href="#">螞蟻部落</a> <ul class="second"> <li>div+css教程</li> <li>div+css教程</li> <li>div+css教程</li> </ul> </li> </ul> </div> </body> </html>
以上程式碼解決上面你的問題,方法就是為每一個li元素建立一個index屬性,然後將當前索引值賦值給這個屬性,在事件處理函式中使用this.index作為索引即可。
相關文章
- javascript事件處理函式迴圈批量繫結簡單介紹JavaScript事件函式
- echarts 繫結事件處理函式Echarts事件函式
- for迴圈批量註冊事件處理函式事件函式
- javascript迴圈事件只響應最後一次的問題處理JavaScript事件
- javascript事件處理函式繫結簡單介紹JavaScript事件函式
- [譯] 為什麼需要在 React 類元件中為事件處理程式繫結 thisReact元件事件
- js如何給繫結的事件處理函式傳遞引數JS事件函式
- 批量註冊事件處理函式索引總是最後一個問題解決事件函式索引
- 封裝javascript事件處理函式繫結和解綁程式碼封裝JavaScript事件函式
- 跨瀏覽器的事件處理函式繫結刪除封裝瀏覽器事件函式封裝
- 請問為什麼會在for迴圈結束才會執行非同步函式?非同步函式
- 為什麼要有事件迴圈機制(Event Loop)事件OOP
- jQuery能夠為一個元素註冊多個相同事件處理函式jQuery事件函式
- C# 清除事件繫結的函式C#事件函式
- javascript封裝相容所有瀏覽器的繫結和刪除事件處理函式JavaScript封裝瀏覽器事件函式
- js為物件註冊多個事件處理函式程式碼JS物件事件函式
- 如何為新增的元素註冊事件處理函式事件函式
- JavaScript為事件處理函式傳遞引數JavaScript事件函式
- javascript函式中的動作只有執行後才會有效JavaScript函式
- [JavaScript] 事件委託以及 Vue 列表迴圈事件繫結的效能最佳化JavaScript事件Vue
- uni-app入門教程(3)資料繫結、樣式繫結和事件處理APP事件
- 為什麼在React Component需要bind繫結事件React事件
- 關於jQuery用bind動態繫結事件無效的處理jQuery事件
- 事件迴圈Event loop到底是什麼事件OOP
- JavaScript 註冊事件處理函式JavaScript事件函式
- 正規表示式exec()函式只有第一執行有效分析函式
- js為按鈕註冊點選事件處理函式JS事件函式
- jquery為動態新增元素註冊事件處理函式jQuery事件函式
- 如何實現為window.onload註冊多個事件處理函式事件函式
- JavaScript中的事件迴圈機制跟函式柯里化JavaScript事件函式
- 為什麼迴圈佇列要浪費一個儲存空間佇列
- 首頁 Java事件處理模式 最後完稿。Java事件模式
- jQuery為非同步載入的元素註冊事件處理函式jQuery非同步事件函式
- jQuery為動態新增的按鈕註冊事件處理函式jQuery事件函式
- JavaScript 批量註冊事件處理函式JavaScript事件函式
- 公共事件處理函式js庫事件函式JS
- Spring 是怎麼處理迴圈依賴的?Spring
- React中this值繫結和事件函式傳參React事件函式