我有一个页面,php将其分页为每页100个结果,每个结果旁边都有复选框。我有三个功能:一个选择所有,一个保存检查的内容,一个恢复检查的内容。
我不明白为什么我的切换功能不能与其他两个一起工作
如果我单击全选(执行切换()),则不会保存检查的值;然而,如果我用手点击它们,它们确实会通过分页保存。
我假设我必须按照persistCheckBox(checkboxes[I].checked)到切换函数的最后一行做一些事情——我尝试了一下,但没有成功有人能解释一下原因吗
function toggle(source) {
checkboxes = document.getElementsByName('multi_mag[]');
for (var i = 0, n = checkboxes.length; i < n; i++) {
checkboxes[i].checked = source.checked;
}
}
function restorePersistedCheckBoxes() {
var aStatus = getPersistedCheckStatus();
for (var i = 0; i < aStatus.length; i++) {
var aPair = aStatus[i].split(':');
var el = document.getElementById(aPair[0]);
if (el) {
el.checked = aPair[1] == '1';
}
}
}
function persistCheckBox(el) {
var found = false;
var currentStateFragment = el.id + ':' + (el.checked ? '1' : '0');
var aStatus = getPersistedCheckStatus();
for (var i = 0; i < aStatus.length; i++) {
var aPair = aStatus[i].split(':');
if (aPair[0] == el.id) {
// State for this checkbox was already present; replace it
aStatus[i] = currentStateFragment;
found = true;
break;
}
}
if (!found) {
// State for this checkbox wasn't present; add it
aStatus.push(currentStateFragment);
}
// Now that the array has our info stored, persist it
setPersistedCheckStatus(aStatus);
}
checked
值时,不会触发click
和change
事件。
既然您用jQuery
标记了您的问题,我将演示使用一些jQuery代码。
从你的代码中还不清楚你是如何进行持久存储的,也不清楚你的HTML结构是什么,所以代码将展示一种通用的方法。
不过,有一点建议:我强烈建议您将样式代码从结构中删除,并使用CSS,避免内联事件处理。您想要完成的几乎所有事情都可以在HTML之外更干净地完成。
我将起诉一个有几个复选框的表单,其中第一个复选框将更改其他复选框的状态。
HTML:
<form id="boxes">
<input type="checkbox" id="all" name="all" />
<input type="checkbox" name="multi_mag[]" class="normal" />
...
<input type="checkbox" name="multi_mag[]" class="normal" />
</form>
Javascript:
在本例中,所有的"normal"复选框都有一些共同的属性(在这种情况下,我决定使用一个类),允许事件委派。
$('#boxes').delegate('.normal', 'change', function (e) {
console.log('changed', e.target.checked);
});
此代码将一个函数设置为在每次复选框更改时运行,对应于您的persistCheckBox()
方法。
接下来,你的toggle()
函数的等价物:
$('#all').change(function (e) {
var checked = e.target.checked;
console.log('changed checkall box: ', checked);
checkboxes = document.getElementsByName('multi_mag[]');
for (var i = 0, n = checkboxes.length; i < n; i++) {
checkboxes[i].checked = checked;
$(checkboxes[i]).change();
}
});
每当"主"复选框更改其状态时,就会执行它。所有复选框都被迭代,它们的值被更改,并且更改事件被触发,这使得每个复选框都运行前面提到的函数。
您可以将此方法应用于(已清理的)代码,并且应该维护持久性。
示例jsFiddle(检查控制台中的活动日志)。
这段小代码可以选中/取消选中复选框,并将触发任何相关的事件。
$('input[type=checkbox]').触发器('click');
这可能有助于
我通过添加修复了这个问题我通过在toggle()函数的最后一行添加"persistCheckBox(checkboxes[I]);"修复了这个@MasterAM我感谢您的批评,并将使用它们来优化我的代码。我也非常感谢您提供的JQuery解决方案。