當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”這樣的缺省值,有點“自作聰明”之嫌,容易誤導開發者。

原文鏈接

發佈了42 篇原創文章 · 獲贊 28 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章