【问题标题】:Why we cannot POST unchecked checkbox?为什么我们不能发布未选中的复选框?
【发布时间】:2015-08-21 06:52:46
【问题描述】:

我有一个包含大约 80 个复选框的表单,默认情况下所有这些复选框都会被选中。用户只会取消选中不需要的项目,所以我在POST 中寻找未选中的复选框元素。但是,POST 只保存选中的值。

经过一番搜索,我找到了适合我的情况的解决方法:this question

解决方法:

<form>
  <input type='hidden' value='0' name='selfdestruct'>
  <input type='checkbox' value='1' name='selfdestruct'>
</form>

使用它我可以获得隐藏字段的值,从而实现我的目的。

但重要的问题是为什么这不是默认功能?我已经找到了第一次听起来很奇怪的任何技术问题的正当理由。但是对于这个(不能发布未选中的复选框)我仍然很想知道原因。

如果有人能阐明这个话题,我将不胜感激。

【问题讨论】:

  • 您正试图将正方形挤成圆形。这不适用于复选框,您应该改用 Radio 类型。
  • 要转换,也许我必须用两个单选按钮替换每个复选框。我确定 Check-box 是我需要的形式:)
  • @OrelEraki 复选框非常适合此目的。你只需要改变你在服务器端检查它们的方式。
  • @GolezTrol,的确,他们很好,但如果他想发送 True 或 False,我会建议他采用不同的方法。

标签: html post checkbox


【解决方案1】:

W3C explains 只提交“成功”的控件。

一个成功的控件对于提交来说是“有效的”。

  • 所有“打开”复选框都可能成功。

同样,对于单选按钮,只有“开启”的单选按钮是“成功的”,对于菜单,只有选中的选项是“成功的”。

【讨论】:

  • 这个链接很有用。没有选择单选按钮时如何?我们仍然可以将它们视为“有效”提交吗?如果是这样,为什么要对复选框进行特殊处理?
  • 单选按钮也是一样的。如果选择无,则不发布该值。与其他控件一样,复选框具有一个当前值。对于输入,您可以键入该值。对于selects,您可以通过option 选择该值。对于复选框,当前值由value 属性确定。一个复选框没有两个值(一个用于选中,一个用于未选中),但它只有一个值是否已发布,具体取决于复选框是否被选中。服务器脚本应该知道有哪些复选框,并且任何未发布的名称都不会被隐式检查。
  • 当您有一组未选中的单选按钮时,这不是“成功”,并且根本不会提交任何内容。
  • 我喜欢你把“有效”放在引号之间的方式。我真的希望这种异常会在 HTML 6 中得到修复……未选中的复选框与选中的复选框一样有效。根据假设销毁数据是一个糟糕的主意。
【解决方案2】:

未选中的复选框不会在 POST 数据中发送。您应该检查它是否为空:

if (empty($_POST['field1']))
     ....
else
     ....

您还忘记在您的字段中添加正确的nameid。添加此项将更容易进行检查。

<input type='hidden' value='0' name='field1' id="field1" >

【讨论】:

  • 问题中的输入已经有了名字。 id 与发布表单无关。
  • 它不是强制性的,但在应用一些javascript时很有用。
  • 当然,但问题只是关于张贴表格,而您声称该 id 被“遗忘”,这是不正确的。所以关于 ids 的评论给你的答案增加了噪音,实际上使它不正确。很遗憾,因为您问题的第一部分很有用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-11
  • 1970-01-01
  • 1970-01-01
  • 2014-02-12
  • 1970-01-01
  • 2012-07-24
相关资源
最近更新 更多