批量註冊事件處理函式索引總是最後一個問題解決

antzone發表於2017-03-21

如果元素較多的時候,批量註冊事件處理函式是一個非常便利的事情,但是這個操作往往在初學者中會出現一些問題,最為常見的一個就是,批量註冊完畢之後,事件觸發之後,如果按照元素的個數作為索引的話,總是顯示最後一個索引。

先看一段程式碼例項:

[HTML] 純文字檢視 複製程式碼
<!DOCTYPE html>
<html>
<head>
<meta charset=" utf-8">
<meta name="author" content="http://www.softwhy.com/" />
<title>螞蟻部落</title>
<script type="text/javascript">
window.onload=function(){
  var obox=document.getElementById("box");
  var lis=obox.getElementsByTagName("li");
  for(var i=0;i<lis.length;i++){
    lis[i].onclick=function(){
      alert(i);
   }
  }
}
</script>
</head>
<body>
<ul id="box">
  <li>螞蟻部落一</li>
  <li>螞蟻部落二</li>
  <li>螞蟻部落三</li>
  <li>螞蟻部落四</li>
</ul>
</body>
</html>

以上程式碼的本意是點選導航欄目的時候能夠彈出對應欄目的索引值,但是彈出的確實欄目的數量。

出現以上問題的原因是,使用for迴圈註冊時間處理函式的時候,全域性變數i的最終值是4,所以最終彈出值是4。

解決方案一:

[HTML] 純文字檢視 複製程式碼
<!DOCTYPE html>
<html>
<head>
<meta charset=" utf-8">
<meta name="author" content="http://www.softwhy.com/" />
<title>螞蟻部落</title>
<script type="text/javascript">
window.onload=function(){
  var obox=document.getElementById("box");
  var lis=obox.getElementsByTagName("li");
  for(var i=0;i<lis.length;i++){
    lis[i].index=i;
    lis[i].onclick=function(){
      alert(this.index);
   }
  }
}
</script>
</head>
<body>
<ul id="box">
  <li>螞蟻部落一</li>
  <li>螞蟻部落二</li>
  <li>螞蟻部落三</li>
  <li>螞蟻部落四</li>
</ul>
</body>
</html>

以上程式碼實現了我們的要求,實現方式非常的簡單,就是將每一次迴圈時i的值賦給當前li的自定義屬性index,彈出值就是當前li的自定義屬性index的值,因為this是指向當前函式呼叫物件。

解決方案二:

[HTML] 純文字檢視 複製程式碼
<!DOCTYPE html>
<html>
<head>
<meta charset=" utf-8">
<meta name="author" content="http://www.softwhy.com/" />
<title>螞蟻部落</title>
<script type="text/javascript">
window.onload=function(){
  var obox=document.getElementById("box");
  var lis=obox.getElementsByTagName("li");
  for(var i=0;i<lis.length;i++){
    (function(index){
      lis[index].onclick=function(){
        alert(index)
      }
    })(i)
  }
}
</script>
</head>
<body>
<ul id="box">
  <li>螞蟻部落一</li>
  <li>螞蟻部落二</li>
  <li>螞蟻部落三</li>
  <li>螞蟻部落四</li>
</ul>
</body>
</html>

以上程式碼同樣實現了我們的要求,比較簡單,這裡就不多介紹了。

相關文章