Проблема в том, что при нажатии на флажок состояние checked
изменяется. Затем событие продолжает всплывать в DOM и перехватывается вашим обработчиком событий в строке, которая затем сбрасывает проверенное состояние обратно к его начальному значению, поэтому ничто не выглядит иначе.
Чтобы это исправить, вы можете проверить что целью события был флажок, и если это так, оставьте свойство checked
как есть:
$("#table_id").on("click", ".table-body-row", function(e) {
if (!$(e.target).is(':checkbox'))
$(':checkbox', this).prop('checked', (i, checked) => !checked);
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<table id="table_id">
<tr class="table-body-row">
<td>Lorem ipsum</td>
<td>Foo bar</td>
<td><input type="checkbox" />
</tr>
</table>
Обратите внимание на явное использование prop()
здесь для запуска события в элементе. Также обратите внимание, что вызов stopPropagation()
для самого флажка здесь не будет работать, так как вы используете делегированный обработчик события (поэтому событие уже всплыло до того, как оно было перехвачено).