Я буду писать из затылка, но думаю, что происходит, когда вы нажимаете флажок, он устанавливается, но в то же время событие в строке обращает это вспять. В результате, похоже, ничего не произошло, а 2 вещи произошли.
Попробуйте захватить event
и предотвратить дефолт. Если вы нажмете на самом входе, то он все равно будет обработан JS.
const cb = document.querySelectorAll('.checkboxfirst');
cb.forEach(e => {
e.addEventListener('click', function (event) {
event.preventDefault();
const checkbox = e.closest('tr').querySelector('.checkboxfirst input');
checkbox.checked = !checkbox.checked;
});
});
[ приведенный выше код был скорректирован во время редактирования ]
(Примечание:если это динамический список, вы можете рассмотреть возможность перемещения прослушивателя в переменную, чтобы вы могли удалить его при удалении элемента. В противном случае это может привести к утечке памяти.)
[ edit ]
Поскольку вопрос был расширен, это расширенная часть ответа. Теперь я думаю, что если вы установите флажок, то его parentNode - это не <tr>
, а сама ячейка, следовательно, querySelector не сможет найти .checkbox input
. Метод closest('tr')
найдет первого подходящего родителя (или родителя родителя и т. Д.).
По сути, то же самое следует сделать и для другого флажка.
const cb = document.querySelectorAll('.checkbox');
cb.forEach(e => {
e.addEventListener('click', function(event) {
event.preventDefault();
const checkbox = e.closest('tr').querySelector('.checkbox input');
checkbox.checked = !checkbox.checked;
});
});