Tại sao các nút radio không thể đọc được


213

Tôi muốn hiển thị một nút radio, gửi giá trị của nó, nhưng tùy thuộc vào hoàn cảnh, nó không thể chỉnh sửa được. Vô hiệu hóa không hoạt động, bởi vì nó không gửi giá trị (hoặc nó?), Và nó làm mờ nút radio. Chỉ đọc thực sự là những gì tôi đang tìm kiếm, nhưng vì một số lý do bí ẩn, nó không hoạt động.

Có một số mẹo kỳ lạ tôi cần phải kéo để chỉ đọc để hoạt động như mong đợi? Tôi có nên làm điều đó trong JavaScript thay thế?

Ngẫu nhiên, có ai biết tại sao chỉ đọc không hoạt động trong các nút radio, trong khi nó chỉ hoạt động trong các thẻ đầu vào khác không? Đây có phải là một trong những thiếu sót không thể hiểu được trong thông số kỹ thuật HTML không?


5
Đây có phải là một trong những thiếu sót không thể hiểu được trong thông số kỹ thuật HTML không? Hãy nghĩ về nó từ quan điểm của người dùng. Tại sao hiển thị một nút họ không thể nhấp?
Paul D. Chờ

67
Tại sao hiển thị một nút họ không thể nhấp? Bởi vì tôi muốn họ biết nút ở đó, nhưng tôi không muốn họ có thể nhấp vào nút đó ngay bây giờ. Nhưng có lẽ sau này. Rốt cuộc, nó là một hình thức năng động. Tại sao một nút radio sẽ khác với bất kỳ trường đầu vào nào khác?
mcv

7
Đây là thông số kỹ thuật: w3.org/TR/html401/interact/forms.html#h-17.12.2 "Các yếu tố sau hỗ trợ thuộc tính chỉ đọc: INPUT và TEXTAREA." Điều này rõ ràng là sai. Tuy nhiên, quay lại đây, chúng tôi thấy một bản tóm tắt chính xác hơn: w3.org/TR/WD-forms-970402#readonly "Áp dụng S READN SÀNG cho các phần tử INPUT của loại văn bản hoặc PASSWORD và cho phần tử TEXTAREA." Có vẻ như điều này đã trượt giữa khoảng cách của recs và thông số kỹ thuật.
graphicdivine

Càng tò mò hơn. Theo tài liệu cổ này "Chẳng hạn, 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 CHECKED) nhưng bạn không thay đổi giá trị của trường." ( htmlcodetutorial.com/forms/_INPUT_DISABLED.html ) Điều này có đúng không? Việc đặt S READN SÀNG trên hộp kiểm / radio có khóa giá trị hay không, mặc dù người dùng rõ ràng có thể thay đổi nó?
graphicdivine

kiểm tra bài đăng của tôi [tại đây] [1] đưa ra giải pháp đơn giản cho vấn đề [1]: stackoverflow.com/a/15513256/1861389
drive4ward 20/03/13

Câu trả lời:


149

Tôi đã giả mạo chỉ đọc trên một nút radio bằng cách chỉ vô hiệu hóa các nút radio chưa được kiểm tra. Nó giữ cho người dùng chọn một giá trị khác và giá trị được kiểm tra sẽ luôn được đăng khi gửi.

Sử dụng jQuery để chỉ đọc:

$(':radio:not(:checked)').attr('disabled', true);

Cách tiếp cận này cũng hoạt động để tạo danh sách chọn chỉ đọc, ngoại trừ việc bạn sẽ cần tắt từng tùy chọn chưa chọn.


2
Cảm ơn @Megan, đây là một giải pháp tuyệt vời
Michael La Voie

9
Một biến thể về điều này để cho phép bạn sử dụng readonlytài sản, như OP dự kiến ​​nó sẽ hoạt động:$(':radio[readonly]:not(:checked)').attr('disabled', true);
wodow

1
Trong số các giải pháp bên dưới, giải pháp này cung cấp mã sạch nhất và hoạt động tốt với trình xác thực Jquery vì tôi không cần bật / tắt các trường hoặc xử lý các sự kiện nhấp chuột không ràng buộc và liên kết lại chúng khi gửi biểu mẫu.
Kristianne Nerona

Hoạt động chính xác. Cảm ơn
Hassan Farooq

Tài giỏi! Sử dụng .not (..), trong trường hợp bạn đã có một bộ các trường đầu vào được chọn: var myRadios = $ ('# Cụ thể-radio'); myRadios.not (': đã kiểm tra'). prop ('bị vô hiệu hóa', đúng); api.jquery.com/not
JoePC

206

Các nút radio sẽ chỉ cần đọc chỉ khi có các tùy chọn khác. Nếu bạn không có bất kỳ tùy chọn nào khác, có thể bỏ chọn nút radio đã chọn. Nếu bạn có các tùy chọn khác, bạn có thể ngăn người dùng thay đổi giá trị chỉ bằng cách vô hiệu hóa các tùy chọn khác:

<input type="radio" name="foo" value="Y" checked>
<input type="radio" name="foo" value="N" disabled>

Câu đố: http://jsfiddle.net/qqVGu/


3
Vấn đề với giải pháp đầu tiên của bạn là nếu tôi muốn kích hoạt radiobutton thông qua javascript, tôi đột nhiên có hai trường có cùng tên, vì vậy tôi phải dọn sạch một trong số chúng. Hoặc sử dụng một ẩn cho thực và có nút radio chỉ đặt giá trị của trường ẩn. Theo cách của Ether, nó chỉ cồng kềnh hơn một chút so với tôi muốn có một radiobutton. Giải pháp thứ hai của bạn, mặc dù tôi không nghi ngờ rằng nó hoạt động, nghe có vẻ như là một hack thực sự xấu xí. Vì vậy, tôi đoán giải pháp javascript là giải pháp duy nhất đáp ứng tiêu chí của tôi. Tôi sẽ đi với điều đó.
mcv

7
Giải pháp 1 xin vui lòng! Đó là cách duy nhất có thể truy cập. Và nếu bạn cần phải viết kịch bản, chỉ có một dòng nữa để đặt tính năng bật của trường ẩn thành đối diện với tính năng bật của radio.
bobince

5
Tôi chỉ nhận thấy rằng các giải pháp 2 và 3 đã thay đổi vị trí trong câu trả lời của Jonathan, vì vậy bây giờ các bình luận dường như không có nhiều ý nghĩa.
mcv

1
Muốn chú ý rằng giải pháp Javascript không hoạt động, nó chỉ bỏ chọn nút. Tôi cho rằng nó cần phải onclick="return false"ngăn chặn sự thay đổi.
dmitry

2
Khi tôi đặt radio "bị vô hiệu hóa", tôi thêm "style = con trỏ: mặc định" để xóa "con trỏ bị tắt".
Joao Paulo

24

Đây là mẹo bạn có thể đi với.

<input type="radio" name="name" onclick="this.checked = false;" />

4
Chính xác những gì tôi đã nghĩ, mặc dù nó sẽ là tốt nhất nếu bạn làm rõ rằng nó nên có onClick="this.checked = <%=value%>"một số loại :)
JustLoren

đó là điều tuyệt vời để biết kiểm tra có thể có giá trị đúng hoặc sai.
Sarfraz

Chỉ cần một cảnh báo rằng điều này sẽ không hoạt động đối với những người trong chúng ta duyệt bằng javascript không được bật theo mặc định.
tloach

3
Không phải là một vấn đề cho trường hợp của tôi. Chúng tôi sử dụng hàng tấn jQuery và Ajax.
mcv

1
Đáng chú ý bạn chỉ có thể làm onclick="return false;"để giữ giá trị như cũ cho nhóm
Zach

12

Tôi có một hình thức dài (hơn 250 trường) gửi lên db. Nó là một ứng dụng việc làm trực tuyến. Khi quản trị viên xem xét một ứng dụng đã được nộp, biểu mẫu được điền với dữ liệu từ db. Văn bản đầu vào và văn bản được thay thế bằng văn bản họ đã gửi nhưng radio và hộp kiểm rất hữu ích để giữ làm thành phần của biểu mẫu. Vô hiệu hóa chúng làm cho chúng khó đọc hơn. Đặt thuộc tính .checked thành false onclick sẽ không hoạt động vì chúng có thể đã được người dùng kiểm tra điền vào ứng dụng. Nhưng dù sao ...

onclick="return false;"

hoạt động như một cơ duyên cho 'vô hiệu hóa' radio và hộp kiểm ipso facto.


8

Giải pháp tốt nhất là đặt trạng thái được kiểm tra hoặc không được kiểm tra (từ máy khách hoặc máy chủ) và không để người dùng thay đổi nó sau khi phường (tức là làm cho nó chỉ đọc) làm như sau:

<input type="radio" name="name" onclick="javascript: return false;" />

Không! trong trường hợp này, người dùng có thể chỉnh sửa html trong trình duyệt, đánh dấu tùy chọn cần thiết là đã chọn và đăng mẫu.
lỗi1009

2

Tôi đã nghĩ ra một cách nặng về javascript để đạt được trạng thái chỉ đọc cho các hộp kiểm và các nút radio. Nó được thử nghiệm với các phiên bản hiện tại của Firefox, Opera, Safari, Google Chrome, cũng như các phiên bản IE hiện tại và trước đây (xuống IE7).

Tại sao không chỉ đơn giản là sử dụng tài sản khuyết tật bạn yêu cầu? Khi in trang, các yếu tố đầu vào bị vô hiệu hóa có màu xám. Khách hàng đã thực hiện điều này muốn tất cả các yếu tố có cùng màu.

Tôi không chắc mình có được phép đăng mã nguồn ở đây không, vì tôi đã phát triển nó khi làm việc cho một công ty, nhưng tôi chắc chắn có thể chia sẻ các khái niệm.

Với các sự kiện onmousedown, bạn có thể đọc trạng thái lựa chọn trước khi hành động nhấp thay đổi nó. Vì vậy, bạn lưu trữ thông tin này và sau đó khôi phục các trạng thái này bằng một sự kiện onclick.

<input id="r1" type="radio" name="group1" value="r1" onmousedown="storeSelectedRadiosForThisGroup(this.name);" onclick="setSelectedStateForEachElementOfThisGroup(this.name);" checked="checked">Option 1</input>
<input id="r2" type="radio" name="group1" value="r2" onmousedown="storeSelectedRadiosForThisGroup(this.name);" onclick="setSelectedStateForEachElementOfThisGroup(this.name);">Option 2</input>
<input id="r3" type="radio" name="group1" value="r3" onmousedown="storeSelectedRadiosForThisGroup(this.name);" onclick="setSelectedStateForEachElementOfThisGroup(this.name);">Option 3</input>

<input id="c1" type="checkbox" name="group2" value="c1" onmousedown="storeSelectedRadiosForThisGroup(this.name);" onclick="setSelectedStateForEachElementOfThisGroup(this.name);" checked="checked">Option 1</input>
<input id="c2" type="checkbox" name="group2" value="c2" onmousedown="storeSelectedRadiosForThisGroup(this.name);" onclick="setSelectedStateForEachElementOfThisGroup(this.name);">Option 2</input>
<input id="c3" type="checkbox" name="group2" value="c3" onmousedown="storeSelectedRadiosForThisGroup(this.name);" onclick="setSelectedStateForEachElementOfThisGroup(this.name);" checked="checked">Option 3</input>

Phần javascript của phần này sau đó sẽ hoạt động như thế này (chỉ một lần nữa các khái niệm):

var selectionStore = new Object();  // keep the currently selected items' ids in a store

function storeSelectedRadiosForThisGroup(elementName) {
    // get all the elements for this group
    var radioOrSelectGroup = document.getElementsByName(elementName);

    // iterate over the group to find the selected values and store the selected ids in the selectionStore
    // ((radioOrSelectGroup[i].checked == true) tells you that)
    // remember checkbox groups can have multiple checked items, so you you might need an array for the ids
    ...
}

function setSelectedStateForEachElementOfThisGroup(elementName) {
    // iterate over the group and set the elements checked property to true/false, depending on whether their id is in the selectionStore
    ...

    // make sure you return false here
    return false;
}

Bây giờ bạn có thể bật / tắt các nút / hộp kiểm radio bằng cách thay đổi thuộc tính onclick và onmousedown của các thành phần đầu vào.


2

Cách JavaScript - điều này làm việc cho tôi.

<script>
$(document).ready(function() {
   $('#YourTableId').find('*').each(function () { $(this).attr("disabled", true); });
});
</script>

Lý do:

  1. $('#YourTableId').find('*') -> cái này trả về tất cả các thẻ.

  2. $('#YourTableId').find('*').each(function () { $(this).attr("disabled", true); }); lặp đi lặp lại trên tất cả các đối tượng được chụp trong này và vô hiệu hóa các thẻ đầu vào.

Phân tích (Gỡ lỗi):

  1. form:radiobutton được xem xét nội bộ như một thẻ "đầu vào".

  2. Giống như trong hàm trên (), nếu bạn thử in document.write(this.tagName);

  3. Bất cứ nơi nào, trong các thẻ nó tìm thấy các nút radio, nó sẽ trả về một thẻ đầu vào.

Vì vậy, dòng mã trên có thể được tối ưu hóa nhiều hơn cho các thẻ nút radio, bằng cách thay thế * bằng đầu vào: $('#YourTableId').find('input').each(function () { $(this).attr("disabled", true); });


1

Một tùy chọn khá đơn giản sẽ là tạo một hàm javascript được gọi trong sự kiện "onsubmit" của biểu mẫu để kích hoạt lại radiobutton để giá trị của nó được đăng cùng với phần còn lại của biểu mẫu.
Nó dường như không phải là một thiếu sót trong thông số kỹ thuật HTML, nhưng một lựa chọn thiết kế (một logic, IMHO), một radiobutton không thể chỉ đọc như một nút không thể, nếu bạn không muốn sử dụng nó, sau đó bạn không muốn sử dụng nó vô hiệu hóa nó


1

Tôi thấy rằng onclick='this.checked = false;'việc sử dụng đã làm việc ở một mức độ nhất định. Một nút radio đã được bấm sẽ không được chọn. Tuy nhiên, nếu có một nút radio đã được chọn (ví dụ: giá trị mặc định), nút radio đó sẽ không được chọn.

<!-- didn't completely work -->
<input type="radio" name="r1" id="r1" value="N" checked="checked" onclick='this.checked = false;'>N</input>
<input type="radio" name="r1" id="r1" value="Y" onclick='this.checked = false;'>Y</input>

Đối với trường hợp này, chỉ để lại giá trị mặc định và vô hiệu hóa (các) nút radio khác sẽ duy trì nút radio đã chọn và ngăn không cho nó không được chọn.

<!-- preserves pre-selected value -->
<input type="radio" name="r1" id="r1" value="N" checked="checked">N</input>
<input type="radio" name="r1" id="r1" value="Y" disabled>Y</input>

Giải pháp này không phải là cách thanh lịch nhất để ngăn giá trị mặc định bị thay đổi, nhưng nó sẽ hoạt động cho dù javascript có được bật hay không.


1

Đối với các nút radio không được chọn, gắn cờ chúng là vô hiệu hóa. Điều này ngăn họ phản hồi với đầu vào của người dùng và xóa nút radio đã kiểm tra. Ví dụ:

<input type="radio" name="var" checked="yes" value="Yes"></input>
<input type="radio" name="var" disabled="yes" value="No"></input>

4
checked="yes"? Thông số kỹ thuật đó là gì? Hoặc sử dụng checked="checked"hoặc chỉ thuộc tính checkedmà không có giá trị. Tương tự cho disabled.
Robin van Baalen

1

Hãy thử thuộc tính disabled, nhưng tôi nghĩ rằng bạn sẽ không nhận được giá trị của các nút radio. Hoặc đặt hình ảnh thay vì như:

<img src="itischecked.gif" alt="[x]" />radio button option

Trân trọng.


1
ồ, mã html của tôi đã bị xóa: img src = "itIsChecked.gif" alt = "[x]" OptionChecked
Tim

0

Tôi đang sử dụng plugin JS định kiểu các thành phần hộp kiểm / đầu vào radio và sử dụng jQuery sau để thiết lập 'trạng thái chỉ đọc' trong đó giá trị cơ bản vẫn được đăng nhưng yếu tố đầu vào xuất hiện không thể truy cập được đối với người dùng, tôi tin rằng đó là lý do dự định chúng ta sẽ sử dụng thuộc tính đầu vào chỉ đọc ...

if ($(node).prop('readonly')) {
    $(node).parent('div').addClass('disabled'); // just styling, appears greyed out
    $(node).on('click', function (e) {
        e.preventDefault();
    });
}

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.