为什么复选框在未选中时不在 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.
我使用 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.