为什么复选框在未选中时不在 onchange 提交任何数据

Why checkbox not submitting any data at onchange when being unchecked

我使用 Web2Py 构建了一些复选框,它们看起来都与这个相似:

<input type="checkbox" value="some_value" onchange="ajax('/app/controller/function/args', ['the_name'])" name="the_name" id="some_id" class="boolean">

他们应该提交他们对变化的价值,他们确实这样做了。当我 print request.vars:

<Storage {'the_name': some_value}>

但仅在检查或激活它们时。

另一种方式,当它们未选中或停用时,ajax 调用已完成,但未提交任何数据。再次 print request.vars:

<Storage {}>

为什么这只有效 'one-way'?

编辑:

使用默认值 value="on" 时行为保持不变。指定我在做什么:我有许多隐藏的复选框,它们在单击按钮时被选中/取消选中。当复选框未隐藏并直接单击时,行为不会改变 - 在激活时提交数据,在停用时不提交任何数据。 这是我使用的JS。

$(function() {
    return $('.btn-trigger').click(function() {
        var btn, checkbox;
        btn = $(this);
        checkbox = btn.next();
        if (checkbox.attr('checked')) {
            checkbox.val('false');
            checkbox.removeAttr('checked').prop('checked', false);
            checkbox.trigger('change');
            return btn.removeClass('btn-success').addClass('btn-danger');
        } else {
            checkbox.val('true');
            checkbox.attr('checked', 'checked').prop('checked', true);
            checkbox.trigger('change');
            return btn.removeClass('btn-danger').addClass('btn-success');
        }
    });
});

这个问题的解决方案是沿着复选框传递一个隐藏的输入字段。复选框和隐藏字段必须共享相同的名称:

<input type="checkbox" value="some_value" onchange="ajax('/app/controller/function/args', ['the_name'])" name="the_name" id="some_id" class="boolean">
<input type="hidden" name="the_name value="some_value">

现在,如果取消激活复选框(未选中),则传递来自隐藏字段的值:

<Storage {'the_name': some_value}>

在激活时传递来自两个字段的值:

<Storage {'the_name': [some_value, some_value]}>

This post pointed to the solution.