Как сделать обработку нажатия на какой-либо тег с конкретным классом?

123
11 ноября 2019, 10:50

К примеру, у нас есть какой-то div, при нажатии на ссылку которого происходит смена класса в другом диве:

function active(element) { 
  //Очищаем все уже нажатые элементы 
  for (var i = 1; i < N; i++) { 
    var clear = document.getElementById("tab_" + i); 
    clear.className = "cont" + i; 
  } 
  //Присваиваем новый класс нажатому элементу 
  var block = document.getElementById("tab_" + element); 
  if (block.className == "cont" + element) { 
    block.className = "cont" + element + " is_active"; 
  } 
}
<div><a href="#" onclick="active('1');">Смени меня</a></div> 
<div><a href="#" onclick="active('2');">Смени меня</a></div> 
<div id="tab_1" class="cont1 is_active"> 
  <p>Первый див</p> 
</div> 
<div id="tab_2" class="cont2"> 
  <p>Второй див</p> 
</div>

Из кода видно, что функция active вызывается при нажатии на конкретную ссылку через onclick. Но как сделать вызов этой функции, чтобы в атрибутах стоял только id? Как должен измениться JS, кроме того, что он станет каким-то "пассивным" обработчиком? Могу ошибаться в формулировке.

Answer 1

Может слегка костыльно, но написал на коленке.

[...document.querySelectorAll("a")].forEach((item, index) => { 
  item.addEventListener("click", (e) => { 
    let foo = document.querySelectorAll("p"); 
    for (var i = 0; i < foo.length; i++) { 
      if (foo[i].classList.contains("active")) { 
        foo[i].classList.remove("active"); 
      } else { 
        foo[index].classList.add("active"); 
      } 
    } 
  }); 
});
.active { 
  background: pink; 
}
<a href="#">Click me 1</a> 
<a href="#">Click me 2</a> 
 
<p>Some text 1</p> 
<p>Some text 2</p>

Answer 2

Вот так, наверное, попытался не трогать вашу оригинальную функцию active(element)

function active(element) { 
  //Очищаем все уже нажатые элементы 
  for (var i = 1; i < 3; i++) { 
    var clear = document.getElementById("tab_" + i); 
    clear.className = "cont" + i; 
  } 
  //Присваиваем новый класс нажатому элементу 
  var block = document.getElementById("tab_" + element); 
  if (block.className == "cont" + element) { 
    block.className = "cont" + element + " is_active"; 
  } 
} 
 
[].slice.call(document.querySelectorAll('.clickable')) 
  .forEach((el, i) => el.onclick = active.bind(null, i+1));
.is_active{ 
  background-color: red; 
}
<div><a href="#" class='clickable'>Смени меня</a></div> 
<div><a href="#" class='clickable'>Смени меня</a></div> 
<div id="tab_1" class="cont1 is_active"> 
  <p>Первый див</p> 
</div> 
<div id="tab_2" class="cont2"> 
  <p>Второй див</p> 
</div>

READ ALSO
Баг в канвасе при отрисовке второго круга возникает линия

Баг в канвасе при отрисовке второго круга возникает линия

Есть канвас, на нем сетка, которую можно перерисовывать по нажатию на кнопки

143
Съезжает верстка

Съезжает верстка

Есть таймлайн на сайте, при попытке редактировать текст(уменьшить количество символов), вся верстка едет к чертямНе понимаю в чем дело CSS:

123
Не удается посмотреть стили

Не удается посмотреть стили

Пару раз сталкивался с сайтами, на которых нельзя посмотреть стили страницы, те допустим я сижу с хрома, и кликая правой кнопкой мыши - ноль...

119
Как правильно вывести таблицу

Как правильно вывести таблицу

Я через сервлет вывожу информацию из MySQL в виде таблицы (name и surname)Он работает правильно, но когда выводится таблица он без линии между ячейками

126