为什么无法通过Javascript遍历
为什么无法通过Javascript遍历
当有人点击列表上的li项目时,我的任务是切换“done”属性。我发现了其他的方法,但是这个方法对我无效,我渴望理解为什么。我的代码有什么问题?难道不能像这样分配处理程序,或者我的代码中还有其他问题吗?\n
var liList = document.querySelectorAll("li"); for (var i = 0; i < liList.length; ++i){ liList[i].onItemClick = function() { liList[i].classList.toggle("done"); } }
\n
- 笔记本
- 果冻
- 菠菜
- 米饭
- 生日蛋糕
- 蜡烛
问题的原因是使用了箭头函数(arrow function)作为事件处理程序。箭头函数没有自己的this值,而是继承自包围它的函数或代码块的作用域。因此,在上述代码中,箭头函数中的this指向全局对象,而不是被点击的li元素。
解决方法是使用普通的函数表达式而不是箭头函数作为事件处理程序。普通函数表达式中的this值将自动指向触发事件的元素。
修正后的代码如下:
var liList = document.querySelectorAll("li"); for (var i = 0; i < liList.length; ++i){ liList[i].addEventListener("click", function() { this.classList.toggle("done"); }); }
感谢你,它像我想要的那样工作了。我只想问一下 - 在JavaScript中使用"this"的规则是什么?每次我将一个函数分配给事件处理程序时,"this"会引用被点击/悬停等的对象吗?
基本上,'this'关键字在点击事件中引用当前循环内的元素。