利用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>
<think>好的,我现在需要帮用户解答关于Vue.js中v-for指令的问题。用户提供的代码片段是: ```html <ul> <li v-for"(item,index) in list">索引是:{{index}},姓名是:{{item.name}}</li> </ul> ``` 用户的问题是:“这里的索引是list里的数据吗?” 首先,我要先检查代码是否有语法错误。注意到在v-for后面缺少了等号,正确的写法应该是`v-for="(item, index) in list"`,用户写成了`v-for"(item,index)`,这可能是个笔误。不过用户的问题可能不是关于语法错误,而是关于索引的含义。但作为回答的一部分,可能需要指出这个错误,以免用户实际运行时出现问题。 接下来,用户的问题核心是索引index是否属于list里的数据。根据Vue.js的文档,v-for指令在遍历数组时,第二个参数是索引,即当前项的数组下标,从0开始。这里的index并不是list数据本身的一部分,而是由Vue在遍历过程中自动生成的。例如,如果list是一个包含三个对象的数组,那么index的值会是0、1、2,分别对应每个对象的数组位置。 需要明确区分数据和索引的概念。数据项item是list数组中的元素,而index只是这个元素在数组中的位置。例如,如果list中的每个元素都有name属性,那么item.name就是数据的一部分,而index只是位置信息,不是数据的一部分。 可能用户在使用v-for时,误以为index是数据中的某个字段,或者存在疑惑为什么index不需要在数据中定义。这时候需要澄清index的来源,是Vue在循环过程中自动提供的参数。 此外,用户可能在实际编码中遇到了问题,例如无法获取正确的索引,或者错误地使用了索引导致数据错误。因此,在回答时需要强调索引的作用和正确使用方法,同时指出代码中的语法错误,以避免用户在实际应用中遇到问题。 总结回答的结构应该是: 1. 指出代码中的语法错误。 2. 解释v-for的基本用法,参数item和index的来源。 3. 明确说明index不是list的数据,而是由Vue生成的索引。 4. 提供示例说明两者的区别。 5. 强调正确使用v-for的重要性,避免因语法错误导致的问题。 需要确保回答清晰易懂,避免使用过于专业的术语,同时提供足够的示例帮助用户理解。此外,注意用户之前的问题涉及Vue的事件处理,可能用户正在学习Vue的基础知识,因此需要保持回答的基础性和实用性,帮助用户逐步构建知识体系。</think>```html <ul> <li v-for"(item,index) in list">索引是:{{index}},姓名是:{{item.name}}</li> </ul> ``` --- ### 问题分析及解答: 1. **首先发现语法错误**: - 原代码缺少等号,正确写法应为:`v-for="(item, index) in list"`(注意 `=` 符号) - 修正后的代码: ```html <li v-for="(item, index) in list">索引是:{{index}},姓名是:{{item.name}}</li> ``` 2. **关于索引的本质**: - `index` **不是** list 数组中的数据内容 - `index` 是 Vue 在遍历数组时自动生成的**位置序号**,从 0 开始递增 - `item` 才是 list 数组中的实际数据项 --- ### 通过示例理解差异 假设数据: ```javascript list: [ { id: 1, name: "张三" }, { id: 2, name: "李四" } ] ``` 遍历结果: ```html <!-- 输出 --> <li>索引是:0,姓名是:张三</li> <!-- index由Vue生成 --> <li>索引是:1,姓名是:李四</li> <!-- index由Vue生成 --> ``` --- ### 参数详解表 | 参数 | 来源 | 数据属性 | 示例值 | |---------|--------------|----------|----------------| | `item` | list数组元素 | ✅ 是数据 | `{ id:1, name:"张三" }` | | `index` | Vue自动生成 | ❌ 非数据 | 0, 1... | --- ### 关键总结 - `index` 是**数组下标**,反映当前项在数组中的位置 - 若需要显示数据本身的序号字段,应使用类似 `item.id` 的数据属性 - 修正后的完整代码: ```html <ul> <li v-for="(person, idx) in list"> 数据ID:{{person.id}}, 系统索引:{{idx}}, 姓名:{{person.name}} </li> </ul> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值