JS checkbox.checked与手动检查


JS checkbox.checked vs manually checking

我有一个页面,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值时,不会触发clickchange事件。

既然您用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解决方案。