1. 程式人生 > >利用js輸出ul下li的index索引值

利用js輸出ul下li的index索引值

{} 事件委托 eve rip 實現 lis dataset nodelist arr

<!DOCTYPE html>
<html>
	<head>
	 	<meta charset="UTF-8">
	    <title>打印索引</title>
	</head>
	<style type="text/css">
		li{background: pink;margin-bottom: 10px;height: 40px;}
	</style>
	<body>
                <ul>
		    <li>click</li>
		    <li>click</li>
		    <li>click</li>
		    <li>click</li>
		    <li>click</li>
		</ul>
	</body>
	<script>
            var nodeList = document.getElementsByTagName(‘li‘);
	    for (var i = 0; i < nodeList.length; i++) {
	       nodeList[i].addEventListener("click", function(e) {
	            console.log(i)
	        }, false);
	    }
        </script>
</html> 

  上面代碼會和我們預期的結果不應,每次點擊輸出的都是最後一個元素的索引。
  function(e){}的匿名函數,在執行時,每一個都會創建一個新的作用域。這些匿名函數不會立即執行,僅僅是被定義,只有在點擊時才執行,被當做參數傳入addEventListener函數。所以在執行時i的值已經變為最後一個索引值。

  要解決這個問題,我們可以用以下幾種方案:

方案1----使用閉包;

<script>
    var nodeList = document.getElementsByTagName(li);
       for (var i = 0; i < nodeList.length; i
++) { (function(j){ nodeList[j].addEventListener("click", function(e) { console.log(j); }, false); })(i) ; } </script>

方案2-----使用es6中let的塊級作用域;

<script>
    var nodeList = document.getElementsByTagName(‘li‘);
    for (let i = 0; i < nodeList.length; i++) {
       nodeList[i].addEventListener("click", function(e) {
            console.log(i)
        }, false);
    }
</script>

方案3----利用事件委托機制;

  如果li較少的話,利用上面方式實現是可以的,但是如果li的數量過多,為每個li添加事件偵聽就會對頁面性能產生很大的影響,我們可以采用委托實現。 利用Array.prototype.slice.call(nodeList)的作用是將具有length屬性的元素轉為數組,這樣可利用indexOf方法獲取li的索引值。

<script>
    var nodeList = document.getElementsByTagName(‘li‘);
    arrNodes = Array.prototype.slice.call(nodeList);
    nodeUls = document.getElementsByTagName(‘ul‘);
    nodeUls[0].addEventListener("click",function(event){
        var event = event || window.event;
        var target = event.target || event.srcElement;
        console.log(arrNodes.indexOf(target))
    },false);
</script>

方案4-----使用虛擬屬性;

<script>
    var nodeList = document.getElementsByTagName(li);
    for(var i=0; i< nodeList.length; i++){
        nodeList[i].index = i;
        nodeList[i].addEventListener("click",function(e){
            console.log(this.index)
        },false)
    }
</script>

方案5----利用自定義屬性;

  ul>li結構中給li標簽加上自定義屬性

<ul>
    <li data-index="0">click</li>
    <li data-index="1">click</li>
    <li data-index="2">click</li>
    <li data-index="3">click</li>
    <li data-index="4">click</li>
</ul>

  然後js代碼如下

<script>
    var nodeList = document.getElementsByTagName("li");
    for(var i=0; i<nodeList.length ; i++){
        nodeList[i].addEventListener("click",function(e){
            console.log(e.target.dataset.index);//自定義屬性用data-index格式的,可以使用dataset獲取;
           console.log(this.getAttribute("data-index"));
        },false)
    }
</script>

  

利用js輸出ul下li的index索引值