Если по какой-то причине вы не хотите (или не можете) запустить .click()
для элемента флажка, вы можете просто изменить его значение напрямую через его свойство .checked ( атрибут IDL из <input type="checkbox">
).
Примечание , что при этом не запускается нормально связанное событие ( change ) поэтому вам нужно вручную запустить его, чтобы получить полное решение, которое работает с любыми связанными обработчиками событий.
Вот функциональный пример в необработанном javascript (ES6):
class ButtonCheck {
constructor() {
let ourCheckBox = null;
this.ourCheckBox = document.querySelector('#checkboxID');
let checkBoxButton = null;
this.checkBoxButton = document.querySelector('#checkboxID+button[aria-label="checkboxID"]');
let checkEvent = new Event('change');
this.checkBoxButton.addEventListener('click', function() {
let checkBox = this.ourCheckBox;
//toggle the checkbox: invert its state!
checkBox.checked = !checkBox.checked;
//let other things know the checkbox changed
checkBox.dispatchEvent(checkEvent);
}.bind(this), true);
this.eventHandler = function(e) {
document.querySelector('.checkboxfeedback').insertAdjacentHTML('beforeend', '<br />Event occurred on checkbox! Type: ' + e.type + ' checkbox state now: ' + this.ourCheckBox.checked);
}
//demonstration: we will see change events regardless of whether the checkbox is clicked or the button
this.ourCheckBox.addEventListener('change', function(e) {
this.eventHandler(e);
}.bind(this), true);
//demonstration: if we bind a click handler only to the checkbox, we only see clicks from the checkbox
this.ourCheckBox.addEventListener('click', function(e) {
this.eventHandler(e);
}.bind(this), true);
}
}
var init = function() {
const checkIt = new ButtonCheck();
}
if (document.readyState != 'loading') {
init;
} else {
document.addEventListener('DOMContentLoaded', init);
}
<input type="checkbox" id="checkboxID" />
<button aria-label="checkboxID">Change the checkbox!</button>
<div class="checkboxfeedback">No changes yet!</div>
Если вы запустите это и нажмете как флажок, так и кнопку, вы должны получить представление о том, как это работает.
Обратите внимание, что ядля краткости / простоты использовал document.querySelector, но это можно легко сделать, чтобы либо передать заданный идентификатор конструктору, либо применить его ко всем кнопкам, которые действуют как метки арии для флажка (обратите внимание, что я этого не делалпотрудитесь установить идентификатор на кнопке и поставить флажок aria-labelledby, что должно быть сделано при использовании этого метода) или любой другой способ расширить это.Последние два addEventListener
просто продемонстрировать, как это работает.