Дизайн
Один из подходов состоит в том, чтобы вручную инициировать событие нажатия с помощью element.click()
.Но поскольку нам нужно выбрать между checked
и unchecked
, лучше связать событие onchange
, как показано ниже:
someCheckbox.onchange=function(e){
e.preventDefault();
if(this.checked){
onSelected(this); //trigger event to handle `check`
}else{
OnUnselected(this); //trigger event to handling `uncheck`
}
}
Теперь мы можем установить некоторые флажки следующим образом:
// var checkbox is a `Element`
if(checkbox.checked){} // do nothing if already checked
checkbox.checked = true;
onSelected(checkbox);
Мы также можем снять его аналогичным образом.
Реализация
Во-первых, создать функции для обработки check
/ uncheck
event
function onSelected(selectedElement){
var currentRow = selectedElement.parentNode.parentNode;
var selectedVin = currentRow.getElementsByTagName("td")[1];
console.log("seleced:",currentRow,selectedElement.name,selectedVin);
// ... ajax call
}
function onUnselected(unselectedElement){
// ...
}
function onchange(e){
e.preventDefault();
if(this.checked) { onSelected(this); }
else { onUnselected(this); }
}
И затем зарегистрируйте обработчик onchange
для каждого checkbox
элемента:
for (var i = 0; i < checkboxes.length; i++) {
var checkbox = checkboxes[i];
checkbox.onchange= onchange;
};
Наконец, зарегистрируйте обработчик #select-all.onchange
, как показано ниже:
document.getElementById('select-all').onchange=function(event) {
if (this.checked) {
$(':checkbox').each(function () {
if(this.checked){ return; } // do nothing if already checked
this.checked = true;
onSelected(this);
});
}
else {
$(':checkbox').each(function() {
if(!this.checked) { return; } // do nothing if already unchecked
this.checked = false;
onSelected(this);
});
}
};
Как примечание, я не думаю, что было бы хорошей идеей отправлять так много запросов AJAX.Лучше выполнить рефакторинг кода на стороне сервера, чтобы получить список проверенных строк, например {s1:"checked",s2:"unchecked",s3:"checked","s4":"checked"}
.Таким образом, браузер будет отправлять только один запрос.Очевидно, это будет намного эффективнее.