<a href="http://blog.51cto.com/attachment/201207/112234417.jpg" target="_blank"></a>
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,使用者可以在重新改寫值後按Enter鍵進行送出(回車是預設 的submit觸發按鍵) ③我們常常在使用者按了送出按鈕後,利用javas
cript将送出按鈕disabled掉,這樣可以防止網絡條件比 較差的環境下,使用者反複點送出按鈕導緻資料備援地存入資料庫。 disabled和readonly這兩個屬性有一些共同之處,比如都設為true,則form屬性将不能被編輯,往往在寫js代碼的時候容易混合使用這 兩個屬性,其實他們之間是有一定差別的。 如果一個輸入項的disabled設為true,則該表單輸入項不能擷取焦點,使用者的所有操作(滑鼠點選和鍵盤輸入等)對該輸入項都無效,最重要的一點是 當送出表單時,這個表單輸入項将不會被送出。 而readonly隻是針對文本輸入框這類可以輸入文本的輸入項,如果設為true,使用者隻是不能編輯對應的文本,但是仍然可以聚焦焦點,并且在送出表單 的時候,該輸入項會作為form的一項送出。 Untitled Document 小技巧: diabled:可用readonly代替,background-color:#cccccc;加上灰色背景色就可以。
另一資料:
一 先看看這兩個屬性在效果和使用上的差別
1 readonly是要鎖定這個控件,通過在界面上無法修改他(但是通過javascript可以修改他)。
2 disabled 和readonly有相同的地方也是可以鎖定這個控件使用者不能改變他的值,但是disabled的更徹底一些,他是要使你完全不能使用他,包括改變他的背 景顔色(不信,你去修改一個被disabled掉的input文本框,你發現你是徒勞),如果是checkbox則不能選中他。
3所有控件都有disabled 屬性,但是不一定有readonly屬性。如select 下拉框
2) checkBox
3) select下拉選擇框(這裡隻能顯示disabled和非disabled的差別,因為select 沒有readonly屬性)
4)button按鈕
說明:點選被readonly掉的按鈕照樣可以觸發事件,但是被disabled掉的按鈕就無法使用了不管上面有沒有事件。
5) div
說明:将div設定disabled屬性之後,整個div都灰掉了,但是文本框裡面還是可以輸入内容的。
注意:select下拉選擇框是沒有readonly屬性的,為什麼呢?(思考)。
二再來看看這兩個屬性在資料送出方面的差別
我們先來寫一個測試代碼:

Code
<form id="form1" runat="server">
<div>
<asp:TextBox ID="txt_Disabled" runat="server" Text="disabled" disabled="disabled" ></asp:TextBox><br />
<asp:TextBox ID="txt_ReadOnly" runat="server" Text="ReadOnly" ReadOnly="true"></asp:TextBox><br />
<asp:TextBox ID="txt_Normal" runat="server" Text="normal" ></asp:TextBox><br />
<asp:Button ID="btn_Test" runat="server" Text="送出資料" />
<input type="button" name="btn_ChangeValue" value="改變readonly的值" onclick="document.all('txt_ReadOnly').value = 'myzzb'" />
</div>
</form>
在這裡,我寫了一個asp表單頁面,使用了get 方式送出
從送出的url可以看出被disabled的控件的值沒有送出到伺服器,這個時候在伺服器端是擷取不到這個控件的值的,
相反,被設定成readonly的文本框的值是送出到伺服器的。
這裡出現了一個奇怪的情況,readonly的文本框是被設定成readonly的了,但是我通過下面的按鈕 "改變readonly值"
document.all('txt_ReadOnly').value = 'myzzb' 這個時候 被readonly的值顯示的是myzzb了,現在我點送出資料,在伺服器端擷取到了值是myzzb了,但是奇怪的是,回傳到頁面之後,頁面的 readonly控件裡面還是顯示的是改變myzzb之前的 Readonly的值了,這究竟是什麼原因呢?
這是微軟在.net2.0裡面 做的小改動。如果Textbox的ReadOnly屬性設定成"True",ViewState将不會被回發到伺服器,雖然用戶端已經更改了。但是我們依 然還是可以用TextBox.Attributes.Add("readonly","readonly") 來實作。
在伺服器端去設定一 個控件的readonly 和在用戶端設定一個文本框的readonly屬性是有差別的。在伺服器端我們用 TextBox.Attributes.Add("readonly","readonly") 頁面在回傳的時候,即使文本框是readonly 的,也是會改變他的值的,在用戶端在2.0裡面就會不會顯示用戶端的修改。
ps:在.net 1.1 裡面 不會出現上面值還儲存之前的值的情況。
大 家仔細想一下會有一個問題出現,就是有時候我們寫程式的時候,比如一個購買商品的頁面,我們可以在上面輸入商品的數量,但是價格我們設定成隻讀的,最後下 面有一個總價格就是 數量 * 隻讀的價格,那麼我們很可能就是這樣做的,在背景的時候讀取 商品數量的 textbox值,然後讀取 價格的textbox的值,然後兩者的積 作為總金額 uodate到資料庫中去了,如果用戶端的使用者和我們一樣是一個會點程式的小程式員,那麼麻煩就有可能來拉,他可以檢視源檔案,檢視到被readonly 的價格的文本框的id或者是name什麼的,然後在浏覽器中輸入腳本去改變價格的值,然後點送出,那麼這個小程式員就可以随便怎麼給自己打折都不過份啊。
就想下面的列子顯示的,在浏覽器中輸入腳本改變單價,然後在點傳回就可以看到單價已經被改拉。
那麼,伺服器端設定設定readonly ,disabled和在用戶端設定readonly,disabled的有什麼不同嗎?
我們現在通過在伺服器端去設定這兩個控件,代碼如下:
我們将表單的送出方法設定成get送出,我們就可以在url裡面看到送出的内容,發現被設定成disabled的控件沒有送出到伺服器,readonly的送出資料到伺服器了,如下圖所示:
這說明和用戶端的效果是一樣的。
通過以上的測試說明以下幾點:
1,用戶端設定readonly,disabled和伺服器端設定readonly效果一樣。
2,readonly的資料是可以送出到伺服器的,disabled的資料是不可以送出到伺服器的。
3,在.net1.1裡面設定成readonly的textbox 在用戶端改變之後。伺服器是會回傳用js改變的值,在.net 2.0裡面是不可以回傳到用戶端,除非你在伺服器端設定他的readonly屬性(這個時候就和1.1效果一樣)。
4,設定成readonly的TextBox在用戶端修改資料會送出到伺服器,那麼作為程式員的你,千萬不要update的時候也把這個值修改,如果你是購物網站這麼做的話,那麼你完蛋了。
5,在伺服器端用txtBox.enabled = false;在用戶端解析的時候會給TextBox加上diabaled也就是說,資料不能送出到伺服器的。
各種控件disabled和readonly之後的顯示和操作差別:
1) input TextBox

protected void Page_Load(object sender, EventArgs e)
{
//在伺服器端給控件加上readonly 和 disabled屬性
txt_ReadOnly.Attributes.Add("readonly", "readonly");
txt_Distabled.Attributes.Add("disabled", "disabled");
}
本文轉自許琴 51CTO部落格,原文連結:http://blog.51cto.com/xuqin/940697,如需轉載請自行聯系原作者