试着在我的javascript代码中理解“this”(一件事有效,另一件没有)

前端之家收集整理的这篇文章主要介绍了试着在我的javascript代码中理解“this”(一件事有效,另一件没有)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我一直在尝试通过将书中的一些 Jquery示例重构为javascript来学习javascript.在下面的代码中,我向选项卡添加了一个单击侦听器,并在用户单击选项卡时将其更改为活动状态.
var tabs = document.querySelectorAll(".tabs a span");
var content = document.querySelectorAll("main .content li");

for (var tabNumber = 0; tabNumber <= 2; tabNumber++) {
  tabs[tabNumber].addEventListener("click",function (event) {
    
    for (var i = 0; i < tabs.length; i++) {
      tabs[i].classList.remove("active");
    }
    tabs[tabNumber].classList.add("active");
    for (var i = 0; i < content.length; i++) {
      content[i].innerHTML = "";
    }
    event.preventDefault();
  });
}

这在运行时返回一个未定义的错误.但是,我尝试用this.classList.add(“active”)替换tabs [tabNumber] .classList.add(“active”)并且它有效.

为什么以前的代码不起作用?据我所知,他们指的是同一个东西,而tab [tabNumber]应该可以工作,因为在代码中它是tabs [0].

解决方法

我猜其他答案告诉你为什么标签[tabNumber]不起作用(因为它来自for循环的分数,因此,总是等于tabNumber的较大值).

这就是为什么我建议使用.forEach循环.但是要小心,因为它不适用于document.querySelectorAll()生成的DOM节点数组,但您可以使用:

// ES6
Array.from(document.querySelectorAll('...'))
// ES5
[].slice.call(document.querySelectorAll('...'))

无论如何,我做了一个简化的working demo代码.
请注意,我将当前活动的选项卡保存在变量中,以防止另一个for循环.你也可以这样做:

document.querySelector('.active').classList.remove('active')

但我喜欢减少DOM读取量.

祝你的apprentissage好运,将一些jQuery代码重写到Vanilla JS中似乎是一个很好的方法,你可能会对JavaScript有更好的理解.

猜你在找的JavaScript相关文章