【问题标题】:Vanilla JS - Can add/remove class on child elements but all are activeVanilla JS - 可以在子元素上添加/删除类,但都处于活动状态
【发布时间】:2018-04-10 08:48:48
【问题描述】:

我能够添加和删除子元素上的类,但所有类都处于活动状态。我试图一次只在一个活动元素上添加和删除。我错过了什么?

<ul id="parent" class="container">
  <li class="child"><a href="#one">one</a></li>
  <li class="child"><a href="#two">two</a></li>
  <li class="child"><a href="#three">three</a></li>
</ul>


document.addEventListener("DOMContentLoaded", function() {

  const parent = document.querySelector('#parent');
  parent.style.backgroundColor = 'blue';
  const childrens = document.querySelectorAll('.child');
  const child = document.querySelector('.child a')

  Array.prototype.forEach.call(
   document.querySelectorAll('.child'),
    function(element) {
      element.onclick = addActive;
    }
  );

 function addActive(element){
  element = this;
   if(element.classList.contains('active')) {
    element.classList.remove('active');
   } else {
    element.classList.add('active');
   }
 }
});

这是一个:codepen

【问题讨论】:

    标签: javascript events children


    【解决方案1】:

    现在您仅从单击的元素中添加/删除活动类。在将单击的元素设置为活动之前,您必须从所有元素中删除该类。

    例如

    function addActive(element) {
      element = this;
      if (element.classList.contains('active')) {
        element.classList.remove('active');
      } else {
        childrens.forEach(function(e) {
          e.classList.remove('active');
        });
        element.classList.add('active');
      }
    }
    

    【讨论】:

      【解决方案2】:

      一种解决方案是首先从所有元素中删除active 类:

      function addActive(element) {
      
        childrens.forEach(function(elem) {
          elem.classList.remove("active");
        });
      
        element = this;
        if (element.classList.contains("active")) {
          element.classList.remove("active");
        } else {
          element.classList.add("active");
        }
      }
      

      这是working Codepen example

      【讨论】:

        【解决方案3】:

        这可能是使用纯 js 切换子元素的最直接方式。

        <ul id="parent" class="container">
         <li class="child"><a href="#one">one</a></li>
         <li class="child"><a href="#two">two</a></li>
         <li class="child"><a href="#three">three</a></li>
        </ul>
        
        <script>
        //get children 
        var theChildren = document.querySelector('#parent').children;
        
        //set event listener for to each child
        function selectChild(child) {
        child.addEventListener('click', function() {
            var checkChildStatus = document.querySelector('#parent .selected');
            if (checkChildStatus) {
                checkChildStatus.classList.remove('selected');
            }
            
            child.classList.add('selected');        
         });
        }
        
        //loop through all children
        [...theChildren].forEach(selectChild);
        </script>
        

        【讨论】:

          猜你喜欢
          • 2021-11-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-03-13
          相关资源
          最近更新 更多