Sự khác biệt giữa khuyết tật = bị vô hiệu hóa và đọc chỉ đọc = phạm lỗi chỉ đọc đối với các trường nhập dạng HTML?


434

Tôi đã đọc một chút về điều này, nhưng dường như tôi không thể tìm thấy bất cứ điều gì vững chắc về cách các trình duyệt khác nhau đối xử với mọi thứ.


liên quan: "làm thế nào để mô phỏng thuộc tính chỉ đọc cho thẻ chọn và vẫn nhận được dữ liệu POST?" stackoverflow.com/questions/368813/ hy
Adrien Be

Câu trả lời:


727

Một readonlyyếu tố chỉ là không thể chỉnh sửa, nhưng được gửi khi gửi theo form. Một disabledyếu tố không thể chỉnh sửa và không được gửi khi gửi. Một điểm khác biệt là readonlycác yếu tố có thể được tập trung (và tập trung khi "lập bảng" thông qua một biểu mẫu) trong khi disabledcác yếu tố không thể.

Đọc thêm về điều này trong bài viết tuyệt vời này hoặc định nghĩa của w3c . Để trích dẫn phần quan trọng:

Sự khác biệt chính

Thuộc tính bị vô hiệu hóa

  • Các giá trị cho các phần tử biểu mẫu bị vô hiệu hóa không được truyền cho phương thức bộ xử lý. W3C gọi đây là một yếu tố thành công. (Điều này hoạt động tương tự như các hộp kiểm mẫu không được kiểm tra.)
  • Một số trình duyệt có thể ghi đè hoặc cung cấp kiểu dáng mặc định cho các thành phần biểu mẫu bị tắt. (Văn bản màu xám hoặc chữ nổi) Internet Explorer 5.5 đặc biệt khó chịu về điều này.
  • Các yếu tố hình thức bị vô hiệu hóa không nhận được trọng tâm.
  • Các yếu tố hình thức bị vô hiệu hóa được bỏ qua trong điều hướng tab.

Thuộc tính chỉ đọc

  • Không phải tất cả các yếu tố hình thức có một thuộc tính chỉ đọc. Hầu hết các đáng chú ý, <SELECT>, <OPTION>, và <BUTTON>các yếu tố không phải chỉ đọc thuộc tính (mặc dù cả hai đều có các thuộc tính vô hiệu hóa)
  • Các trình duyệt không cung cấp phản hồi trực quan mặc định mà phần tử biểu mẫu chỉ được đọc. (Đây có thể là một vấn đề mà xem bên dưới.)
  • Các phần tử biểu mẫu với tập thuộc tính chỉ đọc sẽ được chuyển đến bộ xử lý biểu mẫu.
  • Chỉ đọc các yếu tố hình thức có thể nhận được trọng tâm
  • Chỉ đọc các yếu tố hình thức được bao gồm trong điều hướng theo thẻ.

5
trên phần tử chỉ đọc, bạn không thể sử dụng CTRL + C nhưng bạn có thể sử dụng nhấp chuột phải và chọn Sao chép.
Rumplin

7
@Rumplin bạn có chắc về điều đó? Tôi vừa thử nghiệm và có thể sao chép bằng phím tắt trong Chrome trên OS X.
evanrmurphy

5
"Không phải tất cả các phần tử biểu mẫu đều có thuộc tính chỉ đọc. Đáng chú ý nhất, các phần tử <SELECT>, <OPTION> và <BUTTON> không có thuộc tính chỉ đọc (mặc dù cả hai đều có thuộc tính bị vô hiệu hóa)". Đó là lý do tại sao đôi khi bạn phải sử dụng thuộc tính "bị vô hiệu hóa" với trường nhập liệu ẩn cho các biểu mẫu được chọn.
Donato

Trong phiên bản hiện tại của các yếu tố chỉ đọc Chrome không thể nhận được trọng tâm. Đây là vấn đề nếu bạn mong muốn người dùng có thể cuộn qua các giá trị dài hơn kích thước của đầu vào.
Mike Feelman

5
Vì vậy, đó là sự hiểu biết của tôi disabled ngụ ý readonly nhưng readonlykhông ngụ ý disabled. Nói cách khác, nếu một phần tử có disabledthuộc tính thì không cần phải bao gồm readonlythuộc tính. Chính xác?
chharvey

91

Không có sự kiện nào được kích hoạt khi phần tử đang bị vô hiệu hóa thuộc tính.

Không ai trong số dưới đây sẽ được kích hoạt.

$("[disabled]").click( function(){ console.log("clicked") });//No Impact
$("[disabled]").hover( function(){ console.log("hovered") });//No Impact
$("[disabled]").dblclick( function(){ console.log("double clicked") });//No Impact

Trong khi chỉ đọc sẽ được kích hoạt.

$("[readonly]").click( function(){ console.log("clicked") });//log - clicked
$("[readonly]").hover( function(){ console.log("hovered") });//log - hovered
$("[readonly]").dblclick( function(){ console.log("double clicked") });//log - double clicked

34

Vô hiệu hóa có nghĩa là không có dữ liệu từ thành phần biểu mẫu đó sẽ được gửi khi biểu mẫu được gửi. Chỉ đọc có nghĩa là bất kỳ dữ liệu nào từ bên trong phần tử sẽ được gửi, nhưng người dùng không thể thay đổi nó.

Ví dụ:

<input type="text" name="yourname" value="Bob" readonly="readonly" />

Điều này sẽ gửi giá trị "Bob" cho thành phần "yourname".

<input type="text" name="yourname" value="Bob" disabled="disabled" />

Điều này sẽ không gửi gì cho phần tử "yourname".


6
Cả hai readonlydisabledlà giá trị boolean. Sử dụng disabledthay vì disabled="disabled"(tương tự cho chỉ đọc)
Raptor

5
Cả hai đều đúng về mặt ngữ nghĩa. HTML5 cho phép bạn sử dụng một trong hai.
Michael Irigoyen

3
Lời khuyên không có ngữ cảnh chỉ sử dụng các tên thuộc tính, không có giá trị, không được khuyến khích - bởi vì sau đó mã sẽ không phải là XML / XHTML hợp lệ. Tôi biết rất nhiều nhà phát triển không quan tâm đến những điều đó, nhưng ít nhất họ nên nhận thức được cạm bẫy. Cá nhân tôi cố gắng tuân thủ XHTML - trừ khi đưa ra một lý do thuyết phục mà tôi chưa nhận được - vì vậy tôi sử dụng mẫu dài / trùng lặp.
underscore_d

1
@ToolmakerSteve Bạn có một trích dẫn cụ thể rằng các chuỗi rỗng là XHTML hợp lệ không? Tôi chỉ có thể tìm thấy các trang bình luận nói rằng nó hợp lệ cho HTML5. Mọi người tôi đã thấy nói về XHTML đều nói rằng hình thức của nó cho các thuộc tính boolean phải là attrname="attrname". Dù bằng cách nào, nó dường như không được ghi chép lại nhiều, ít nhất là tôi không thể tìm thấy. Chà, có cái này - w3.org/TR/html4/intro/sgmltut.html#h-3.3.4.2 - nhưng nó chỉ đề cập cụ thể đến SGML và HTML, chứ không phải XHTML .... quá nhiều từ viết tắt: S
underscore_d

1
... nhưng bỏ qua bit cho HTML, trong đó sự hiện diện / vắng mặt là đủ - chúng ta có được điều này, có lẽ áp dụng bằng cách bỏ qua XHTML: Boolean attributes may legally take a single value: the name of the attribute itself (e.g., selected="selected").Vì vậy, chuỗi trống dường như không hợp lệ.
gạch dưới

4

Giống như các câu trả lời khác (bị vô hiệu hóa không được gửi đến máy chủ, chỉ đọc) nhưng một số trình duyệt ngăn việc tô sáng một hình thức bị vô hiệu hóa, trong khi chỉ đọc vẫn có thể được tô sáng (và sao chép).

http://www.w3schools.com/tags/att_input_disables.asp

http://www.w3schools.com/tags/att_input_readonly.asp

Một trường chỉ đọc không thể được sửa đổi. Tuy nhiên, người dùng có thể tab vào nó, đánh dấu nó và sao chép văn bản từ nó.


1

Nếu giá trị của hộp văn bản bị vô hiệu hóa cần được giữ lại khi một biểu mẫu bị xóa (đặt lại), disabled = "disabled"phải được sử dụng, vì hộp văn bản chỉ đọc sẽ không giữ lại giá trị

Ví dụ:

HTML

Hộp văn bản

<input type="text" id="disabledText" name="randombox" value="demo" disabled="disabled" />

Nút reset

<button type="reset" id="clearButton">Clear</button>

Trong ví dụ trên, khi nhấn nút Xóa, giá trị văn bản bị tắt sẽ được giữ lại trong biểu mẫu. Giá trị sẽ không được giữ lại trong trường hợpinput type = "text" readonly="readonly"

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.