【问题标题】:Use a jQuery script with a HTML button使用带有 HTML 按钮的 jQuery 脚本
【发布时间】:2017-12-01 21:21:18
【问题描述】:

在我的 Django 管理表单中,我有一个如下所示的字段:

Select All 按钮使用jQuery 脚本:

$(document).ready(function () {
    $('#id_season_0').click(function (event) { //on click 
        if (this.checked) { // check select status
            $('.checkbox').each(function () { //loop through each checkbox
                this.checked = true; //select all checkboxes with class "checkbox1"               
            });
        } else {
            $('.checkbox').each(function () { //loop through each checkbox
                this.checked = false; //deselect all checkboxes with class "checkbox1"                       
            });
        }
    });
});

但问题是:Select All 也是我的models 中的一个字段,我不想再拥有它了。所以我实际上正在尝试进行一些修改。对于SelectAll,我想使用HTML button 而不是BooleanField

所以我在change_form.html 中使用此代码:

<button id="selectall" type="button" class="checkbox"> Select All </ button>

我尝试将 id 更改为 selectall 但这不起作用。请帮忙 ?

【问题讨论】:

  • 只有&lt;input type=checkbox&gt;&lt;input type=radio&gt; 可以具有checked 属性。它对 &lt;button&gt; 元素无效。如果需要,您可以使用 css 设置复选框的样式,使其看起来像一个按钮。
  • 谢谢你的回答,你让我学到了一些东西!是的,我将使用 css,我认为这是个好主意

标签: jquery django forms


【解决方案1】:

您有几个选择。无论选择什么都不应该是模型中的一个字段。如果您使用的是 ModelForm,您仍然可以在使用 form.fields['season'] = forms.BooleanField() 创建表单后添加字段。

该字段不会保存到数据库中。但是您也可以在 html 中添加任何您想要的内容并使用它来切换。

如果它是一个按钮,我可能会这样做:

$('#selectall').click(function (event) { //on click 
    $(this).toggleClass('checked_all');
    $('.checkbox').prop('checked', $(this).hasClass('checked_all'));
});

做同样事情的代码要少得多。大多数情况下,您可以使用 jQuery 避免 .each() 。如果您选择了多个对象,您可以在一行中更改多个对象。

$('.checkbox').prop('checked', $(this).hasClass('checked_all'));

这表示将所有 .checkbox 元素设置为 $(this).hasClass('checked_all') 的值。 (真或假,我们每次都用 $(this).toggleClass('checked_all') 来切换它)。

【讨论】:

  • 感谢您的回答。如果我将您的方法与按钮一起使用,我怎样才能将此按钮放在“季节”字段上?因为在 change_form.html 中,我只能将 HTML 按钮放在页面的头部或底部,而不能直接放在字段上。
  • 您可以手动渲染每个字段,也可以使用 JavaScript 将其添加到页面中。
【解决方案2】:

注意:我在这里做了一些假设,因为您没有包含完整的 html。

您可以保留复选框并执行以下操作:

$(document).ready(function () {
    $('#id_season_0').click(function (event) { //on click 
        if (this.checked) { // check select status
            $('.checkbox').not('#id_season_0').each(function () { //loop through each checkbox
                this.checked = true; //select all checkboxes with class "checkbox1"               
            });
        } else {
            $('.checkbox').not('#id_season_0').each(function () { //loop through each checkbox
                this.checked = false; //deselect all checkboxes with class "checkbox1"                       
            });
        }
    });

});

添加 .not('#id_season_0') 将意味着忽略全选复选框。

jQuery .not() documentation

如果您真的想使用按钮,请使用:

$(document).ready(function () {
    $('.selectAll').click(function (event) { //on click 
        if (this.checked) { // check select status
            $('.checkbox').each(function () { //loop through each checkbox
                this.checked = true; //select all checkboxes with class "checkbox1"               
            });
        } else {
            $('.checkbox').each(function () { //loop through each checkbox
                this.checked = false; //deselect all checkboxes with class "checkbox1"                       
            });
        }
    });

});

和html:

<button type="button" class="checkbox selectAll">Select All</button>

【讨论】:

  • 谢谢你,我会将你的第一个答案与 css custom 结合起来,没关系:)
  • 这不适用于按钮元素。 if (this.checked) { // check select status。按钮没有checked 属性。
  • 我认为他没有尝试将按钮设置为“已选中”。他正在尝试使用一个按钮将所有复选框设置为“已选中”。
  • 是的,这是保存 BooleanField 但应用 "$('.checkbox').not('#id_season_0')" 并自定义这个 css 的最佳方法,不是吗?
  • 那行得通。就个人而言,如果你想要一个按钮,我会使用一个按钮而不是使用额外的 CSS 来设置复选框的样式,使其看起来像一个按钮。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-12-18
  • 2011-09-08
  • 2015-01-03
  • 1970-01-01
  • 1970-01-01
  • 2016-09-02
相关资源
最近更新 更多