Làm cách nào để thêm một thuộc tính chỉ đọc của người dùng vào một <input>?


301

Làm thế nào tôi có thể thêm readonlyvào một cụ thể <input>? .attr('readonly')không hoạt động.


2
.attr ('readonly', true) hoạt động, không khác
Qiao

3
.attr ('readonly', 'readonly') cũng hoạt động
Qiao

3
Nó phụ thuộc vào việc bạn sử dụng DOCTYPE nào. Đối với HTML 4.01 DTD, câu trả lời từ CMS đang hoạt động và HTML 4.01 hợp lệ. Nếu bạn sử dụng XHTML DTD thì câu trả lời từ ceejayoz đang hoạt động và XHTML hợp lệ.
bjoernwibben

2
Nó không phụ thuộc vào doctype, DOM giống nhau cho dù nó được đọc qua HTML hay XML và trong mọi trường hợp XHTML hầu như vẫn luôn thực sự được phục vụ dưới dạng HTML chứ không phải XML, để tương thích với IE.
bobince

Câu trả lời:


545

jQuery <1.9

$('#inputId').attr('readonly', true);

jQuery 1.9+

$('#inputId').prop('readonly', true);

Tìm hiểu thêm về sự khác biệt giữa prop và attr


1
Bạn có chắc không? Tôi cũng nghĩ như vậy nhưng không thể tìm thấy bất cứ điều gì về thông số kỹ thuật. <input name = "foo" readonly = "readonly" value = "bar" /> xác thực hoàn toàn tại validator.w3.org với xhtml 1.0 nghiêm ngặt.
Jonas Stensved

17
Bài đăng này nên được thay đổi thành .prop () thay vì .attr (), như đã nêu trong API jQuery: jquery.com/upTHER-guide/1.9/#attr-versus-prop-
frshca 5/2/13

Thuộc tính readonly là "thuộc tính boolean" - whatwg.org/specs/web-apps/civerse-work/#boolean-attribution Mặc dù tên hơi sai lệch, các giá trị không nên là "đúng" hoặc "sai". Mặc dù tôi nghĩ rằng mã ở trên sẽ thực sự hoạt động (được thử nghiệm trong Chrome với jQuery 1.8.1), nhưng nó có thể dẫn đến sự nhầm lẫn sau này cho người thiếu kinh nghiệm. Ngoài ra, theo các tài liệu jQuery, giá trị phải là số hoặc chuỗi, không phải là boolean. api.jquery.com/attr/#attr2
Luke

151

Sử dụng $ .prop ()

$("#descrip").prop("readonly",true);

$("#descrip").prop("readonly",false);

8
Sau khi đọc API jQuery cho .prop, đây sẽ là câu trả lời được chấp nhận. Tôi đã luôn luôn thực hiện .attr ('readonly', 'readonly') và .removeAttr ('readonly') trong quá khứ, nhưng điều này có vẻ đúng hơn và cũng làm cho mã sạch hơn.
evan w

4
Mọi người nên sử dụng câu trả lời này, như đã nêu ở đây: jquery.com/upTHER-guide/1.9/#attr-versus-prop-
frshca

4
Lưu ý khi sử dụng $.prop(): Prop sẽ đặt thuộc tính chỉ đọc thành chuỗi trống / trống, vì vậy nếu bạn có bất kỳ CSS nào sử dụng bộ chọn thuộc tính cho [readonly="readonly"], thì bạn sẽ phải thay đổi thành [readonly](hoặc bao gồm cả hai).
Lu-ca

28

Readonly là một thuộc tính như được định nghĩa trong html, vì vậy hãy coi nó như một thuộc tính.

Bạn cần phải có một cái gì đó như readonly = "readonly" trong đối tượng bạn đang làm việc nếu bạn muốn nó không thể chỉnh sửa được. Và nếu bạn muốn nó có thể chỉnh sửa lại, bạn sẽ không có cái gì đó như readonly = '' (điều này không chuẩn nếu tôi hiểu đúng). Bạn thực sự cần phải loại bỏ toàn bộ thuộc tính.

Như vậy, trong khi sử dụng jquery thêm nó và loại bỏ nó là những gì có ý nghĩa.

Đặt một cái gì đó chỉ đọc:

$("#someId").attr('readonly', 'readonly');

Xóa chỉ đọc:

$("#someId").removeAttr('readonly');

Đây là sự thay thế duy nhất thực sự hiệu quả với tôi. Hy vọng nó giúp!


20

.attr('readonly', 'readonly')nên làm thủ thuật. Của bạn .attr('readonly')chỉ trả về giá trị, nó không đặt một.


16
Attr () của jQuery hoạt động trên các thuộc tính JavaScript, không phải thuộc tính HTML, mặc dù các tên ngụ ý khác. attr ('readonly') thực sự hoạt động trên thuộc tính HTML Cấp 1 DOM readOnly, là một boolean, vì vậy 'true' là phù hợp hơn. Tuy nhiên, chuỗi 'chỉ đọc' cũng là một giá trị trung thực khi được tự động chuyển đổi thành boolean, do đó, chuỗi trên vẫn hoạt động.
bobince

Tôi không nghĩ bạn muốn đặt thuộc tính thành 'true'. Các .attrgiá trị chỉ nên là một chuỗi hoặc số, không phải là một boolean, theo các tài liệu jQuery: api.jquery.com/attr/#attr2 Ngoài ra, HTML "thuộc tính boolean" chỉ nên chuỗi rỗng hoặc giá trị của thuộc tính. Tôi nghĩ rằng giải pháp là sử dụng .prop()để tránh nhầm lẫn.
Luke

16

Tôi nghĩ rằng "bị vô hiệu hóa" loại trừ đầu vào được gửi trên POST


4
Có nó làm. Tôi tìm thấy chủ đề này trong khi tìm kiếm một thay thế cho "vô hiệu hóa" chỉ vì lý do này.
Jonas Stensved

nhưng bạn có thể kích hoạt nó ngay trước khi gửi nó và vô hiệu hóa nó sau $ (document) .on ('submit', "#myform", function (e) {// cho phép các đầu vào trả về true; // sau đó vô hiệu hóa lại nếu bạn yêu cầu} nó hoạt động tôi đã thử nghiệm nó
Geomorillo

Có phải chỉ đọc các giá trị đầu vào trong html được phép gửi trên POST mà không sử dụng ẩn?
Ajay Takur

12

Bạn có thể vô hiệu hóa chỉ đọc bằng cách sử dụng .removeAttr;

$('#descrip').removeAttr('readonly');

5

Để cho phép chỉ đọc:

$("#descrip").attr("readonly","true");

Để vô hiệu hóa chỉ đọc

$("#descrip").attr("readonly","");

Từ api.jquery.com/attr "Kể từ jQuery 1.6, phương thức .attr () trả về không xác định cho các thuộc tính chưa được đặt. Để truy xuất và thay đổi các thuộc tính DOM như trạng thái của các phần tử biểu mẫu đã chọn, đã chọn hoặc bị vô hiệu hóa, sử dụng phương thức .prop (). "
David Clarke

1
Không nên đặt thuộc tính thành một chuỗi "true". Điều này có thể làm việc, nhưng không đúng về mặt kỹ thuật. (Xem những bình luận trước đây của tôi ở trên.)
Luke

Đừng sử dụng đề xuất này, những cái tốt hơn nhiều có sẵn ở đây. "true" không chính xác cho cài đặt và xóa cũng không chính xác.
MiFiHiBye

4

Sử dụng thuộc tính setAttribution. Lưu ý trong ví dụ rằng nếu chọn 1 áp dụng thuộc tính chỉ đọc trên hộp văn bản, nếu không hãy xóa thuộc tính chỉ đọc.

http://jsfiddle.net/baqxz7ym/2/

document.getElementById("box1").onchange = function(){
  if(document.getElementById("box1").value == 1) {
    document.getElementById("codigo").setAttribute("readonly", true);
  } else {
    document.getElementById("codigo").removeAttribute("readonly");
  }
};

<input type="text" name="codigo" id="codigo"/>

<select id="box1">
<option value="0" >0</option>
<option value="1" >1</option>
<option value="2" >2</option>
</select>

-4

Đối với phiên bản jQuery <1.9:

$('#inputId').attr('disabled', true);

Đối với phiên bản jQuery> = 1.9:

$('#inputId').prop('disabled', true);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.