2016-02-17 3 views
0

Я работаю над улучшением своего JavaScript после использования jQuery. Я пытаюсь переключить видимость списка элементов на основе того, что пользователь нажимает.JavaScript - Переключить классы на основе события click

Вот пример кода Pen: http://codepen.io/sdejaneiro/pen/BjEVBQ?editors=1000

В примере, что я хочу сделать, это, при нажатии на «Часть 1 Пункт C» (или часть 2 Пункт C или часть 3 Пункт) (который имеет класс series) Я хочу показать подэлементы под ним (которые содержатся внутри списка ul с классами seriesSet и hidden. Я дошел до щелчка даже до каждого экземпляра класса series, но не уверен как настроить таргетинг на правильный seriesSet. Я попытался использовать forEach, прикрепленный к каждому экземпляру seriesSet, но это привело к запуску всех списков ul wi го этого класса все сразу.

Я хочу попытаться сохранить код как можно более чистым, поэтому я избегал добавлять идентификаторы в списки seriesSet, но, может быть, мне нужно что-то подобное для JavaScript?

Вот JavaScript:

NodeList.prototype.forEach = Array.prototype.forEach; 

//toggle series lists 
document.querySelectorAll('.series').forEach(function(i) { 
    i.addEventListener('click', function(e) { 
    e.preventDefault(); 
    //select the correct .seriesSet ul list and remove class "hidden" 
    }) 
}); 

ответ

0

Это должно делать то, что вы просите

e.target.children[0].classList.toggle("hidden");

+0

Этот ответ верен, просто добавив примечание, что, если вы хотите использовать его в старых браузерах (в основном IE9), вам необходимо включить [прокладку или полиполк] (https://developer.mozilla.org/en-US/docs/Web/API/Element/classList#JavaScript_shim_for_other_implementations). –

0

Другой способ заключается в использовании JQuery:

$('.series').click(function() { 
    $(this).find('.seriesSet').toogleClass('hidden'); 
}); 

Edit: Извините, я не прочитал первое предложение .../

+0

Это нормально: P. Если это была вещь jQuery, то это именно то, что я бы сделал. –

0

Использование firstElementChild в качестве селектора для элементов ul с элементом элемента списка кликов. Затем проверьте скрытый класс.

NodeList.prototype.forEach = Array.prototype.forEach; 

//toggle series lists 
document.querySelectorAll('.series').forEach(function(i) { 
    i.addEventListener('click', function(e) { 
    var ch = this.firstElementChild; 
    e.preventDefault(); 
    //select the correct .seriesSet ul list and remove class "hidden" 
    if (/hidden/.test(ch.className)) ch.className = 'seriesSet'; 
    else ch.className = 'seriesSet hidden'; 
    }) 
}); 

Я хотел бы захватить текст Элементы списка в элементе, как промежуток, или а-тег, хотя, таким образом, вы находитесь в состоянии предотвратить подпункты от переключая меню резервного копирования.

+0

Что вы имеете в виду, поместив элементы списка в промежуток? Как это?

  • текст
  • 0

    Может быть что-то вроде этого

    CodePen

    var series = document.querySelectorAll('.series'); 
    
    for (var i = 0; i < series.length; i++) { 
        series[i].addEventListener('click', function(e) { 
        e.preventDefault(); 
        updateSub(this); 
        }) 
    } 
    
    function updateSub(el) { 
        for (var i = 0; i < series.length; i++) { 
        if (series[i] == el) { 
         el.childNodes[1].classList.toggle('hidden'); 
        } else { 
         series[i].childNodes[1].classList.add('hidden'); 
        } 
        } 
    } 
    
    0

    Чистейший подход должен был бы сделать что-то вроде этого:

    var tree = document.querySelectorAll('ul.series a:not(:last-child)'); 
     
    for(var i = 0; i < tree.length; i++){ 
     
        tree[i].addEventListener('click', function(e) { 
     
         var parent = e.target.parentElement; 
     
         var classList = parent.classList; 
     
         if(classList.contains("open")) { 
     
          classList.remove('open'); 
     
          var opensubs = parent.querySelectorAll(':scope .open'); 
     
          for(var i = 0; i < opensubs.length; i++){ 
     
           opensubs[i].classList.remove('open'); 
     
          } 
     
         } else { 
     
          classList.add('open'); 
     
         } 
     
        }); 
     
    }
    body { 
     
        font-family: Arial; 
     
    } 
     
    
     
    ul.series li { 
     
        list-style-type: none; 
     
        position: relative; 
     
    } 
     
    
     
    ul.series li ul { 
     
        display: none; 
     
    } 
     
    
     
    ul.series li.open > ul { 
     
        display: block; 
     
    } 
     
    
     
    ul.series li a { 
     
        color: black; 
     
        text-decoration: none; 
     
    } 
     
    
     
    ul.series li a:before { 
     
        height: 1em; 
     
        padding:0 .1em; 
     
        font-size: .8em; 
     
        display: block; 
     
        position: absolute; 
     
        left: -1.3em; 
     
        top: .2em; 
     
    } 
     
    
     
    ul.series li > a:not(:last-child):before { 
     
        content: '+'; 
     
    } 
     
    
     
    ul.series li.open > a:not(:last-child):before { 
     
        content: '-'; 
     
    }
    <ul class="series"> 
     
        <li><a href="#">Part 1</a> 
     
        <ul> 
     
         <li><a href="#">Item A</a> 
     
         <ul> 
     
          <li><a href="#">Sub-item 1</a></li> 
     
          <li><a href="#">Sub-item 2</a></li> 
     
          <li><a href="#">Sub-item 3</a></li> 
     
         </ul> 
     
         </li> 
     
         <li><a href="#">Item B</a> 
     
         <ul> 
     
          <li><a href="#">Sub-item 1</a></li> 
     
          <li><a href="#">Sub-item 2</a></li> 
     
          <li><a href="#">Sub-item 3</a></li> 
     
         </ul> 
     
         </li> 
     
         <li><a href="#">Item C</a> 
     
         <ul> 
     
          <li><a href="#">Sub-item 1</a></li> 
     
          <li><a href="#">Sub-item 2</a></li> 
     
          <li><a href="#">Sub-item 3</a></li> 
     
         </ul> 
     
         </li> 
     
         <li><a href="#">Item D</a> 
     
         <ul> 
     
          <li><a href="#">Sub-item 1</a></li> 
     
          <li><a href="#">Sub-item 2</a></li> 
     
          <li><a href="#">Sub-item 3</a></li> 
     
         </ul> 
     
         </li> 
     
         <li><a href="#">Item E</a> 
     
         <ul> 
     
          <li><a href="#">Sub-item 1</a></li> 
     
          <li><a href="#">Sub-item 2</a></li> 
     
          <li><a href="#">Sub-item 3</a></li> 
     
         </ul> 
     
         </li> 
     
        </ul> 
     
        </li> 
     
    
     
        <li><a href="#">Part 2</a> 
     
        <ul> 
     
         <li><a href="#">Item A</a> 
     
         <ul> 
     
          <li><a href="#">Sub-item 1</a></li> 
     
          <li><a href="#">Sub-item 2</a></li> 
     
          <li><a href="#">Sub-item 3</a></li> 
     
         </ul> 
     
         </li> 
     
         <li><a href="#">Item B</a> 
     
         <ul> 
     
          <li><a href="#">Sub-item 1</a></li> 
     
          <li><a href="#">Sub-item 2</a></li> 
     
          <li><a href="#">Sub-item 3</a></li> 
     
         </ul> 
     
         </li> 
     
         <li><a href="#">Item C</a> 
     
         <ul> 
     
          <li><a href="#">Sub-item 1</a></li> 
     
          <li><a href="#">Sub-item 2</a></li> 
     
          <li><a href="#">Sub-item 3</a></li> 
     
         </ul> 
     
         </li> 
     
         <li><a href="#">Item D</a> 
     
         <ul> 
     
          <li><a href="#">Sub-item 1</a></li> 
     
          <li><a href="#">Sub-item 2</a></li> 
     
          <li><a href="#">Sub-item 3</a></li> 
     
         </ul> 
     
         </li> 
     
         <li><a href="#">Item E</a> 
     
         <ul> 
     
          <li><a href="#">Sub-item 1</a></li> 
     
          <li><a href="#">Sub-item 2</a></li> 
     
          <li><a href="#">Sub-item 3</a></li> 
     
         </ul> 
     
         </li> 
     
        </ul> 
     
        </li> 
     
    
     
        <li><a href="#">Part 3</a> 
     
        <ul> 
     
         <li><a href="#">Item A</a> 
     
         <ul> 
     
          <li><a href="#">Sub-item 1</a></li> 
     
          <li><a href="#">Sub-item 2</a></li> 
     
          <li><a href="#">Sub-item 3</a></li> 
     
         </ul> 
     
         </li> 
     
         <li><a href="#">Item B</a> 
     
         <ul> 
     
          <li><a href="#">Sub-item 1</a></li> 
     
          <li><a href="#">Sub-item 2</a></li> 
     
          <li><a href="#">Sub-item 3</a></li> 
     
         </ul> 
     
         </li> 
     
         <li><a href="#">Item C</a> 
     
         <ul> 
     
          <li><a href="#">Sub-item 1</a></li> 
     
          <li><a href="#">Sub-item 2</a></li> 
     
          <li><a href="#">Sub-item 3</a></li> 
     
         </ul> 
     
         </li> 
     
         <li><a href="#">Item D</a> 
     
         <ul> 
     
          <li><a href="#">Sub-item 1</a></li> 
     
          <li><a href="#">Sub-item 2</a></li> 
     
          <li><a href="#">Sub-item 3</a></li> 
     
         </ul> 
     
         </li> 
     
         <li><a href="#">Item E</a> 
     
         <ul> 
     
          <li><a href="#">Sub-item 1</a></li> 
     
          <li><a href="#">Sub-item 2</a></li> 
     
          <li><a href="#">Sub-item 3</a></li> 
     
         </ul> 
     
         </li> 
     
        </ul> 
     
        </li> 
     
    </ul>

    (см. Также this Fiddle)

    Смежные вопросы