Thẻ HTML chỉ đọc / nhập


587

Theo thông số kỹ thuật HTML, selectthẻ trong HTML không có readonlythuộc tính, chỉ có disabledthuộc tính. Vì vậy, nếu bạn muốn ngăn người dùng thay đổi danh sách thả xuống, bạn phải sử dụng disabled.

Vấn đề duy nhất là các đầu vào dạng HTML bị vô hiệu hóa không được đưa vào dữ liệu POST / GET.

Cách tốt nhất để mô phỏng readonlythuộc tính cho selectthẻ và vẫn nhận được dữ liệu POST?


5
Đừng phụ thuộc vào điều đó cho phía máy chủ. Bất cứ ai cũng có thể tạo trang HTML của riêng họ và làm cho nó RW.
Brendan Byrd

11
Nhưng đó không phải là một câu hỏi dành riêng cho PHP.
Kaleb Brasee

4
Tôi sẽ đề nghị không sử dụng một yếu tố chọn trong trường hợp này. Có bất kỳ lý do nào bạn không thể chỉ hiển thị giá trị dưới dạng văn bản thuần túy?
Big McLargeHuge

2
@ppumkin bình luận của bạn không có ý nghĩa. Tôi không nói rằng không bao giờ có trường hợp sử dụng tốt cho các trường mẫu được chọn hoặc ẩn. OP gặp sự cố khi hiển thị một số văn bản trên trang và tôi chỉ đơn giản là tự hỏi mục đích của việc sử dụng một yếu tố được chọn trong trường hợp này là gì.
Big McLUNDHuge

2
Tôi phải đọc câu hỏi sai. Anh ta nói rằng anh ta muốn vô hiệu hóa lựa chọn để người dùng không thay đổi nó. Có lẽ anh ta cần kết xuất trang với các lựa chọn và sử dụng jquery để ngăn thay đổi. Nhưng khi anh ta gửi nó trở lại thì không có dữ liệu cho nó. Tôi đã làm như vậy. Tôi cần hiển thị các lựa chọn được lọc bởi các lựa chọn khác và lần thả xuống cuối cùng lưu vào DB thông qua ajax để tất cả các lần trước phải được khóa. Khi tôi kết xuất lại trang, phải, tôi có thể hiển thị nhãn thay vì chọn. Nhưng đó không phải là vấn đề :)
Piotr Kula

Câu trả lời:


461

Bạn nên giữ selectnguyên phần tử disablednhưng cũng thêm một phần tử ẩn khác inputcó cùng tên và giá trị.

Nếu bạn có thể kích hoạt CHỌN của mình, bạn nên sao chép giá trị của nó vào đầu vào ẩn trong một sự kiện onchange và vô hiệu hóa (hoặc loại bỏ) đầu vào ẩn.

Đây là một bản demo:

$('#mainform').submit(function() {
    $('#formdata_container').show();
    $('#formdata').html($(this).serialize());
    return false;
});

$('#enableselect').click(function() {
    $('#mainform input[name=animal]')
        .attr("disabled", true);
    
    $('#animal-select')
        .attr('disabled', false)
    	.attr('name', 'animal');
    
    $('#enableselect').hide();
    return false;
});
#formdata_container {
    padding: 10px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div>
    <form id="mainform">
        <select id="animal-select" disabled="true">
            <option value="cat" selected>Cat</option>
            <option value="dog">Dog</option>
            <option value="hamster">Hamster</option>
        </select>
        <input type="hidden" name="animal" value="cat"/>
        <button id="enableselect">Enable</button>
        
        <select name="color">
            <option value="blue" selected>Blue</option>
            <option value="green">Green</option>
            <option value="red">Red</option>
        </select>

        <input type="submit"/>
    </form>
</div>

<div id="formdata_container" style="display:none">
    <div>Submitted data:</div>
    <div id="formdata">
    </div>
</div>


5
Nếu bạn có thể chọn, bạn cũng phải vô hiệu hóa hoặc xóa đầu vào ẩn (sau khi sao chép giá trị của nó như được mô tả). Nếu không, bạn sẽ nhận được giá trị được gửi gấp đôi
Adam

1
@max Ah!. Ok, nó hoạt động quá. Tôi đã giả sử vì yo nói rằng đầu vào ẩn phải có "cùng tên" mà người chọn có tên.
Adam

2
Điều gì xảy ra nếu tôi đang sử dụng nhiều lựa chọn?
Anyul Rivas

2
Có hai yếu tố có cùng tên sẽ chỉ đăng lại đầu vào / lựa chọn được kích hoạt cuối cùng, chứ không phải gấp đôi. Ngoài ra, chỉ có selectedgiá trị được đăng trở lại không phải toàn bộ danh sách. Vì vậy, bạn hiddenngồi trước của bạn selectvà giữ giá trị được chọn. Nếu lựa chọn bị vô hiệu hóa cho "chỉ đọc", bài đăng trở lại sẽ chỉ chứa giá trị của đầu vào ẩn. Nếu lựa chọn được bật, tùy chọn được chọn hiển thị sẽ "ghi đè / thay thế" giá trị ẩn và đó là giá trị sẽ được đăng lại.
Piotr Kula

29
Mặc dù đây là giải pháp rõ ràng, nhưng nó là một giải pháp, vì bạn phải thêm một trường đầu vào khác.
Donato

189

Chúng ta cũng có thể sử dụng cái này

Vô hiệu hóa tất cả ngoại trừ tùy chọn đã chọn:

<select>
    <option disabled>1</option>
    <option selected>2</option>
    <option disabled>3</option>
</select>

Bằng cách này, trình đơn thả xuống vẫn hoạt động (và gửi giá trị của nó) nhưng người dùng không thể chọn giá trị khác.

Bản giới thiệu


3
Một lựa chọn tuyệt vời cho lựa chọn năng động
Diego Favero

11
Hoàn hảo cho một thẻ CHỌN giá trị đơn! Nhưng sẽ không hoạt động cho <select nhiều>, điều này vẫn sẽ cho phép người dùng bỏ chọn một số tùy chọn đã chọn, do đó thay đổi giá trị.
Mikhail Bunkin

2
Hỗ trợ trình duyệt cho thuộc tính optioncủa thẻdisabled
Jo.

4
Đây là một giải pháp tuyệt vời. Tôi sẽ thêm rằng bạn có thể đạt được nó một cách dễ dàng với jQuery như thế này: $("#yourSelectId option:not(:selected)).attr("disabled", "disabled")
Onkel-j

105

Bạn có thể kích hoạt lại đối tượng được chọn khi gửi.

EDIT : tức là, thông thường vô hiệu hóa thẻ chọn (với thuộc tính bị vô hiệu hóa) và sau đó bật lại tự động ngay trước khi gửi biểu mẫu:

Ví dụ với jQuery:

  • Để vô hiệu hóa nó:

    $('#yourSelect').prop('disabled', true);
  • Để kích hoạt lại trước khi gửi để bao gồm dữ liệu GET / POST:

    $('#yourForm').on('submit', function() {
        $('#yourSelect').prop('disabled', false);
    });

Ngoài ra, bạn có thể bật lại mọi đầu vào bị vô hiệu hóa hoặc chọn:

$('#yourForm').on('submit', function() {
    $('input, select').prop('disabled', false);
});

4
sử dụng .prop ('khuyết tật', đúng / sai) để đặt thuộc tính bị vô hiệu hóa. Thuộc tính sẽ không thay đổi trạng thái thực tế.
Paris Char

Tôi nghĩ giải pháp này thông minh hơn giải pháp @bezmax . Bởi vì nếu chúng tôi thêm đầu vào ẩn, chúng tôi phải xem xét rằng chỉ một trong mỗi đầu vào (cùng tên) được bật bất cứ lúc nào. Mặt khác, nếu cả hai đầu vào được bật, ở phía máy chủ, chương trình sẽ lấy một mảng đầu vào có thể gây ra ngoại lệ (ví dụ: nếu chúng tôi không xử lý tình huống này và chúng tôi mong đợi một chuỗi và sử dụng 'Request.Form [FieldName] 'lệnh)
MiT

@Kevin, hoạt động> 90% trường hợp. Ngoài ra, bạn phải có jquery trong thắt lưng của bạn ... Eh.
sitilge

Điều này là sạch hơn nhiều câu trả lời được chấp nhận. Dễ dàng hoàn tác logic hơn nếu bạn không muốn phần tử bị vô hiệu hóa nữa và không có thẻ đầu vào bổ sung.
Haohmaru

51

một cách khác để làm một readOnlythuộc tính cho một selectphần tử là bằng cách sử dụngcss

bạn có thể làm như thế nào:

$('#selection').css('pointer-events','none');

BẢN GIỚI THIỆU


8
Giải pháp tốt đẹp. Nhưng bạn vẫn có thể thay đổi giá trị bằng bàn phím.
Mario Werner

1
Vâng, điều này là khá tuyệt vời. Để thay đổi giá trị bằng bàn phím, bạn sẽ phải TAB thành phần tử và sau đó nó sẽ được chọn. Nếu bạn làm cho màu nền xám hoặc bị tắt, bạn cũng sẽ thông báo trực quan cho người dùng rằng đây là "bị vô hiệu hóa" khi nó thực sự không bị tắt. Không ai hỗ trợ IE nữa nên ai quan tâm. Bạn cũng có thể đặt phím tắt ngăn mặc định nếu bạn muốn ngăn.
Piotr Kula

Khá không chính thống !! Nếu lựa chọn cần phải bị chặn khỏi kết xuất trang,... .on('mouseover', function(){ ... });
Fr0zenFyr

pointer-events: nonengăn tiêu điểm từ con trỏ chuột. Để cũng tránh lấy nét từ bàn phím, bạn có thể bổ sung bằng cách làm mờ ngay lập tức trên tất cả các sự kiện lấy nét:$('select').css('pointer-events', 'none').on('focus', function () {$(this).blur();});
Quinn Comendant

39
<select id="countries" onfocus="this.defaultIndex=this.selectedIndex;" onchange="this.selectedIndex=this.defaultIndex;">
<option value="1">Country1</option>
<option value="2">Country2</option>
<option value="3">Country3</option>
<option value="4">Country4</option>
<option value="5">Country5</option>
<option value="6">Country6</option>
<option value="7" selected="selected">Country7</option>
<option value="8">Country8</option>
<option value="9">Country9</option>
</select>

Đã thử nghiệm và hoạt động trong IE 6, 7 & 8b2, Firefox 2 & 3, Opera 9.62, Safari 3.2.1 cho Windows và Google Chrome.


15
Vấn đề với điều này là việc thả xuống được hiển thị như thể nó không đọc được. Người dùng sẽ nghĩ rằng thứ đó không hoạt động ...
Lukas Eder

8
Điều này gây nhầm lẫn cho người dùng vì họ vẫn có thể chọn một tùy chọn, nhưng khi họ chọn nó, danh sách sẽ thay đổi trở lại giá trị được chọn trước đó. Đó là nhiều hơn nữa trực quan để vô hiệu hóa các danh sách để ngăn chặn người dùng lựa chọn bất cứ điều gì cả.
dana

11
Tôi đã có một vấn đề tương tự và giải quyết nó chỉ hiển thị tùy chọn đã chọn. Không yêu cầu JS, ít gây nhầm lẫn cho người dùng ... <select id="countries"> <option value="7" selected="selected">Country7</option> </select>
Potherca

1
@ppumkin @dana @LukasEder Không .. không nếu bạn có thể sửa UX này. Ví dụ: bạn có thể làm một cái gì đó như onchange = 'this.selectedIndex=this.defaultIndex; alert("You should not change this..");'thay vì chỉ im lặng thay đổi chỉ mục đã chọn ..
Fr0zenFyr

1
@LukasEder Đối với bất kỳ ai xảo quyệt về trải nghiệm của người được hỏi, họ có thể thêm một số CSS để thực sự nhấn mạnh rằng không nên thay đổi thả xuống. Đặt con trỏ not-allowedvà màu nền thành #CCC.
Alexander Dixon

36

Giải pháp jQuery đơn giản

Sử dụng điều này nếu lựa chọn của bạn có readonlylớp

jQuery('select.readonly option:not(:selected)').attr('disabled',true);

Hoặc điều này nếu lựa chọn của bạn có readonly="readonly"thuộc tính

$('select[readonly="readonly"] option:not(:selected)').attr('disabled',true);

7
Xin giải thích mã của bạn một chút. Liệu chúng ta có thêm một 'readonly' lớp đến các yếu tố chọn? Khi nào chúng ta phải gọi mã này: chỉ trong tài liệu. Đã có hoặc mỗi khi chọn được bật / tắt? Mã của bạn có an toàn không?
anar khalilov

$(document).ready(function(){$('select option:not(:selected)').attr('disabled',true);});chỉ hoạt động tốt trên một lựa chọn duy nhất. Không có lớp "chỉ đọc" là bắt buộc. Nhiều lựa chọn có vấn đề ở chỗ nếu có nhiều hơn một tùy chọn đã được chọn và do đó không bị vô hiệu hóa và người dùng chọn một trong các tùy chọn không bị vô hiệu hóa, các tùy chọn đã chọn trước đó sẽ không được chọn.
gordon

không hiểu gì về điều này
Piotr Kula

Nó vô hiệu hóa các tùy chọn khác với tùy chọn đã chọn cho các hộp chọn với lớp "chỉ đọc". Nếu bạn có phần tử chọn trong tay, bạn có thể viết:$select.find('option').not(':selected').attr('disabled', 'disabled');
Semra

1
Tôi thích giải pháp này. Tôi sẽ thay đổi bộ chọn thành select[readonly]để bạn chỉ cần thêm thuộc tính chỉ đọc vào thành phần - theo cách này bạn không phải đối xử với các lựa chọn khác với bất kỳ loại nào khác. Các javascript sau đó tăng dần hiệu quả. Hãy nhớ rằng giải pháp này (và hầu hết các giải pháp khác) chỉ giúp tác nhân người dùng cung cấp trải nghiệm người dùng tốt nhất - nó không thực sự thực thi bất cứ điều gì (phải được thực hiện phía máy chủ nếu cần).
jgivoni

21

Giải pháp CSS đơn giản:

select[readonly]{
    background: #eee;
    cursor:no-drop;
}

select[readonly] option{
    display:none;
}

Điều này dẫn đến Chọn màu xám với con trỏ "vô hiệu hóa" đẹp khi di chuột
và chọn danh sách tùy chọn là "trống" để bạn không thể thay đổi giá trị của nó.


1
Nếu bạn có xác thực CSRF (như trong symfony và nhiều khung công tác khác), nó sẽ không hoạt động.
ThEBiShOp


11

Đây là giải pháp tốt nhất tôi đã tìm thấy:

$("#YourSELECTIdHere option:not(:selected)").prop("disabled", true);

Đoạn mã trên vô hiệu hóa tất cả các tùy chọn khác không được chọn trong khi vẫn bật tùy chọn đã chọn. Làm như vậy tùy chọn đã chọn sẽ đưa nó vào dữ liệu sau.


11

Tôi biết rằng đã quá muộn, nhưng nó có thể được thực hiện bằng CSS đơn giản:

select[readonly] option, select[readonly] optgroup {
    display: none;
}

Kiểu ẩn tất cả các tùy chọn và các nhóm khi lựa chọn ở readonlytrạng thái, vì vậy người dùng không thể thay đổi lựa chọn của mình.

hacks Không Javascript là cần thiết.


Đẹp và đơn giản. Tôi thích nó.
Jonathan Parent Lévesque

Đây là một giải pháp rất tốt cho vấn đề. Cảm ơn bạn!
OderWat

10

Dễ dàng hơn vẫn: thêm thuộc tính phong cách cho bạn chọn thẻ:

style="pointer-events: none;"

Nó hoạt động với tôi nhưng các sự kiện con trỏ sẽ làm cho các trình duyệt chéo hỗ trợ?
Abhijit Jagtap

3
Nó không hoạt động. Người dùng có thể thay đổi đầu vào bằng bàn phím.
Sandhu

6

Đây là giải pháp đơn giản và tốt nhất. Bạn sẽ đặt một attrny attr trên lựa chọn của bạn, hoặc bất kỳ attr nào như dữ liệu chỉ đọc và làm như sau

$("select[readonly]").live("focus mousedown mouseup click",function(e){
    e.preventDefault();
    e.stopPropagation();
});

1
bạn nên thêm keydown quảng cáo keyup ở đây cũng như thả xuống vẫn có sẵn bằng cách "tab" vào nó và sử dụng các phím mũi tên để thay đổi giá trị.
apfz

5

Đặt lựa chọn bị vô hiệu hóa khi bạn lập kế hoạch cho nó ở chế độ chỉ đọc và sau đó xóa thuộc tính bị vô hiệu hóa ngay trước khi gửi biểu mẫu.

// global variable to store original event/handler for save button
var form_save_button_func = null;

// function to get jQuery object for save button
function get_form_button_by_id(button_id) {
    return jQuery("input[type=button]#"+button_id);
}

// alter value of disabled element
function set_disabled_elem_value(elem_id, value)  {
    jQuery("#"+elem_id).removeAttr("disabled");
    jQuery("#"+elem_id).val(value);
    jQuery("#"+elem_id).attr('disabled','disabled');
}

function set_form_bottom_button_save_custom_code_generic(msg) {
    // save original event/handler that was either declared
    // through javascript or html onclick attribute
    // in a global variable
    form_save_button_func = get_form_button_by_id('BtnSave').prop('onclick'); // jQuery 1.6
    //form_save_button_func = get_form_button_by_id('BtnSave').prop('onclick'); // jQuery 1.7

    // unbind original event/handler (can use any of following statements below)
    get_form_button_by_value('BtnSave').unbind('click');
    get_form_button_by_value('BtnSave').removeAttr('onclick');

    // alternate save code which also calls original event/handler stored in global variable
    get_form_button_by_value('BtnSave').click(function(event){
        event.preventDefault();
        var confirm_result = confirm(msg);
        if (confirm_result) {
            if (jQuery("form.anyForm").find('input[type=text], textarea, select').filter(".disabled-form-elem").length > 0) {
                jQuery("form.anyForm").find('input[type=text], textarea, select').filter(".disabled-form-elem").removeAttr("disabled");
            }

            // disallow further editing of fields once save operation is underway
            // by making them readonly
            // you can also disallow form editing by showing a large transparent
            // div over form such as loading animation with "Saving" message text
            jQuery("form.anyForm").find('input[type=text], textarea, select').attr('ReadOnly','True');

            // now execute original event/handler
            form_save_button_func();
        }
    });
}

$(document).ready(function() {
    // if you want to define save button code in javascript then define it now

    // code below for record update
    set_form_bottom_button_save_custom_code_generic("Do you really want to update this record?");
    // code below for new record
    //set_form_bottom_button_save_custom_code_generic("Do you really want to create this new record?");

    // start disabling elements on form load by also adding a class to identify disabled elements
    jQuery("input[type=text]#phone").addClass('disabled-form-elem').attr('disabled','disabled');
    jQuery("input[type=text]#fax").addClass('disabled-form-elem').attr('disabled','disabled');
    jQuery("select#country").addClass('disabled-form-elem').attr('disabled','disabled');
    jQuery("textarea#address").addClass('disabled-form-elem').attr('disabled','disabled');

    set_disabled_elem_value('phone', '123121231');
    set_disabled_elem_value('fax', '123123123');
    set_disabled_elem_value('country', 'Pakistan');
    set_disabled_elem_value('address', 'address');

}); // end of $(document).ready function

Nghe có vẻ như một điều kiện cuộc đua đang chờ để xảy ra.
Brendan Byrd

5

Ngoài việc vô hiệu hóa các tùy chọn không nên chọn, tôi thực sự muốn làm cho chúng biến mất khỏi danh sách, nhưng vẫn có thể kích hoạt chúng nếu tôi cần sau này:

$("select[readonly]").find("option:not(:selected)").hide().attr("disabled",true);

Điều này tìm thấy tất cả các thành phần được chọn với thuộc tính chỉ đọc, sau đó tìm tất cả các tùy chọn bên trong các lựa chọn không được chọn, sau đó nó ẩn chúng và vô hiệu hóa chúng.

Điều quan trọng là phải phân tách truy vấn jquery trong 2 vì lý do hiệu suất, bởi vì jquery đọc chúng từ phải sang trái, mã:

$("select[readonly] option:not(:selected)")

đầu tiên sẽ tìm thấy tất cả các tùy chọn không được chọn trong tài liệu và sau đó lọc các tùy chọn bên trong các lựa chọn với thuộc tính chỉ đọc.


Có lẽ .prop("disabled", true)thay vào đó
sam

4

Một cách tiếp cận phía máy chủ đơn giản là loại bỏ tất cả các tùy chọn ngoại trừ tùy chọn mà bạn muốn được chọn. Như vậy, trong Zend Framework 1.12, nếu $ phần tử là một Zend_Form_Element_Select:

 $value =  $element->getValue();
 $options = $element->getAttrib('options');
 $sole_option = array($value => $options[$value]);
 $element->setAttrib('options', $sole_option);

4

Nếu bạn tắt trường biểu mẫu, trường này sẽ không được gửi khi biểu mẫu được gửi. Vì vậy, nếu bạn cần một readonlyhoạt động như thế disablednhưng gửi giá trị làm điều này:

Sau khi có bất kỳ thay đổi nào về thuộc tính chỉ đọc của một phần tử.

$('select.readonly option:not(:selected)').attr('disabled',true);

$('select:not([readonly]) option').removeAttr('disabled');

4

Giải pháp với tabindex. Hoạt động với đầu vào chọn nhưng cũng có văn bản.

Đơn giản chỉ cần sử dụng một lớp .disables.

CSS:

.disabled {
    pointer-events:none; /* No cursor */
    background-color: #eee; /* Gray background */
}

JS:

$(".disabled").attr("tabindex", "-1");

HTML:

<select class="disabled">
    <option value="0">0</option>
</select>

<input type="text" class="disabled" />

Chỉnh sửa: Với Internet Explorer, bạn cũng cần mã này:

$(document).on("mousedown", ".disabled", function (e) {
    e.preventDefault();
});

2

Theo gợi ý từ Grant Wagners; đây là một đoạn mã jQuery thực hiện nó với các hàm xử lý thay vì các thuộc tính onXXX trực tiếp:

var readonlySelect = function(selector, makeReadonly) {

    $(selector).filter("select").each(function(i){
        var select = $(this);

        //remove any existing readonly handler
        if(this.readonlyFn) select.unbind("change", this.readonlyFn);
        if(this.readonlyIndex) this.readonlyIndex = null;

        if(makeReadonly) {
            this.readonlyIndex = this.selectedIndex;
            this.readonlyFn = function(){
                this.selectedIndex = this.readonlyIndex;
            };
            select.bind("change", this.readonlyFn);
        }
    });

};

2

Tôi đã giải quyết nó bằng jquery:

      $("select.myselect").bind("focus", function(){
        if($(this).hasClass('readonly'))
        {
          $(this).blur();   
          return;
        }
      });

Điều này hoạt động rất độc đáo, mặc dù hoạt hình mouseover vẫn sẽ hiển thị một mũi tên thả xuống trông có thể nhấp được.
Johncl

Điều này không hiệu quả với tôi trong Chrome 26: lựa chọn vẫn đầy đủ chức năng.
Andy

Nhưng nó vẫn hiển thị danh sách khi bạn nhấp đúp vào nó trên IE. Dù sao để ngăn chặn điều đó?
user1995781

2

Nếu bạn đang sử dụng xác thực jquery, bạn có thể thực hiện như sau, tôi đã sử dụng thuộc tính bị vô hiệu hóa mà không gặp vấn đề gì:

$(function(){
    $('#myform').validate({
        submitHandler:function(form){
            $('select').removeAttr('disabled');
            form.submit();
        }
    });
});

2

Những gì tôi tìm thấy hoạt động rất tốt, với javascript đơn giản (nghĩa là: không yêu cầu thư viện JQuery), là thay đổi bên trongHTML của <select>thẻ thành giá trị còn lại duy nhất mong muốn.

Trước:

<select name='day' id='day'>
  <option>SUN</option>
  <option>MON</option>
  <option>TUE</option>
  <option>WED</option>
  <option>THU</option>
  <option>FRI</option>
  <option>SAT</option>
</select>

Javascript mẫu:

document.getElementById('day').innerHTML = '<option>FRI</option>';

Sau:

<select name='day' id='day'>
  <option>FRI</option>
</select>

Bằng cách này, không có thay đổi hiệu ứng trực quan và điều này sẽ POST / GET trong <FORM>.


1

Thay vì chọn chính nó, bạn có thể vô hiệu hóa tất cả các tùy chọn ngoại trừ tùy chọn hiện được chọn. Điều này mang lại sự xuất hiện của một trình đơn thả xuống hoạt động, nhưng chỉ có tùy chọn bạn muốn thông qua là một lựa chọn hợp lệ.


3
Về lý thuyết, một ý tưởng tuyệt vời - nhưng KHÔNG hỗ trợ cho các tùy chọn bị vô hiệu hóa trong IE trước IE8. tinyurl.com/yle4bto
scunliffe

1

giải pháp html:

<select onfocus="this.blur();">

những người viết javascript:

selectElement.addEventListener("focus", selectElement.blur, true); selectElement.attachEvent("focus", selectElement.blur); //thanks, IE

để xóa:

selectElement.removeEventListener("focus", selectElement.blur, true); selectElement.detachEvent("focus", selectElement.blur); //thanks, IE

chỉnh sửa: thêm phương thức loại bỏ


@BriptButkus làm những cái javascript hoạt động? Tôi đoán nó có thể là một vấn đề liên quan đến trình duyệt. Bạn đã cố gắng thêm một tabindex vào phần tử
Kadmillos

1

Đơn giản, xóa thuộc tính bị vô hiệu hóa trước khi gửi biểu mẫu.

    $('form').submit(function () {
        $("#Id_Unidade").attr("disabled", false);
    });

1
<select id="case_reason" name="case_reason" disabled="disabled">

disabled="disabled" ->sẽ nhận được giá trị của bạn từ cơ sở dữ liệu dan hiển thị nó trong mẫu. readonly="readonly" ->bạn có thể thay đổi giá trị của mình trong selectbox, nhưng giá trị của bạn không thể lưu trong cơ sở dữ liệu của bạn.


sai rồi, nó đã được cứu Có vẻ như thuộc tính 'chỉ đọc' không được xử lý bởi tất cả các trình duyệt và do đó không đáng tin cậy.
richey

0

Nếu danh sách thả xuống được chọn chỉ đọc từ khi sinh ra và hoàn toàn không cần thay đổi, có lẽ bạn nên sử dụng một điều khiển khác thay thế? Giống như một trường đơn giản <div>(cộng với trường mẫu ẩn) hoặc an <input type="text">?

Đã thêm: Nếu danh sách thả xuống không chỉ đọc mọi lúc và JavaScript được sử dụng để bật / tắt nó, thì đây vẫn là một giải pháp - chỉ cần sửa đổi DOM khi đang di chuyển.


Nó không chỉ đọc từ đầu. Tôi sử dụng JavaScript để thay đổi và cập nhật. Nếu một danh sách thả xuống trước đó có một giá trị nhất định, thì giá trị này sẽ trở thành chỉ đọc.
Jrgns

Sau đó, có lẽ bạn có thể thay thế thả xuống này bằng một hộp văn bản đang hoạt động?
Vilx-

Yup, nhưng theo tôi, đầu vào ẩn luôn thanh lịch hơn theo quan điểm của tôi
Jrgns

0

Dưới đây làm việc cho tôi:

$('select[name=country]').attr("disabled", "disabled"); 

11
FYI: Trường mẫu bị vô hiệu hóa sẽ không được đưa vào trình.
mz_01

0

Tôi đã quản lý nó bằng cách ẩn hộp chọn và hiển thị spanvị trí của nó chỉ với giá trị thông tin. Trong trường hợp vô hiệu hóa .readonlylớp, chúng ta cũng cần loại bỏ các .toVanishphần tử và hiển thị các phần tử .toShow.

 $( '.readonly' ).live( 'focus', function(e) {
                $( this ).attr( 'readonly', 'readonly' )
                if( $( this ).get(0).tagName == 'SELECT' ) {
                    $( this ).before( '<span class="toVanish readonly" style="border:1px solid; padding:5px">' 
                            + $( this ).find( 'option:selected' ).html() + '</span>' )
                    $( this ).addClass( 'toShow' )
                    $( this ).hide()
            }
    });

0

Trong IE tôi đã có thể đánh bại cách tiếp cận onf Focus => onblur bằng cách nhấp đúp. Nhưng ghi nhớ giá trị và sau đó khôi phục nó trong sự kiện onchange dường như xử lý vấn đề đó.

<select onfocus="this.oldvalue=this.value;this.blur();" onchange="this.value=this.oldvalue;">
....
</select>

Bạn có thể làm tương tự mà không cần thuộc tính mở rộng bằng cách sử dụng biến javascript.


0

Đây là một nỗ lực để sử dụng một chức năng jQuery tùy chỉnh để đạt được chức năng (như được đề cập ở đây):

$(function(){

 $.prototype.toggleDisable = function(flag) {
    // prepare some values
    var selectId = $(this).attr('id');
    var hiddenId = selectId + 'hidden';
    if (flag) {
      // disable the select - however this will not submit the value of the select
      // a new hidden form element will be created below to compensate for the 
      // non-submitted select value 
      $(this).attr('disabled', true);

      // gather attributes
      var selectVal = $(this).val();
      var selectName = $(this).attr('name');

      // creates a hidden form element to submit the value of the disabled select
      $(this).parents('form').append($('<input></input>').
        attr('type', 'hidden').
        attr('id', hiddenId).
        attr('name', selectName).
        val(selectVal) );
    } else {
      // remove the newly-created hidden form element
      $(this).parents('form').remove(hiddenId);
      // enable back the element
      $(this).removeAttr('disabled');
    }
  }

  // Usage
  // $('#some_select_element').toggleDisable(true);
  // $('#some_select_element').toggleDisable(false);

});
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.