Mam problem jak w temacie. Mam checkboxa z labelem zrobionego tak, żeby kliknięcie w label również zaznaczało checkboxa. Problem w tym, że podpięty jest do tego eventlistener i to wywołuje działanie dwa razy (w moim wypadku pokazuje się druga dodatkowa, zdublowana, pusta tabela). Długo szukałem w kodzie co wywołuje buga, aż w końcu dotarłem do sedna i wyczytałem w czym problem. Znalazłem nawet kilka rozwiązań jak to:
https://stackoverflow.com/questions/52869548/javascript-event-listener-fires-twice-when-clicking-on-text-inside-label-element
Ale nie bardzo się to nadaje, bo klikanie labela i checkboxa nie wywołuje tu eventlistenera. Dopiero kliku na puste pole w tym divie, a po co to komu? Próbowałem stworzyć rozwiązanie na bazie tego, ale nie poszło.
Po dłuższym kombinowaniu poleciałem po najmniejszej linii oporu i zrobiłem bieda rozwiązanie. Działa jak trzeba (aby po kliknięciu checkboxa odpalał się eventlistener, a jeśli kliknie się w labela to zaznaczał się checkbox i odpalał się eventlistener), ale to dublowanie działanie:
for($i=1; $i<=$_SESSION['numberOfRow']; $i++) {
echo '
<li class="inline testLI" title="'.$_SESSION["dataTable"][$i][7].'" id="ownList'.$i.'">
// <label class="labelcheckBoxBtnOwn" for="own'.$i.'">
<input type="checkbox" name="ownCheckBox" value="'.$i.'" id="own'.$i.'" class="checkBoxBtn checkBoxBtnOwn checkBoxBtnOandF">
<span>'.
// wyświetlane dane
'</span>
// </label>
</li>';
}
var userSelection = document.getElementsByClassName('testLI'); // wcześniej dla labela -> labelcheckBoxBtnOwn
var checkBoxSelectedOwn = document.getElementsByClassName('checkBoxBtnOwn');
for(var i = 0; i < userSelection.length; i++) {
(function(index) {
userSelection[index].addEventListener("click", function(e) {
if(checkBoxSelectedOwn[index].checked == false)
checkBoxSelectedOwn[index].checked = true;
else
checkBoxSelectedOwn[index].checked = false;
// dalszy kod po kliknięciu
})
})(i);
}
Wprowadziłem po prostu zwykłego ifa, który zaznacza lub odznacza checkboxa, gdy użytkownik kliknie gdzieś w ciało pozycji na liście, ale to oznacza, że kliknięcie na samym checkboxie będzie quasi podwójne - zaznaczony go i od razu odznaczy, więc jeszcze dodatkowo ten sam mechanizm tylko na checkboxie:
for(var i = 0; i < userSelection.length; i++) {
(function(index) {
checkBoxSelectedOwn[index].addEventListener("click", function() {
console.log("Stop");
if(checkBoxSelectedOwn[index].checked == false)
checkBoxSelectedOwn[index].checked = true;
else
checkBoxSelectedOwn[index].checked = false;
});
})(i);
}
No i tak jak mówiłem, działa jak trzeba, zaznacza jak trzeba. Tabelkę generuje ładnie pojedynczo, tylko nie sądzę, żeby było to eleganckie rozwiązanie.