表單中Readonly和Disabled的區別詳解_基礎教程

來源:互聯網
上載者:User

Readonly和Disabled是用在表單中的兩個屬性,它們都能夠做到使使用者不能夠更改表單域中的內容。但是它們之間有著微小的差別,總結如下:

Readonly只針對input(text / password)和textarea有效,而disabled對於所有的表單元素都有效,包括select, radio, checkbox, button等。

但是表單元素在使用了disabled後,當我們將表單以POST或GET的方式提交的話,這個元素的值不會被傳遞出去,而readonly會將該值傳遞出去(這種情況出現在我們將某個表單中的textarea元素設定為disabled或readonly,但是submit button卻是可以使用的)。

一般比較常用的情況是:

在某個表單中為使用者預填了某個唯一識別代碼,不允許使用者改動,但是在提交時需要傳遞該值,此時應該將它的屬性設定為readonly。

經常遇到當使用者正式提交了表單後需要等待管理員的資訊驗證,這就不允許使用者再更改表單中的資料,而是只能夠查看,由於disabled的作用元素範圍大,所以此時應該使用disabled,但同時應該注意的是要將submit button也disabled掉,否則只要使用者按了這個按鈕,如果在資料庫操作頁面中沒有做完整性檢測的話,資料庫中的值就會被清除。

如果說在這種情況下用readonly來代替disabled的話,若表單中只有input(text/password)和textarea元素,那還是可以的,如果存在其他發元素,比如select,使用者可以在重新改寫值後按斷行符號鍵進行提交(斷行符號是預設的submit觸發按鍵)。

我們常常在使用者按了提交按鈕後,利用javascript將提交按鈕disabled掉,這樣可以防止網路條件比較差的環境下,使用者反覆點提交按鈕導致資料冗餘地存入資料庫。

disabled和readonly這兩個屬性有一些共同之處,比如都設為true,則form屬性將不能被編輯,往往在寫js代碼的時候容易混合使用這兩個屬性,其實他們之間是有一定區別的。

如果一個輸入項的disabled設為true,則該表單輸入項不能擷取焦點,使用者的所有操作(滑鼠點擊和鍵盤輸入等)對該輸入項都無效,最重要的一點是當提交表單時,這個表單輸入項將不會被提交。

而readonly只是針對文本輸入框這類可以輸入文本的輸入項,如果設為true,使用者只是不能編輯對應的文本,但是仍然可以聚焦焦點,並且在提交表單的時候,該輸入項會作為form的一項提交。

小技巧:diabled可用readonly代替,background-color:#cccccc;加上灰色背景色就可以。

複製代碼 代碼如下:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Untitled Document</title>
</head>
<body>
<form id="form1" name="form1" method="get" action="">
<input name="q1" type="text" id="q1" value="readonly" readonly="true" />
<input name="q2" type="text" disabled="disabled" id="q2" value="disabled" />
<input type="submit" name="Submit" value="Submit" />
</form>
</body>
</html>

input的欄位當為diabled時時無法擷取數值得,所以最近不要用這個,我們可以用readonly帶替代,即可解決這類問題。

複製代碼 代碼如下:

<input name="nowamagic" id="nowamagic" size="12" value="disabled" disabled="disabled">

放在form表單中提交後得不到該值。

將disabled="disabled" 改為 readonly = "readonly" 即可 ,按照W3C的規範:http://www.w3.org/TR/REC-html40/interact/forms.html

設定為disabled的input將會有下面的限制:

不能接收焦點

使用tab鍵時將被跳過

可能不是successful的

設定為readonly的input將會有下面的限制:

可以接收焦點但不能被修改

可以使用tab鍵進行導航

可能是successful的

只有successful的表單元素才是有效資料,也即是可以進行提交。disabled和readonly的文本輸入框只能通過指令碼進行修改value屬性。

這兩個屬性在效果和使用上的區別:

readonly是要鎖定這個控制項,通過在介面上無法修改他(但是通過javascript可以修改他)。

disabled和readonly有相同的地方也是可以鎖定這個控制項使用者不能改變他的值,但是disabled的更徹底一些,他是要使你完全不能使用他,包括改變他的背景顏色(不信,你去修改一個被disabled掉的input文字框,你發現你是徒勞),如果是checkbox則不能選中他。

所有控制項都有disabled 屬性,但是不一定有readonly屬性,如select 下拉框。點擊被readonly掉的按鈕照樣可以觸發事件,但是被disabled掉的按鈕就無法使用了不管上面有沒有事件。

將div設定disabled屬性之後,整個div都灰掉了,但是文字框裡面還是可以輸入內容的。注意:select下拉選擇框是沒有readonly屬性的

大家仔細想一下會有一個問題出現,就是有時候我們寫程式的時候,比如一個購買商品的頁面,我們可以在上面輸入商品的數量,但是價格我們設定成唯讀,最後下面有一個總價格就是 數量 * 唯讀價格,那麼我們很可能就是這樣做的,在背景時候讀取 商品數量的 textbox值,然後讀取 價格的textbox的值,然後兩者的積 作為總金額 uodate到資料庫中去了,如果用戶端的使用者和我們一樣是一個會點程式的小程式員,那麼麻煩就有可能來拉,他可以查看源檔案,查看到被readonly的價格的文字框的id或者是name什麼的,然後在瀏覽器中輸入指令碼去改變價格的值,然後點提交,那麼這個小程式員就可以隨便怎麼給自己打折都不過份啊。

我們將表單的提交方法設定成get提交,我們就可以在url裡面看到提交的內容,發現被設定成disabled的控制項沒有提交到伺服器,readonly的提交資料到伺服器了。

關於用js控制disabled和readonly的問題,下面是一段參考代碼:

複製代碼 代碼如下:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>無標題文檔</title>
</head>
<body> 
<form enctype="multipart/form-data" action="sign.php" method="post" name="moblie_act_form" id="moblie_act_form" >  
<input type="text"  class="input" id="mobile" name="mobile" value="{$mobile}"  readonly="true" disabled="disabled">  
<input type="button" value="修改" onClick="modify_phone()">     
</form>  
</html>  
<script language="javascript">  
function modify_phone(){  
  if(confirm("您確定要修改您的手機號碼嗎?")){  
      document.moblie_act_form.mobile.readOnly = false;  
      document.moblie_act_form.mobile.disabled = false;                  
  }  
  return true;  
}  
</script>
</body>
</html>

以上就是本文的全部內容了,希望大家能夠喜歡。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.