【问题标题】:Select all checkbox only works some of the time全选复选框仅在某些时候有效
【发布时间】:2019-08-31 16:17:06
【问题描述】:

我有一个带有复选框的表单,以及表单内的隐藏全选按钮。我使用 jQuery 来侦听表单外的按钮单击,然后“单击”隐藏的按钮元素以全选。有时页面会加载,我点击按钮,它工作得很好。您可以多次单击它,它们都会按预期选中和取消选中。表单提交完美。

但是,其他时候,页面会加载并且我单击按钮但没有任何反应。无论我点击多少次,他们都不会检查。我发现如果页面停留超过 10 秒而我没有做任何事情,这种情况会发生很多。但它也可能发生在页面加载时。我不明白为什么。我的代码中是否有我没有看到的错误?

$(document).ready(function(){
    $('#select-all').click(function(event) {
        if(this.checked) {
            // Iterate each checkbox
            $(':checkbox').each(function() {
                this.checked = true;
                $('label.choice').toggleClass("choice-text-color");
            });
        } else {
            $(':checkbox').each(function() {
                this.checked = false;
                $('label.choice').toggleClass("choice-text-color");
            });
        }
     });

    $("#selectAll").click(function() {
            $('#select-all').click()
    });
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<button id="selectAll" class="btn btn-secondary my-2 my-sm-0"
                type="button" name="selectAll">Select All</button>


<form>
<input type="checkbox" id="1"><label for="1" class="choice">ABC</label>
<input type="checkbox" id="2"><label for="2" class="choice">DEF</label>
  (....etc.....)

<input type="checkbox" id="select-all" style="display: none;">
            <input type="submit" style="display: none;">

        </form>

【问题讨论】:

  • 这段代码应该做什么?为什么是隐藏的复选框?如果单击“全选”按钮,为什么还要单击另一个隐藏项目然后全选,只需全选。无需遍历所有复选框以查看它们是否被选中,只需查询选中或未选中的复选框并应用适当的类。
  • 您实际单击的全选按钮位于表单之外。这就是为什么有一个隐藏的复选框用于选择所有与外部按钮相关的复选框。正如我在解释中所说,这段代码有时可以完美运行。我想知道为什么它不能 100% 工作。
  • 我的第一个猜测是它与$(':checkbox').each... 有关。我认为这将包括select-all 复选框。也许这会造成意外……?删除display: none,看看它是否按照你的想法做。
  • 按钮是在form 内部还是外部对于您在此处使用的功能而言没有区别。将一个按钮绑定到另一个按钮的功能在这里没有实际用途或需要。所以,我再次问,你想在这里做什么,只是有一个“全选”按钮?如果我们让您的代码更简洁并直截了当,您的问题就会迎刃而解。
  • 我希望用户能够单击表单外部标记为“#selectAll”的按钮(用于显示目的)并选中所有复选框。到目前为止,它对我有用的唯一方法是将该按钮绑定到标记为“#select-all”的隐藏复选框,然后让 jquery 运行循环。它有时有效,有时无效。

标签: javascript jquery html css checkbox


【解决方案1】:

在我看来,您的问题是由于您为促进全选功能和与之相关的 JavaScript/JQuery 而添加的无关标记造成的。

您只需要一个按钮(无论它是否是表单的一部分)来触发选择/取消选择操作。此外,由于按钮不会作为表单的一部分传输任何数据,因此不应使用 name 属性。

另外,如果您不希望用户看到表单的提交按钮,那么就不要在表单中添加一个。然后,您可以使用$(form).submit() 以编程方式提交表单。

// Passing a function into JQuery is the same as document.ready
$(function(){
  // JQuery recommends the use of "on" to bind events
  $('#selectAll').on("click", function(event) {
    $(':checkbox').each(function() {
       this.checked = true; 
    });
    $('label.choice').addClass("choice-text-color"); // Update the class use
  });
});
.choice-text-color {
  color:red;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<button id="selectAll" class="btn btn-secondary my-2 my-sm-0" type="button">Select All</button>
<form>
  <input type="checkbox" id="1"><label for="1" class="choice">ABC</label>
  <input type="checkbox" id="2"><label for="2" class="choice">DEF</label>
</form>

【讨论】:

  • 谢谢。这似乎工作得更好。我认为造成我困惑的主要原因是我还有位于表单外部的表单提交按钮,而且我认为必须将其绑定到表单内的隐藏提交才能起作用。至少,这是我让它工作的唯一方法。
  • 再一次,您不需要form 内的隐藏元素与表单外的元素相关联。您可以在任何您想要的地方设置提交按钮。如果你把它放在表单之外,那么只需将form 属性添加到它以将其“连接”到form,如:&lt;button type="submit" form="my-form"&gt;Submit&lt;/button&gt;,其中my-formid(不是@987654332 @form)。但实际上,您为什么首先关心将元素放在form 之外?只需将所有内容都放在form 元素中。任何元素都可以放在form 元素中,而不仅仅是表单字段。
  • 我会试试看的。这主要是因为我有一个 2 列表单,当它与表单列之一位于同一元素内时,我无法正确设置提交按钮的样式。我在 Stack Overflow 上找到了 jquery 解决方案,它很有效,所以我就照做了。
  • 我不知道您使用的原始代码是什么,但您应该明白form 在页面上没有视觉效果。您可以将 body 中的所有内容包装在 form 中,并且布局不会受到影响。无论您遇到什么布局问题,都可以使用 CSS 解决,而不是改变 form 的位置,也不会改变它的内部或外部。
  • 快速问题:如果单击“全选”时某些框已被选中,它将取消选中它们,同时选中所有其他框。您对 If/Else 语句有什么快速建议,可以确保所有框都被选中/取消选中?
猜你喜欢
  • 2012-02-11
  • 2015-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-01
相关资源
最近更新 更多