1. 程式人生 > >JS如何給ul下的所有li繫結點選事件,點選使其彈出下標和內容

JS如何給ul下的所有li繫結點選事件,點選使其彈出下標和內容

這是一個非常常見的面試題,出題方式多樣,但考察點相同,下面我們來看看這幾種方法:

方法一:

  var itemli = document.getElementsByTagName("li");

   for(var i = 0; i<itemli.length; i++){

    itemli[i].index = i; //給每個li定義一個屬性索引值

    itemli[i].onclick = function(){

      alert(this.index+this.innerHTML); 

    }

   }

方法二:

var itemli = document.getElementsByTagName("li");

for(var i = 0; i<itemli.length; i++){

   (function(n){

          itemli[i].onclick = function(){

      alert(n+itemli[n].innerHTML);  

     }

    })(i)

   }

方法三:

var itemli = document.getElementsByTagName("li");

for(var i = 0; i<itemli.length; i++){
        itemli[i].onclick = function(n){
        return function(){
                alert(n+itemli[n].innerHTML);  
            }
      }(i)
    }

方法四:


$("ul li").click(function(){
        var item = $(this).index();  //獲取索引下標 也從0開始
        var textword = $(this).text();  //文字內容
        alert(item+textword);
    })

上面這四種方法都可以實現迴圈繫結,但是我們知道,頻繁的操作DOM是非常消耗效能的,如果有1000個li,怎麼辦呢?我們還有另一種思路,事件代理,又稱事件委託。簡單的來講就是利用JS中事件的冒泡屬性,把原本需要繫結的事件委託給父元素,讓父元素擔當事件監聽的職務。下面我們來看看。

方法五(JS事件代理):

 var ul = document.querySelector("ul");
    ulItem.onclick = function (e) {
        e = e || window.event; //這一行及下一行是為相容IE8及以下版本
        var target = e.target || e.srcElement;
        if (target.tagName.toLowerCase() === "li") {
            var li = this.querySelectorAll("li");
            index = Array.prototype.indexOf.call(li, target);
            alert(target.innerHTML + index);
        }
    }

上述程式碼中,為什麼需要 “index = Array.prototype.indexOf.call(li,target);” 這樣使用陣列的indexOf方法呢,這是因為querySelectorAll方法獲取到的元素列表不是陣列,和函式的arguments一樣是一種類陣列型別,不可以直接使用陣列的方法。

方法六(jQuery事件代理):

 $(document).ready(function () {
        $("ul").on("click", function (event) {
            var target = $(event.target);
            alert(target.html() + target.index())
        });
    });