JS Как менять активный элемент коллекции?

139
18 апреля 2022, 22:00

Пытаюсь переписать код с jQuery на ванильный JS. При клике на элемент коллекции должен добавляться класс 'active', а при клике на другой элемент класс 'active' должен передаться другому.

Код:

<tbody id="body_table">
   <tr class="row" data-id="1">
     <td class="name ">Смородина Алена</td>
   </tr>
   <tr class="row " data-id="2">
     <td class="name">Коновалов Александр</td>
   </tr>
   <tr class="row " data-id="3">
     <td class="name">Зайченко Валентина</td>
  </tr>
</tbody>

На jQuery это примерно так

$(document).ready(() => {
    $('.row').click((event) => {
        const userId = event.currentTarget.getAttribute('data-id');
                setActiveRow(event.currentTarget);
    })
});

function setActiveRow(el) {
    $('.row').removeClass('active');
    $(el).addClass('active');
}

А на чистом достиг такого результата. Класс 'active' навешивается и убирается только с одного элемента, индекс которого прописан.

function learnUserId() {
    for (var i = 0; i < row.length; i++) {
        row[i].addEventListener('click', function () {
            const userId = event.currentTarget.getAttribute('data-id');
            setActiveRow(event.currentTarget)
        });
    }
}

function setActiveRow(el) {
    if (row[1].classList.contains('active') == true) {
        el.classList.remove('active');
    } else {
        el.classList.add('active')
    }
}

Помогите разобраться как правильно сделать. Спасибо!

Answer 1

document.querySelectorAll('.row').forEach((currentRow,index,rows)=>{
  currentRow.addEventListener('click',()=>{
    rows.forEach((row)=> row.classList.remove('active'));
    currentRow.classList.add('active');
  })
})
.row.active{
  color: red;
}
<table>
  <tbody id="body_table">
     <tr class="row" data-id="1">
       <td class="name ">Смородина Алена</td>
     </tr>
     <tr class="row " data-id="2">
       <td class="name">Коновалов Александр</td>
     </tr>
     <tr class="row " data-id="3">
       <td class="name">Зайченко Валентина</td>
    </tr>
  </tbody>
</table>

READ ALSO
Объединить массивы и вывести в HTML

Объединить массивы и вывести в HTML

есть 2 массива с переменными, нужно их объединить, создать из них элементы button с классом btn-menu, data элементом category (с переменной из массива) и текстом...

150
Помогите преобразовать PHP в JS или jQuery [закрыт]

Помогите преобразовать PHP в JS или jQuery [закрыт]

Хотите улучшить этот вопрос? Переформулируйте вопрос так, чтобы он был сосредоточен только на одной проблеме

154
обход скриптом всех селекторов [закрыт]

обход скриптом всех селекторов [закрыт]

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

165
Почему WaitAll не работает должным образом

Почему WaitAll не работает должным образом

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

167