在 Firefox 中,click() 不会在设置 checkbox.disabled = false 后立即 运行

In Firefox, click() does not run right after setting checkbox.disabled = false

我正在为 Apache Wicket 页面编写一些 Javascript,并尝试创建一个 "Select All" 复选框,选中该复选框后,将选中所有其他复选框,然后禁用它们。同样,取消选中时,它将启用和取消选中所有复选框。此复选框不会被其余复选框更新(也就是说,selecting 所有其他复选框不会 select Select 全部框)。

我可以使用 checkbox.checked = selectAll.checked 完成我想要的,但它似乎没有传递单击事件,我需要它来实现 Wicket 中的某些功能。使用 checkbox.click() 为我提供了我需要的点击事件,但在重新启用复选框后似乎没有 运行。

var selectAll = document.getElementById("all");

function checkbox_changed() {
  checkboxes = document.getElementsByName('foo');

  for (var i in checkboxes) {
    var checkbox = checkboxes[i];

    checkbox.disabled = false;

    if (checkbox.checked !== selectAll.checked) {
      //checkbox.checked = selectAll.checked;
      checkbox.click();
    }

    if (selectAll.checked) {
      checkbox.disabled = true;
    }
  }
}
<form>
  <input type="checkbox" id="all" onchange="checkbox_changed()">Select All
  <br>
  <br>
  <input type="checkbox" name="foo">One
  <br>
  <input type="checkbox" name="foo">Two
  <br>
  <input type="checkbox" name="foo">Three
  <br>
  <input type="checkbox" name="foo">Four
  <br>
</form>

如果它更容易,这里是上面的 jsfiddle:https://jsfiddle.net/ytggu5as/

编辑:我刚刚意识到这只发生在 Firefox 中(我使用的是 39.0)并更新了问题。在 Chrome 和 Safari 中似乎没问题(没有测试过任何其他)。知道为什么会发生这种情况以及如何解决它吗?如果不是,是否有比使用 .checked 更好的 .click() 替代方法?

在 重新启用复选框后调用 click() 的事实似乎是 bug in Firefox

您可以通过在第一遍中设置 disabled=false 来解决此错误,然后在 setTimeout(..., 0) 中再次遍历复选框并根据需要调用 click()