简体   繁体   English

点击addEventListener时,不要选择“ this”

[英]addEventListener on click, choose not `this`

I have a loop with addEventListener function: 我有一个循环与addEventListener函数:

var tabs = document.getElementsByClassName('tab');

for (var t = 0; t < tabs.length; t++) {
  tabs[t].addEventListener('click', function(){
    this.className += ' active';
  }, false);
}

As you can see, I want to add .active class name to my li on click event. 如您所见,我想将.active类名添加到单击事件中的li But also, I want to remove .active class, from my others li 's. 但是,我也想从其他li的类中删除.active类。 How can I do this trick? 我该怎么做?

Here is a example. 是一个例子。

 var tabs = document.getElementsByClassName('tab'); for (var t = 0; t < tabs.length; t++) { tabs[t].addEventListener('click', function(){ this.className += ' active'; }, false); } 
 .tabs { display: inline-block; ul { list-style-type: none; li { cursor: pointer; float: left; padding: 10px 40px; background: #FDFDFD; &.active { background: #8F95B0; color: #FFF; border-top-left-radius: 5px; border-top-right-radius: 5px; } } } } 
 <div class="tabs"> <ul> <li class="tab active">Product Overview</li> <li class="tab">Specifications</li> <li class="tab">Related products</li> </ul> </div> 

Try to remove active class from all the elements first, 首先尝试从所有元素中删除active类,

var tabs = document.getElementsByClassName('tab');

for (var t = 0; t < tabs.length; t++){
  tabs[t].addEventListener('click', function(){
    //~~~~~~~~~~~~~~~~~~~~~
    //select all the elements with class active
    Array.from(document.querySelectorAll(".active")).forEach(function(itm){
        itm.classList.remove("active")
    });
    //And remove the class active from it.
    //~~~~~~~~~~~~~~~~~~~~~
    this.classList.add('active');
  }, false);
}

DEMO DEMO

Since you have only one active class to be set, you can alter the code like below, 由于您只能设置一个活动类别,因此您可以更改以下代码,

var tabs = document.getElementsByClassName('tab');

for (var t = 0; t < tabs.length; t++){
  tabs[t].addEventListener('click', function(){
   document.querySelector(".active").classList.remove("active")
   this.classList.add('active');
  }, false);
}

DEMO DEMO

Here is your fixed jsFiddle: 是您的固定jsFiddle:

I just added function to access your cached tabs and remove the previous selected then apply new class on click. 我刚刚添加了访问您的缓存选项卡的功能,并删除了先前选择的选项,然后单击应用新类。

 var tabs = document.getElementsByClassName('tab'); function changeSelectedTab(tabEl) { for (var t = 0; t < tabs.length; t++) { tabs[t].className = 'tab'; }; tabEl.className += ' active'; } for (var t = 0; t < tabs.length; t++) { tabs[t].addEventListener('click', function(){ changeSelectedTab(this); }, false); } 
 .tabs { display: inline-block; ul { list-style-type: none; li { cursor: pointer; float: left; padding: 10px 40px; background: #FDFDFD; &.active { background: #8F95B0; color: #FFF; border-top-left-radius: 5px; border-top-right-radius: 5px; } } } } 
 <div class="tabs"> <ul> <li class="tab active">Product Overview</li> <li class="tab">Specifications</li> <li class="tab">Related products</li> </ul> </div> 

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM