当checkbox没有被set on时,它是不会被Form提交到Server的

(1)当checkbox没有被set on时,它是不会被Form提交到Server那去的?

(2)checkbox 的value有什么用,checkbox的缺省值是多少?

在做web开发的时候,通过提交表单Form将用户在页面上填写的数据内容发送到server是通常的做法, (当然你也可以通过AJAX自己构建HTTP request来发送)。Form表单完全可以被理解成HTML和浏览器为开发者提供了一个简单的发送数据到server的接口。

在提交Form表单的时候,浏览器会自动的将Form内的一些input控件信息收集起来,使用一系列的作为参数向某个URL发送GETPOST请求。

有时候我们会发现某个写checkbox 并没有被收集,有时候却又被收集了。

这里就涉及到一个问题: 哪些会被收集,哪些不会?。会被收集的控件,官方称为 successful,下面是几条标准什么状态下的控件被认为是successful

Controls that are disabled cannot be successful.

If a form contains more than one submit button, only the activated submit button is successful.

All "on" checkboxes may be successful.

For radio buttons that share the same value of the name attribute, only the "on" radio button may be successful.

For menus, the control name is provided by a SELECT element and values are provided by OPTION elements. Only selected options may be successful. When no options are selected, the control is not successful and neither the name nor any values are submitted to the server when the form is submitted.

The current value of a file select is a list of one or more file names. Upon submission of the form, the contents of each file are submitted with the rest of the form data. The file contents are packaged according to the form's content type.

The current value of an object control is determined by the object's implementation.

可以看到,一个checkbox 只有在被set on的时候才能被Form表单收集并发送。

这里有几个问题需要我们认识:

(1)为什么要怎么做? 干脆将所有的input控件都发送出去不行吗?

  a:首先这样的设计是在节约网络流量。(设计的时候流量是很珍贵的)。

  b:其次,对于checkbox 这样的控件,没有被set on意味着没有什么用,这个时候把value发过去意义不大。
  c:而且由于Form框架设计上,只发送控件的, 如果都发出去,server根本不知道该checkbox是否被set on; 我们知道checkout的value的作用并不是很大,反而checked的状态才是check box的生命,但是我们又不好给Form这个框架加一个特例,说对于这个只发送checked的状态。而且,checkbox的value是“没那么有用”,而不是完全没有用,某些开发可能还真需要他。

  d:最后,对于ratio box这样的控件,多个控件可以共用一个name(还非得这样)。server那边其实就只想知道被选择的那个ratio box,所以没有被选择的不应该被发送出去。

(2)checkboxvaluechecked状态

  要理解check box 有时为什么不被Form发出去,除了上面的知识以外还要分清楚,value/checked 相对于checkbox的意义。value是每种input控件都需要有的东西,Form就是收集控件的name和value然后再发送出去的。而checked是 checkbox 和 ratiobox独有的属性。我们不怎么使用check box的value,因为这个value没有多大意义。反而raitobox,text这样的控件的value意义就很大。但是不能因为check box的value意义不大而打破Form的框架阿。所以即使我们不怎么给checkbox 加上value属性,但是Form收集的仍然是它的。 checkbox value 的默认值通常是“on“, 但不是协议规定的,只是大家都这么干。
  作为普通用户,能改变的通常只是checkbox的checked 的状态,如果没有什么特殊的js代码,checkbox的value是不会发生变化的。这也是为什么当checkbox 没有被set on的时候,是不应该发送出去的,因为server无法区分这个checkbox时候被set on,即使它知道它的value。

(3)我们在来思考一下,为什么checkbox value的默认值在工业标准上会是”on“,而不是其它的值。

  照理说不应该是这样的一个值,语义都不对。可以是0或者是其他的嘛。我认为这就是在考虑到checkbox的value基本没有什么用处而做出来的决定。开发者通常不会给与checkbox value,当它被checked on后,发送出去的就是<"myCheckbox, on">. 这样一定程度上利用了这个“没什么用”的属性(value)。这给开发者一个直观的假象——那就是这个“on”所表达的意思是这个checkbox 被checked on 了。
 但是,这样的做法会给那些没有做全面理解的开发者留下陷阱——将on和checkbox 被set on直接挂钩起来。会联想到当我没有check checkbox 的时候,应该会发送一个类似于< "myCheckbox, off">这样的控件信息对来,但其实不会。Form是通过不发送这个信息对来告诉server,这个checkbox没有被checked。这里就出现了一定的不设计不对称的问题。从来不使用checkbox的value, 以及value那个“自作聪明”的缺省值,很容易让人觉得checkbox 的set与否  和 checkbox的value 有直接的关系。

(3)如果我想知道那些没有被checkedcheckbox,怎么办?

  通常而言HTML协议建议server预先知道应该有哪些checkbox,这样就能够知道全部的信息(哪些被checked了,哪些没有)。但在有时候并不好实现。

   有一种比较好的解决方法是,定义一些hidden 的控件与每个checkbox进行配对,hidden控件的 是一定会被发送的。 至于使用什么样的策略,可以有很多方法。最简单的方法就是在server端检测对应该的hidden 控件,有没有相应的checkbox,如果则不用看value也知道是被checked on拉,如果没有则是没有被checked on。

总之,当前的HTML Form表单涉及是逻辑一致的,没有问题可以挑剔; 而为checkboxvalue选择“on”这样的缺省值,有点“自作聪明”之嫌,容易误导开发者。

原文链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值