1. 程式人生 > >【轉載】表單中 Readonly 和 Disabled 的區別

【轉載】表單中 Readonly 和 Disabled 的區別

作用 .net 單元 ont 應該 表單元 als 利用 取數

今天寫代碼,遇到表單提交的問題,某個字段在不同的情況下,要傳遞不同的值進行賦值,試過一些方法都有些問題,後來請教前端同學,使用 disabled 這個屬性終於搞定了問題,查到一篇講解 readonly 和 disabled 的區別的文章挺好的,轉載如下:

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#h-17.12

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

  • 不能接收焦點
  • 使用 tab 鍵時將被跳過
  • 可能不是 successful 的

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

  • 可以接收焦點但不能被修改
  • 可以使用 tab 鍵進行導航
  • 可能是 successful 的

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

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

  1. readonly 是要鎖定這個控件,通過在界面上無法修改他(但是通過 javascript 可以修改他)。
  2. disabled 和 readonly 有相同的地方也是可以鎖定這個控件用戶不能改變他的值,但是 disabled 的更徹底一些,他是要使你完全不能使用他,包括改變他的背景顏色(不信,你去修改一個被 disabled 掉的 input 文本框,你發現你是徒勞),如果是 checkbox 則不能選中他。
  3. 所有控件都有 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> 

參考:

表單中 Readonly 和 Disabled 的區別

【轉載】表單中 Readonly 和 Disabled 的區別