这个是之前面试的一道题,当时给的答案是类似下面这种:
var nodes = document.getElementsByTagName("li");
for(i = 0;i
然后回来网上搜了搜,结果发现答案基本就是这一种,当时那个面试官对我这答案感觉不满意,问我还有别的方法实现么,我说不知道= =
这里问问大家,要是你,你会怎么回答这到问题呢?
Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
方式1. 使用闭包。
方式2.事件代理
方式3. 引入jQuery,使用其中的on或delegate进行事件绑定(它们都有事件代理的特性)
方式4. 使用ES6中的新特性let来声明变量
用let来声明的变量将具有块级作用域,很明显可以达到要求,不过需要注意的是得加个'use strict'(使用严格模式)才会生效。
事件代理?
在这堆li元素的父元素上挂事件可能是更好的实现方式。
首先你得东西有一个很大的问题,就是你获取的是页面上所有的
li,所以console.log(i)输出的是在所有li中,当前的是第几个。至于要输出
index,几种写法:不过现在好像更推荐
addEventListener来添加事件,然后选择器用的更精确一点。闭包,和你的一样。
用
let来声明i或者通过
js的方法获取当前li的index这个问题的考察点是闭包,你的答案已经做到了。
还可以改进的就是绑定事件的方式,做到兼容旧版本的IE。
还可能会有要求输出当前 UL中的li次序。
如果
li很多,每个都绑定事件太占内存了,需要用到事件代理。但是使用代理后每次点击都遍历一遍太浪费,可以第一次遍历后缓存起来(像jQuery一样),只要DOM结构不改变,下次点击可以直接返回缓存中的li了。闭包太占用内存,如果考虑优化效果的话,可以试试利用自定义属性在for循环里边的第一句加上一个nodes[i].index = i;这样的话不会形成私有作用域内存不释放。还能利用自定义属性找到正确的索引。
这题是考性能优化的吧?
用事件委托来答题应该好点