Как добавить активный класс к определенному “li” при щелчке пользователя

#javascript #dom-events

#javascript #dom-события

Вопрос:

Я искал в Интернете простой ответ, и я не смог его найти. Потратил слишком много времени, пытаясь разобраться в этом, но я был бы признателен за любую помощь или правильное направление.

HTML

 <ul id="main-li">
     <li>item1</li>
     <li>item1</li>
     <li>item1</li>
</ul>
  

JavaScript:

 document.getElementById('main-li').addEventListener("click", function(e) {
  if (e.target amp;amp; e.target.nodeName === "LI") {
    e.target.classList.add("active-class");
  }
});
  

JSFiddle
https://jsfiddle.net/kw0rr3fv/1 /

По словам Дэвида Уоша: https://davidwalsh.name/event-delegate

Делегирование событий позволяет избежать добавления прослушивателей событий к определенным узлам; вместо этого прослушиватель событий добавляется к одному родительскому элементу. Этот прослушиватель событий анализирует события с пузырьками, чтобы найти совпадение с дочерними элементами

Каков наилучший способ удалить предыдущий активный класс при присоединении класса к выбранному элементу?

Ответ №1:

Единственный способ, который существует для удаления класса для каждого дочернего элемента UL, — это перебирать их.

Если вы хотите избежать таких фреймворков, как jQuery, вы можете просто добиться этого с помощью очень короткого кода:

 document.getElementById('main-li').addEventListener("click", function(e) {
    if (e.target amp;amp; e.target.nodeName === "LI") {
        let elements = document.getElementById('main-li').children;
        for (let i = 0; i < elements.length;   i) {
            elements[i].classList.remove("active-class");
        }
        e.target.classList.add("active-class");
     }
}, true);
  

Как вы видите, я только что добавил в ваш код очень короткий цикл, который удаляет класс (он не будет блокироваться, если у элемента нет класса).

В последней строке кода вы можете заметить, что я добавил true значение: это use capture и используется, чтобы предположить, что событие UL должно быть захвачено дочерними элементами LI.

Комментарии:

1. Мне действительно нравится ваше решение. Он чистый и делает именно то, что я искал. Спасибо!

Ответ №2:

Я обнаружил, что это сложнее, чем я ожидал. Является ли это распространенным способом установки активного класса?

Вы можете использовать фреймворк, такой как jQuery, который поможет вам сделать это быстрее и в кроссбраузерном режиме.

Каков наилучший способ удалить предыдущий активный класс при присоединении его к выбранному элементу?

Проверьте обновленную скрипку

 document.getElementById('main-li').addEventListener("click", function(e) {
  console.log(e);
  Array.prototype.slice.call(document.querySelectorAll('#main-li li')).forEach( function( obj ){
    obj.classList.remove("active-class");
  });
  if (e.target amp;amp; e.target.nodeName === "LI") {
    e.target.classList.add("active-class");
  }
});
  

Сначала вам нужно удалить класс из всех li, а затем продолжить добавление active-class

Ответ №3:

Я думаю, что следует сосредоточить внимание только на теге «li» и добавить прослушиватель событий в качестве моего простого кода и легко читаемого ниже.

 var elementsLi = document.querySelectorAll('ul#main-li > li');

for (var i = 0; i < elementsLi.length; i  ) {
    elementsLi[i].addEventListener('click', function(e) {
         // console.log(e.currentTarget); // for see the current element
         if (e.currentTarget.classList.contains('active-class')) {
              // do something if already have class "active-class"
              // remove class or blah blah blah
         }
         else {
              e.currentTarget.classList.add('active-class')
         }
    });
}
  

Надеюсь на ваш успех 🙂

Комментарии:

1. Когда вам нужно удалить весь «активный класс», вы можете добавить логику для удаления класса из всех «li», прежде чем добавлять «активный класс» в текущий элемент.

Ответ №4:

Создана страница, которая добавляет класс «active» при каждом щелчке элемента «li».

 <style>
	.active { color: red; }
</style>

<ul>
     <li>item1</li>
     <li>item2</li>
     <li>item3</li>
</ul>

<script>
var arr = document.getElementsByTagName("li");

for(var i=0; i<arr.length; i  ){
	arr[i].addEventListener("click", function(){
	
			for(var j=0; j<document.getElementsByTagName("li").length; j  ){
				document.getElementsByTagName("li")[j].className = "";
				event.target.className = "";
			};
	
		event.target.className = "active"
	});
}
</script>  

Комментарии:

1. Пожалуйста, ознакомьтесь с требованиями к вопросу. Вам не хватает, чтобы отменить выбор предыдущих элементов

2. Добавлена отмена выбора 🙂

Ответ №5:

Вы также можете использовать Jquery для этого. это быстро и короче, чем ваш код.

 $(document).ready(function(){
$('#main-li').on('click',function(){
$(this).addClass('active-class').siblings().removeClass('active-class');
});
});