利用JS输出ul下li的index索引值

如何利用原生JS输出ul下li的index索引值,如果按以下的写法写,则每次点击输出的都是最后一个元素的索引。
function(e){}的匿名函数,在执行时,每一个都会创建一个新的作用域。这些匿名函数不会立即执行,仅仅是被定义,只有在点击时才执行,被当做参数传入addEventListener函数。所以在执行时i的值已经变为最后一个索引值。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>打印索引</title>
</head>
<body>
<ul>
    <li>click</li>
    <li>click</li>
    <li>click</li>
    <li>click</li>
    <li>click</li>
</ul>
<script>
   var nodeList = document.getElementsByTagName('li');
   for (var i = 0; i < nodeList.length; i++) {
       nodeList[i].addEventListener("click", function(e) {
            alert(i);
        }, false);
   }
</script>
</body>
</html>

实现方法

1.利用闭包实现

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>打印索引</title>
</head>
<body>
<ul>
    <li>click</li>
    <li>click</li>
    <li>click</li>
    <li>click</li>
    <li>click</li>
</ul>
<script>
   var nodeList = document.getElementsByTagName('li');
   for (var i = 0; i < nodeList.length; i++) {
    (function(j){
        nodeList[j].addEventListener("click", function(e) {
            alert(j)
        }, false);
    })(i) ;
}
</script>
</body>
</html>

2.ES6实现
我们也可以利用ES6的let来实现

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>打印索引</title>
</head>
<body>
<ul>
    <li>click</li>
    <li>click</li>
    <li>click</li>
    <li>click</li>
    <li>click</li>
</ul>
<script>
   var nodeList = document.getElementsByTagName('li');
   for (let i = 0; i < nodeList.length; i++) {
       nodeList[i].addEventListener("click", function(e) {
            alert(i);
        }, false);
   }
</script>
</body>
</html>

3.利用事件委托机制
如果li较少的话,利用上面方式实现是可以的,但是如果li的数量过多,为每个li添加事件侦听就会对页面性能产生很大的影响,我们可以采用委托实现。
利用Array.prototype.slice.call(nodeList)的作用是将具有length属性的元素转为数组,这样可利用indexOf方法获取li的索引值。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>打印索引</title>
</head>
<body>
<ul>
    <li>click</li>
    <li>click</li>
    <li>click</li>
    <li>click</li>
    <li>click</li>
</ul>
<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;
        alert(arrNodes.indexOf(target))
    },false);
</script>
</body>
</html>
  • 6
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值