Các hộp kiểm HTML có thể được đặt thành chỉ đọc không?


818

Tôi nghĩ rằng họ có thể, nhưng vì tôi không đặt tiền của mình vào nơi mà miệng tôi (có thể nói) thiết lập thuộc tính chỉ đọc dường như không thực sự làm gì cả.

Tôi không muốn sử dụng Vô hiệu hóa, vì tôi muốn các hộp kiểm đã chọn được gửi cùng với phần còn lại của biểu mẫu, tôi chỉ không muốn khách hàng có thể thay đổi chúng trong một số trường hợp nhất định.


39
Một khách hàng (độc hại) luôn có thể thay đổi giá trị của hộp kiểm (hoặc gửi các yêu cầu tùy ý). Luôn đảm bảo rằng bạn thực hiện xác nhận hợp lệ phía máy chủ!
knittl

4
@knittl Nhưng một vistor bình thường không có máy khách (độc hại). Và một Vistor bình thường không muốn thay đổi thông tin (Đó là ý nghĩa của readonly)
Christian Gollhardt

3
@knittl Bạn dường như gạt bỏ toàn bộ ý nghĩa của readonly! Tại sao sau đó thuộc tính này sẽ tồn tại!
Izhar Aazmi

10
@IzharAazmi: readonlychỉ là một thuộc tính phía máy khách để giúp trình duyệt hiển thị đúng trang web và sau đó xây dựng yêu cầu chính xác từ nó. Máy chủ không thể và không nên biết về readonlythuộc tính của trang được hiển thị. Nó phải cho rằng yêu cầu đến từ bất cứ đâu (và có thể với mục đích xấu); không bao giờ dựa vào đầu vào do người dùng cung cấp. Tuy nhiên, tại sao gửi giá trị của hộp kiểm mà bạn không thể chỉnh sửa trong yêu cầu (nếu bạn đặt giá trị trước khi kết xuất, bạn đã biết giá trị khi yêu cầu được gửi, do đó không cần truyền nó trong yêu cầu)
knittl

4
@knittl Tôi đồng ý! Nhưng bạn thấy readonlythuộc tính tồn tại ở đó vì một số lý do. Nó chắc chắn không có gì để làm với việc thực hiện phía máy chủ. Nhưng nó ở đó để nói với người dùng "Này! Giá trị này đang được giả định ở đây, và / nhưng bạn không thể thay đổi điều này."
Izhar Aazmi

Câu trả lời:


538

bạn có thể sử dụng cái này:

<input type="checkbox" onclick="return false;"/>

Điều này hoạt động vì trả về false từ sự kiện nhấp chuột sẽ dừng chuỗi thực thi tiếp tục.


29
Trả về false trong javascript ngăn không cho tiếp tục chuỗi thực thi cho trình xử lý nhấp chuột hoặc khóa. Không liên quan gì đến trạng thái của hộp kiểm
Jessica Brown

9
PS ... nếu bạn muốn hộp kiểm ở trạng thái đã chọn, bạn cần thêm checked="checked", không gây rối với javascript. Các javascript chỉ ở đó để buộc các nhấp chuột được bỏ qua trên đối tượng đầu vào, không đặt trạng thái của hộp kiểm.
Jessica Brown

8
Không có dấu hiệu trực quan về tình trạng r / o trong trường hợp này.
Jesse Glick

11
Ngăn chặn sử dụng TAB để điều hướng đến đầu vào tiếp theo mặc dù.
user327961

7
Thất bại hoàn toàn nếu javascript bị vô hiệu hóa!
Doin

420

READONLYkhông hoạt động trên các hộp kiểm vì nó ngăn bạn chỉnh sửa giá trị của một trường , nhưng với hộp kiểm bạn thực sự đang chỉnh sửa trạng thái của trường (tắt | | tắt)

Từ faqs.org :

Điều quan trọng là phải hiểu rằng SYN SÀNG chỉ ngăn người dùng thay đổi giá trị của trường chứ không phải tương tác với trường. Ví dụ, trong các hộp kiểm, bạn có thể bật hoặc tắt chúng (do đó đặt trạng thái KIỂM TRA) nhưng bạn không thay đổi giá trị của trường.

Nếu bạn không muốn sử dụng disablednhưng vẫn muốn gửi giá trị, làm thế nào về việc gửi giá trị dưới dạng trường ẩn và chỉ in nội dung của nó cho người dùng khi họ không đáp ứng tiêu chí chỉnh sửa? ví dụ

// user allowed change
if($user_allowed_edit)
{
    echo '<input type="checkbox" name="my_check"> Check value';
}
else
{
    // Not allowed change - submit value..
    echo '<input type="hidden" name="my_check" value="1" />';
    // .. and show user the value being submitted
    echo '<input type="checkbox" disabled readonly> Check value';
}

135
Hoạt động, nhưng đó là loại .. cũng bẩn, chỉ đọc trên các hộp kiểm chỉ nên làm những gì trực giác nói.
levhita

8
Trực giác đánh lừa chúng tôi, như ConroyP giải thích.
ANeves

120
Trực giác không đánh lừa Mỹ, nó đánh lừa những người thực hiện hộp kiểm theo cách này.
Califf

@ConroyP -> "nó ngăn bạn chỉnh sửa giá trị của một trường, nhưng với hộp kiểm bạn thực sự đang chỉnh sửa trạng thái của trường (bật | | tắt)". Đó là một lời biện minh thực sự yếu cho một quyết định đau đầu. 'Trạng thái' và 'giá trị', đối với hầu hết chúng ta, giống như 'toMAYto' và 'toMAHto', như bạn có thể thấy bởi các upvote được thực hiện bởi những người không đồng ý.
McAuley

343

Đây là hộp kiểm bạn không thể thay đổi:

<input type="checkbox" disabled="disabled" checked="checked">

Chỉ cần thêm disabled="disabled"như một thuộc tính.


Chỉnh sửa để giải quyết các ý kiến:

Nếu bạn muốn dữ liệu được đăng lại, hơn một giải pháp đơn giản là áp dụng cùng tên cho một đầu vào ẩn:

<input name="myvalue" type="checkbox" disabled="disabled" checked="checked"/>
<input name="myvalue" type="hidden" value="true"/>

Theo cách này, khi hộp kiểm được đặt thành 'bị vô hiệu hóa', nó chỉ phục vụ mục đích thể hiện trực quan dữ liệu, thay vì thực sự được 'liên kết' với dữ liệu. Trong bài đăng trở lại, giá trị của đầu vào ẩn đang được gửi khi hộp kiểm bị vô hiệu hóa.


331
Lưu ý rằng hộp kiểm "bị vô hiệu hóa" không gửi giá trị qua dữ liệu POST.
biphobe

66
@powtac Bạn không giải quyết được rằng anh ấy muốn dữ liệu được đăng, ví dụ của bạn không làm điều đó.
David Mårtensson

70
Không có cách nào câu trả lời này nên có 105 upvote. Nó đi ngược lại mọi thứ mà OP tuyên bố.
JM4

15
@nathanhayfield: theo logic đó, tôi sẽ có thể đăng câu trả lời hữu ích về bất kỳ chủ đề nào và nhận được upvotes. :(
Michael Bray

24
@MichaelBray Tôi đoán điều này nhận được rất nhiều sự ủng hộ bởi vì nhiều người muốn biết cách làm cho các hộp kiểm chỉ đọc để họ làm điều này: 1) Google "Hộp kiểm chỉ đọc". 2) Xem tiêu đề của câu hỏi này phù hợp với những gì họ muốn làm và nhấp vào nó. 3) Cuộn xuống cho đến khi họ tìm thấy câu trả lời này. 4) Hạnh phúc và thăng hoa.
Mark Byers

63
<input type="checkbox" onclick="this.checked=!this.checked;">

Nhưng bạn tuyệt đối PHẢI xác thực dữ liệu trên máy chủ để đảm bảo dữ liệu không bị thay đổi.


4
Tôi thấy đây là giải pháp tốt nhất; ngoài ra, tôi có thể gọi một đoạn mã khác (giả sử, một số jquery-Stuff) để hiển thị một dấu hiệu nhỏ có nội dung "bạn không thể thay đổi điều này cho đến khi bạn lần đầu tiên làm x". Vì vậy, một cái gì đó như: "... onclick = 'this.checked =! This.checked; javascript: theCheckboxWasClicky ();' ..."
Bane

Điều này không làm mờ các ô như với câu trả lời từ powtac để nó nhận được phiếu bầu của tôi
EHarpham

Đây là một chút hackish, nhưng nó là một hack nhỏ khéo léo, hoàn hảo, gần như thanh lịch.
russell

Giải pháp tốt nhất. Nên được đánh dấu là câu trả lời đúng.
Scottie

3
Như đã nêu ở trên, điều này không hoạt động khi nhấp đúp vào IE. Tôi đã sử dụng: onchange = "this.checked = true;"
Ritikesh

57

một "giải pháp đơn giản" khác:

<!-- field that holds the data -->
<input type="hidden" name="my_name" value="1" /> 
<!-- visual dummy for the user -->
<input type="checkbox" name="my_name_visual_dummy" value="1" checked="checked" disabled="disabled" />

bị vô hiệu hóa = "bị vô hiệu hóa" / bị vô hiệu hóa = đúng


1
Điều này giải quyết tất cả các vấn đề: tạo hộp kiểm chỉ đọc, gửi dữ liệu POST và cung cấp chỉ dẫn trực quan về tính năng chỉ đọc (ngược lại với tất cả các giải pháp javascript)
Dalibor Frivaldsky 11/214

2
bạn cũng có thể thả ra namevaluecác thuộc tính từ hộp giả của bạn, cũng ="checked"như ="diabled"các giá trị attrib có thể bị loại bỏ.w3.org/TR/html-markup/input.checkbox.html
Sampo Sarrala - codidact.org

Quan trọng nhất là giải pháp này là HTML cũ đơn giản và không dựa vào Javascript.
GlennG

45

Điều này trình bày một chút về một vấn đề khả năng sử dụng.

Nếu bạn muốn hiển thị một hộp kiểm, nhưng không để nó được tương tác, tại sao lại là một hộp kiểm?

Tuy nhiên, cách tiếp cận của tôi sẽ là sử dụng bị vô hiệu hóa (Người dùng hy vọng hộp kiểm bị vô hiệu hóa không thể chỉnh sửa được, thay vì sử dụng JS để làm cho một cái được kích hoạt không hoạt động) và thêm một trình xử lý biểu mẫu bằng cách sử dụng javascript cho phép các hộp kiểm ngay trước biểu mẫu nộp. Bằng cách này, bạn sẽ nhận được giá trị của bạn được đăng.

tức là một cái gì đó như thế này:

var form = document.getElementById('yourform');
form.onSubmit = function () 
{ 
    var formElems = document.getElementsByTagName('INPUT');
    for (var i = 0; i , formElems.length; i++)
    {  
       if (formElems[i].type == 'checkbox')
       { 
          formElems[i].disabled = false;
       }
    }
}

22
Một tùy chọn khác là hiển thị hộp kiểm bị vô hiệu hóa (hoặc một hình ảnh hoặc bất cứ thứ gì để biểu thị đã chọn / không được kiểm tra) và có một đầu vào ẩn đó là những gì được xử lý bởi máy chủ.
Juan Mendes

5
Đây không phải là vấn đề về khả năng sử dụng khi bạn có một hình thức trong đó một số quyết định của bạn ảnh hưởng đến một số đầu vào khác (còn gọi là: đặt giá trị không thể chạm vào nếu bạn không hoàn tác hành động đầu tiên của mình.). Tôi ghét khi mọi người cố gắng thay đổi suy nghĩ của mọi người thay vì trả lời (đây không phải là về bạn @FlySwat, bạn đã trả lời).
Pherrymason

7
Mục đích là sử dụng hộp kiểm làm trường hiển thị "giá trị này là đúng", dễ quét xuống bảng hơn là một bó "đúng" / "sai" -s. Chắc chắn, bạn có thể sử dụng một biểu tượng, nhưng trong một hình thức, các hộp kiểm dường như ở đó, đã chín muồi để sử dụng.
Olie

1
Tôi thường sử dụng giải pháp này nhưng .. đôi khi người dùng, đặc biệt là kết nối chậm, thấy các nút nhập được bật sau khi gửi biểu mẫu và quyết định chơi với nó.
systempuntoout

2
Giả sử bạn có một loạt "tính năng" có thể được bao gồm hoặc không, vì vậy bạn có một mẫu hiển thị hộp kiểm trên tính năng. Nhưng đôi khi, một tính năng là điều kiện tiên quyết cho một thứ khác ... vì vậy nó PHẢI được đưa vào, nhưng bạn không muốn thay đổi mẫu của mình. Đó chính xác là những gì một hộp kiểm tra bị vô hiệu hóa / kiểm tra là dành cho. Chúng đã tồn tại mãi mãi, vì vậy tôi hy vọng câu hỏi "tại sao ngay cả một hộp kiểm" cũng có tính khoa trương.
Triynko

38
<input type="checkbox" readonly="readonly" name="..." />

với niềm đam mê:

$(':checkbox[readonly]').click(function(){
            return false;
        });

nó vẫn có thể là một ý tưởng tốt để đưa ra một số gợi ý trực quan (css, văn bản, ...), rằng điều khiển sẽ không chấp nhận đầu vào.


Điều này không hoạt động trong eg6 đối với tôi, bộ lọc thuộc tính chỉ đọc không hoạt động chính xác. Tôi lấy nó ra khỏi bộ lọc và đặt kiểm tra thuộc tính trong phần thân của hàm và nó hoạt động tốt trong eg6.
gt124

3
Tôi đã sử dụng "data-readonly = true" thay vì thuộc tính tiêu chuẩn và nó hoạt động tốt trong tất cả các trình duyệt. Tôi thích giải pháp này hơn các giải pháp khác trên +1
peipst9lker

1
Bộ chọn phải $(':checkbox[readonly]')chọn tất cả các hộp kiểm ứng viên vì readonlygiá trị thuộc tính là tùy chọn.
Izhar Aazmi

21

Tôi đã sử dụng điều này để đạt được kết quả:

<input type=checkbox onclick="return false;" onkeydown="return false;" />

Trong trường hợp của tôi, nó hoạt động mà không có dấu chấm phẩy, nếu không thì không.
Mwiza

12

Tôi tình cờ nhận thấy giải pháp được đưa ra dưới đây. Trong tìm thấy nó nghiên cứu của tôi cho cùng một vấn đề. Tôi không phải là người đã đăng nó nhưng nó không phải do tôi tạo ra. Nó sử dụng jQuery:

$(document).ready(function() {
    $(":checkbox").bind("click", false);
});

Điều này sẽ làm cho các hộp kiểm chỉ đọc sẽ hữu ích cho việc hiển thị dữ liệu chỉ đọc cho khách hàng.


1
Câu hỏi yêu cầu một hộp kiểm chỉ đọc và không phải là một người khuyết tật. Vì vậy, đây là câu trả lời đúng nhất.
NileshChauhan

9
onclick="javascript: return false;"

Hmmm ... điều này đang làm việc cho trường hợp sai / không được kiểm tra, nhưng onclick="javascript: return true;"chỉ làm cho nó hoạt động như một hộp kiểm bình thường. Gợi ý? Cảm ơn!
Olie

@Olie, thêm checkedthuộc tính và giữ nguyên falsevị trí.
Qwertiy

7

Câu trả lời muộn màng, nhưng hầu hết các câu trả lời dường như quá phức tạp nó.

Theo tôi hiểu, OP về cơ bản là muốn:

  1. Hộp kiểm chỉ đọc để hiển thị trạng thái.
  2. Giá trị trả về với hình thức.

Cần lưu ý rằng:

  1. OP không muốn sử dụng disabledthuộc tính này, vì họ 'muốn các hộp kiểm đã chọn được gửi cùng với phần còn lại của biểu mẫu'.
  2. Các hộp kiểm không được chọn không được gửi cùng với biểu mẫu, vì trích dẫn từ OP trong 1. ở trên cho thấy họ đã biết. Về cơ bản, giá trị của hộp kiểm chỉ tồn tại nếu được chọn.
  3. Một hộp kiểm bị vô hiệu hóa rõ ràng rằng nó không thể thay đổi, theo thiết kế, do đó người dùng không có khả năng cố gắng thay đổi nó.
  4. Giá trị của hộp kiểm tra không giới hạn trong việc chỉ ra trạng thái của nó, chẳng hạn như yeshoặc false, nhưng có thể là bất kỳ văn bản nào.

Do đó, vì readonlythuộc tính không hoạt động, giải pháp tốt nhất, không yêu cầu javascript, là:

  1. Một hộp kiểm bị vô hiệu hóa, không có tên hoặc giá trị.
  2. Nếu hộp kiểm sẽ được hiển thị dưới dạng đã chọn, một trường ẩn có tên và giá trị được lưu trữ trên máy chủ.

Vì vậy, đối với một hộp kiểm tra:

<input type="checkbox" checked="checked" disabled="disabled" />
<input type="hidden" name="fieldname" value="fieldvalue" />

Đối với một hộp kiểm không được chọn:

<input type="checkbox" disabled="disabled" />

Vấn đề chính với các đầu vào bị vô hiệu hóa, đặc biệt là các hộp kiểm, là độ tương phản kém của chúng có thể là vấn đề đối với một số người có khuyết tật thị giác nhất định. Có thể tốt hơn để chỉ ra một giá trị bằng các từ đơn giản, chẳng hạn như Status: nonehoặc Status: implemented, nhưng bao gồm cả đầu vào ẩn ở trên khi sử dụng sau, chẳng hạn như:

<p>Status: Implemented<input type="hidden" name="status" value="implemented" /></p>


7

Hầu hết các câu trả lời hiện tại có một hoặc nhiều vấn đề sau:

  1. Chỉ kiểm tra chuột không bàn phím.
  2. Chỉ kiểm tra tải trang.
  3. Kết nối sự thay đổi phổ biến hoặc gửi các sự kiện sẽ không luôn diễn ra nếu có điều gì khác xảy ra.
  4. Yêu cầu đầu vào ẩn hoặc các thành phần / thuộc tính đặc biệt khác mà bạn phải hoàn tác để bật lại hộp kiểm bằng javascript.

Sau đây là đơn giản và không có vấn đề nào.

$('input[type="checkbox"]').on('click keyup keypress keydown', function (event) {
    if($(this).is('[readonly]')) { return false; }
});

Nếu hộp kiểm chỉ đọc, nó sẽ không thay đổi. Nếu không, nó sẽ. Nó sử dụng jquery, nhưng có lẽ bạn đã sử dụng nó ...

Nó hoạt động.


6
<input name="isActive" id="isActive" type="checkbox" value="1" checked="checked" onclick="return false"/>

6

Nếu bạn muốn chúng được gửi đến máy chủ với biểu mẫu nhưng không tương tác với người dùng, bạn có thể sử dụng pointer-events: nonetrong css ( hoạt động trong tất cả các trình duyệt hiện đại ngoại trừ IE10- và Opera 12- ) và đặt chỉ mục tab  -1để ngăn thay đổi qua bàn phím. Cũng lưu ý rằng bạn không thể sử dụng labelthẻ vì nhấp vào nó sẽ thay đổi trạng thái.

input[type="checkbox"][readonly] {
  pointer-events: none !important;
}

td {
  min-width: 5em;
  text-align: center;
}

td:last-child {
  text-align: left;
}
<table>
  <tr>
    <th>usual
    <th>readonly
    <th>disabled
  </tr><tr>
    <td><input type=checkbox />
    <td><input type=checkbox readonly tabindex=-1 />
    <td><input type=checkbox disabled />
    <td>works
  </tr><tr>
    <td><input type=checkbox checked />
    <td><input type=checkbox readonly checked tabindex=-1 />
    <td><input type=checkbox disabled checked />
    <td>also works
  </tr><tr>
    <td><label><input type=checkbox checked /></label>
    <td><label><input type=checkbox readonly checked tabindex=-1 /></label>
    <td><label><input type=checkbox disabled checked /></label>
    <td>broken - don't use label tag
  </tr>
</table>


Hãy để tôi nhắc lại câu cuối cùng của bạn (tôi đã bỏ lỡ nó và lãng phí thời gian quý báu): kỹ thuật của bạn là vô dụng nếu có <nhãn> (trong Firefox nó hoạt động hoàn hảo, thực sự. Vấn đề là ở Chrome).
Niccolo M.

@NiccoloM., Nhưng nếu bạn biết rằng nó chỉ đọc, tại sao phải bọc nó thành nhãn? Ngoài ra, bạn có thể đặt nhãn sau nó và sử dụng forthuộc tính. Trong trường hợp đó bạn có thể sử dụng input[type="checkbox"][readonly] + label { pointer-events: none !important; }.
Qwertiy

@KevinBui, bạn đã gỡ bỏ labelvà thêm tabindex? Làm thế nào để bạn tập trung vào yếu tố không thể tập trung để nhấn một khoảng trắng trên nó?
Qwertiy

5

<input type="checkbox" onclick="return false" /> sẽ làm việc cho bạn, tôi đang sử dụng này


5

Một số câu trả lời ở đây có vẻ hơi vòng vo, nhưng đây là một hack nhỏ.

<form id="aform" name="aform" method="POST">
    <input name="chkBox_1" type="checkbox" checked value="1" disabled="disabled" />
    <input id="submitBttn" type="button" value="Submit" onClick='return submitPage();'>
</form>

sau đó trong jquery bạn có thể chọn một trong hai tùy chọn:

$(document).ready(function(){
    //first option, you don't need the disabled attribute, this will prevent
    //the user from changing the checkbox values
    $("input[name^='chkBox_1']").click(function(e){
        e.preventDefault();
    });

    //second option, keep the disabled attribute, and disable it upon submit
    $("#submitBttn").click(function(){
        $("input[name^='chkBox_1']").attr("disabled",false);
        $("#aform").submit();
    });

});

Hay nói, là một tài tài của, qua, qua, qua một tài khác, qua giữ, qua một tài khác

bản demo: http://jsfiddle.net/5WFYt/


3
Và đây không phải là "bùng binh" ??
KoZm0kNoT

nah nó khá trực tiếp .. nó chỉ không súc tích.
sksallaj

4

Dựa trên các câu trả lời trên, nếu sử dụng jQuery, đây có thể là một giải pháp tốt cho tất cả các đầu vào:

<script>
    $(function () {
        $('.readonly input').attr('readonly', 'readonly');
        $('.readonly textarea').attr('readonly', 'readonly');
        $('.readonly input:checkbox').click(function(){return false;});
        $('.readonly input:checkbox').keydown(function () { return false; });
    });
</script>

Tôi đang sử dụng điều này với Asp.Net MVC để đặt một số thành phần biểu mẫu chỉ đọc. Các công việc trên cho văn bản và hộp kiểm bằng cách đặt bất kỳ vùng chứa cha nào là .readonly, chẳng hạn như các tình huống sau:

<div class="editor-field readonly">
    <input id="Date" name="Date" type="datetime" value="11/29/2012 4:01:06 PM" />
</div>
<fieldset class="flags-editor readonly">
     <input checked="checked" class="flags-editor" id="Flag1" name="Flags" type="checkbox" value="Flag1" />
</fieldset>

4
<input type="radio" name="alwaysOn" onchange="this.checked=true" checked="checked">
<input type="radio" name="alwaysOff" onchange="this.checked=false" >

4

Tôi biết rằng "khuyết tật" không phải là một câu trả lời chấp nhận được, vì op muốn nó đăng. Tuy nhiên, bạn sẽ luôn phải xác thực các giá trị ở phía máy chủ NGAY CẢ nếu bạn có tùy chọn chỉ đọc. Điều này là do bạn không thể ngăn người dùng độc hại đăng các giá trị bằng thuộc tính chỉ đọc.

Tôi khuyên bạn nên lưu trữ giá trị ban đầu (phía máy chủ) và đặt nó thành vô hiệu hóa. Sau đó, khi họ gửi biểu mẫu, bỏ qua mọi giá trị được đăng và lấy các giá trị ban đầu mà bạn đã lưu trữ.

Nó sẽ nhìn và hành xử giống như nó là một giá trị chỉ đọc. Và nó xử lý (bỏ qua) bài viết từ người dùng độc hại. Bạn đang giết 2 con chim bằng một hòn đá.


3

Tôi đã nhận xét về câu trả lời của ConroyP, nhưng điều đó đòi hỏi 50 danh tiếng mà tôi không có. Tôi có đủ danh tiếng để gửi câu trả lời khác. Lấy làm tiếc.

Vấn đề với câu trả lời của ConroyP là hộp kiểm được hiển thị không thể thay đổi bằng cách thậm chí không bao gồm nó trên trang. Mặc dù Electrons_Ahoy không quy định nhiều như vậy, nhưng câu trả lời tốt nhất sẽ là một trong đó hộp kiểm không thể thay đổi sẽ trông giống nhau, nếu không giống như hộp kiểm có thể thay đổi, như trường hợp khi thuộc tính "bị vô hiệu hóa" được áp dụng. Một giải pháp giải quyết hai lý do Electrons_Ahoy đưa ra cho việc không muốn sử dụng thuộc tính "bị vô hiệu hóa" sẽ không nhất thiết là không hợp lệ vì nó sử dụng thuộc tính "bị vô hiệu hóa".

Giả sử hai biến boolean, $ đã kiểm tra và $ bị vô hiệu hóa:

if ($checked && $disabled)
    echo '<input type="hidden" name="my_name" value="1" />';
echo '<input type="checkbox" name="my_name" value="1" ',
    $checked ? 'checked="checked" ' : '',
    $disabled ? 'disabled="disabled" ' : '', '/>';

Hộp kiểm được hiển thị dưới dạng đã chọn nếu $ check là đúng. Hộp kiểm được hiển thị là không được chọn nếu $ check là sai. Người dùng có thể thay đổi trạng thái của hộp kiểm nếu và chỉ khi $ bị vô hiệu hóa là sai. Tham số "my_name" không được đăng khi hộp kiểm không được chọn, bởi người dùng hay không. Tham số "my_name = 1" được đăng khi hộp kiểm được chọn, bởi người dùng hay không. Tôi tin rằng đây là những gì Electrons_Ahoy đang tìm kiếm.


3

Không, các hộp kiểm đầu vào không thể được đọc.

Nhưng bạn có thể làm cho chúng chỉ đọc bằng javascript!

Thêm mã này bất cứ nơi nào bất cứ lúc nào để làm cho các hộp kiểm chỉ hoạt động như giả định, bằng cách ngăn người dùng sửa đổi nó theo bất kỳ cách nào.

jQuery(document).on('click', function(e){
      // check for type, avoid selecting the element for performance
      if(e.target.type == 'checkbox') {
          var el = jQuery(e.target);
          if(el.prop('readonly')) {
              // prevent it from changing state
              e.preventDefault();
          }
      }
});
input[type=checkbox][readonly] {
    cursor: not-allowed;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<label><input type="checkbox" checked readonly> I'm readonly!</label>

Bạn có thể thêm tập lệnh này bất cứ lúc nào sau khi jQuery đã tải.

Nó sẽ làm việc cho các yếu tố được thêm động.

Nó hoạt động bằng cách chọn sự kiện nhấp (xảy ra trước sự kiện thay đổi) trên bất kỳ phần tử nào trên trang, sau đó kiểm tra xem phần tử này có phải là hộp kiểm chỉ đọc hay không và nếu có thì nó sẽ chặn thay đổi.

Có rất nhiều if để làm cho nó không ảnh hưởng đến hiệu suất của trang.


3

Chỉ cần sử dụng thẻ vô hiệu hóa đơn giản như thế này dưới đây.

<input type="checkbox" name="email"  disabled>

6
"Thẻ bị vô hiệu hóa" sẽ không gửi dữ liệu này
Przemysław Kaczmarchot


2

Nếu bạn muốn TẤT CẢ các hộp kiểm của mình bị "khóa" để người dùng không thể thay đổi trạng thái "đã kiểm tra" nếu có chứng nhận "chỉ đọc", thì bạn có thể sử dụng jQuery:

$(':checkbox').click(function () {
    if (typeof ($(this).attr('readonly')) != "undefined") {
        return false;
    }
});

Điều thú vị về mã này là nó cho phép bạn thay đổi thuộc tính "chỉ đọc" trên toàn bộ mã của bạn mà không phải buộc lại mỗi hộp kiểm.

Nó hoạt động cho các nút radio là tốt.


1

Lý do chính khiến mọi người muốn có một hộp kiểm chỉ đọc và (cũng như) một nhóm radio chỉ đọc là để thông tin không thể thay đổi có thể được gửi lại cho người dùng ở dạng đã nhập.

OK bị vô hiệu hóa sẽ làm điều này - không may điều khiển bị vô hiệu hóa không thể điều hướng bằng bàn phím và do đó không tuân theo tất cả các luật về khả năng truy cập. Đây là hangout LỚN NHẤT trong HTML mà tôi biết.


1

Đóng góp rất rất muộn ... nhưng dù sao đi nữa. Khi tải trang, sử dụng jquery để vô hiệu hóa tất cả các hộp kiểm trừ cái được chọn hiện tại. Sau đó, đặt cái hiện được chọn là chỉ đọc để nó có giao diện tương tự như cái bị vô hiệu hóa. Người dùng không thể thay đổi giá trị và giá trị được chọn vẫn gửi.


1

Đến bữa tiệc rất muộn nhưng tôi đã tìm thấy câu trả lời cho MVC (5) Tôi đã vô hiệu hóa CheckBox và thêm HiddenFor TRƯỚC hộp kiểm, vì vậy khi nó đăng bài nếu tìm thấy trường Ẩn trước và sử dụng giá trị đó. Điều này không hoạt động.

 <div class="form-group">
     @Html.LabelFor(model => model.Carrier.Exists, new { @class = "control-label col-md-2" })
         <div class="col-md-10">
              @Html.HiddenFor(model => model.Carrier.Exists)
              @Html.CheckBoxFor(model => model.Carrier.Exists, new { @disabled = "disabled" })
              @Html.ValidationMessageFor(model => model.Carrier.Exists)
          </div>
 </div>

1

Tôi sẽ sử dụng thuộc tính chỉ đọc

<input type="checkbox" readonly>

Sau đó sử dụng CSS để vô hiệu hóa các tương tác:

input[type='checkbox'][readonly]{
    pointer-events: none;
}

Lưu ý rằng sử dụng lớp giả: chỉ đọc không hoạt động ở đây.

input[type='checkbox']:read-only{ /*not working*/
    pointer-events: none;
}

0

Tôi chỉ không muốn khách hàng có thể thay đổi chúng trong những trường hợp nhất định.

SYN SÀNG chính nó sẽ không làm việc. Bạn có thể làm một cái gì đó thú vị với w / CSS nhưng chúng tôi thường chỉ làm cho chúng bị vô hiệu hóa.

CẢNH BÁO: Nếu chúng được đăng lại thì khách hàng có thể thay đổi chúng, định kỳ. Bạn không thể dựa vào chỉ đọc để ngăn người dùng thay đổi thứ gì đó. Luôn luôn có thể sử dụng fiddler hoặc chỉ chane html w / fireorms hoặc một số thứ như vậy.


Bạn hoàn toàn đúng, đó là lý do tại sao tôi cũng kiểm tra xem ở phía máy chủ, thiết lập điều này chỉ để cải thiện trải nghiệm người dùng ở phía máy khách.
levhita

0

Giải pháp của tôi thực sự trái ngược với giải pháp của FlySwat, nhưng tôi không chắc liệu nó có hiệu quả với tình huống của bạn không. Tôi có một nhóm các hộp kiểm và mỗi hộp có trình xử lý onClick gửi biểu mẫu (chúng được sử dụng để thay đổi cài đặt bộ lọc cho bảng). Tôi không muốn cho phép nhiều lần nhấp, vì các lần nhấp tiếp theo sau lần nhấp đầu tiên bị bỏ qua. Vì vậy, tôi vô hiệu hóa tất cả các hộp kiểm sau lần nhấp đầu tiên và sau khi gửi biểu mẫu:

onclick="document.forms['form1'].submit(); $('#filters input').each(function() {this.disabled = true});"

Các hộp kiểm nằm trong phần tử span có ID "bộ lọc" - phần thứ hai của mã là một câu lệnh jQuery lặp lại qua các hộp kiểm và vô hiệu hóa từng bộ lọc. Bằng cách này, các giá trị hộp kiểm vẫn được gửi qua biểu mẫu (vì biểu mẫu đã được gửi trước khi vô hiệu hóa chúng) và nó ngăn người dùng thay đổi chúng cho đến khi trang tải lại.

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.