Formulir HTML hanya dibaca tag / input SELECT

588

Menurut spesifikasi HTML, selecttag dalam HTML tidak memiliki readonlyatribut, hanya disabledatribut. Jadi jika Anda ingin mencegah pengguna mengubah dropdown, Anda harus menggunakannya disabled.

Satu-satunya masalah adalah bahwa input formulir HTML yang dinonaktifkan tidak dimasukkan dalam data POST / GET.

Apa cara terbaik untuk meniru readonlyatribut untuk sebuah selecttag, dan masih mendapatkan data POST?

Jrgns
sumber
5
Jangan mengandalkan itu untuk sisi server. Siapa saja dapat membuat halaman HTML mereka sendiri dan membuatnya menjadi RW.
Brendan Byrd
11
Tapi itu bukan pertanyaan khusus PHP.
Kaleb Brasee
4
Saya sarankan tidak menggunakan elemen pilih sama sekali dalam hal ini. Apakah ada alasan Anda tidak bisa hanya menampilkan nilai sebagai teks biasa?
Big McLargeHuge
2
@pumkin komentar Anda tidak masuk akal. Saya tidak mengatakan tidak pernah ada kasus penggunaan yang baik untuk bidang formulir pilih atau tersembunyi. OP mengalami kesulitan menampilkan beberapa teks pada halaman, dan saya hanya ingin tahu apa tujuannya menggunakan elemen pilih dalam kasus ini.
Big McLargeHuge
2
Saya pasti membaca pertanyaan yang salah. Ia mengatakan ingin menonaktifkan pilihan agar pengguna tidak mengubahnya. Mungkin dia perlu merender halaman dengan memilih dan menggunakan jquery untuk mencegah perubahan. Tetapi ketika dia mengirimkannya kembali, tidak ada data untuk itu. Saya melakukan hal yang sama. Saya perlu menampilkan pilihan yang difilter oleh pilihan lain dan drop down terakhir menyimpan ke DB melalui ajax sehingga semua yang sebelumnya harus dikunci. Ketika saya membuat ulang halaman, ya, OK - saya bisa menampilkan label daripada memilih. Tapi bukan itu masalahnya :)
Piotr Kula

Jawaban:

461

Anda harus menjaga selectelemen disabledtetapi juga menambahkan elemen lain yang tersembunyi inputdengan nama dan nilai yang sama.

Jika Anda mengaktifkan kembali SELECT Anda, Anda harus menyalin nilainya ke input tersembunyi di acara pertukaran dan menonaktifkan (atau menghapus) input tersembunyi.

Ini 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>

bezmax
sumber
5
Jika Anda mengaktifkan kembali pilihan, Anda juga harus menonaktifkan atau menghapus input tersembunyi (setelah menyalin nilainya seperti yang dijelaskan). Kalau tidak, Anda akan mendapatkan nilai yang diajukan dua kali lipat
Adam
1
@max Ah !. Ok, itu juga berfungsi. Saya berasumsi sejak Anda mengatakan bahwa input tersembunyi harus memiliki "nama yang sama" yang dipilih oleh nama.
Adam
2
Bagaimana jika saya menggunakan beberapa pilihan?
Anyul Rivas
2
Memiliki dua elemen dengan nama yang sama hanya akan memposting kembali input yang diaktifkan / dipilih, bukan ganda. Selain itu, hanya selectednilai yang dikirim kembali bukan seluruh daftar. Jadi, Anda hiddenduduk di depan selectdan memegang nilai yang dipilih. Jika pilih dinonaktifkan karena "hanya baca", kiriman kembali hanya akan berisi nilai input tersembunyi. Jika pilih diaktifkan, opsi yang terlihat terlihat akan "lebih dari menulis / mengganti" nilai tersembunyi, dan itu adalah nilai yang akan diposting kembali.
Piotr Kula
29
Meskipun ini adalah solusi yang jelas, ini menyebalkan sebagai solusi, karena Anda harus menambahkan bidang input lain.
Donato
189

Kita juga bisa menggunakan ini

Nonaktifkan semua kecuali opsi yang dipilih:

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

Dengan cara ini dropdown masih berfungsi (dan mengirimkan nilainya) tetapi pengguna tidak dapat memilih nilai lain.

Demo

vimal1083
sumber
3
Pilihan bagus untuk opsi dinamis
Diego Favero
11
Sempurna untuk tag SELECT bernilai tunggal! Tetapi tidak akan berfungsi untuk <select multiple>, yang masih akan memungkinkan pengguna untuk membatalkan pilihan beberapa opsi yang dipilih, sehingga mengubah nilainya.
Mikhail Bunkin
2
Dukungan browser untuk atribut optiontagdisabled
Jo.
4
Ini solusi hebat. Saya akan menambahkan bahwa Anda dapat mencapainya dengan mudah dengan jQuery seperti ini: $("#yourSelectId option:not(:selected)).attr("disabled", "disabled")
Onkel-j
105

Anda dapat mengaktifkan kembali objek yang dipilih saat mengirim.

EDIT : yaitu, biasanya menonaktifkan tag pilih (dengan atribut yang dinonaktifkan) dan kemudian mengaktifkannya kembali secara otomatis sebelum mengirimkan formulir:

Contoh dengan jQuery:

  • Untuk menonaktifkannya:

    $('#yourSelect').prop('disabled', true);
  • Untuk mengaktifkannya kembali sebelum pengiriman sehingga GET / POST data disertakan:

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

Selain itu, Anda dapat mengaktifkan kembali setiap input yang dinonaktifkan atau memilih:

$('#yourForm').on('submit', function() {
    $('input, select').prop('disabled', false);
});
kemiller2002
sumber
4
gunakan .prop ('dinonaktifkan', benar / salah) untuk mengatur properti yang dinonaktifkan. Atribut tidak akan mengubah keadaan sebenarnya.
Paris Char
Saya pikir solusi ini lebih pintar daripada solusi @bezmax . Karena jika kita menambahkan input tersembunyi, kita harus mempertimbangkan bahwa hanya satu dari setiap input (nama yang sama) yang diaktifkan setiap saat. Sebaliknya, jika kedua input diaktifkan, di sisi server, program akan mengambil array input yang dapat menyebabkan pengecualian (misalnya jika kami tidak menangani situasi ini, dan kami mengharapkan satu string dan menggunakan 'Request.Form [FieldName] 'command)
MiT
@ Kevin, bekerja> 90% kasus. Juga, Anda harus memiliki jquery di ikat pinggang Anda ... Eh.
sitilge
Ini jauh lebih bersih dari jawaban yang diterima. Lebih mudah untuk membatalkan logika jika Anda tidak ingin elemen dinonaktifkan lagi dan tidak ada tag input tambahan.
Haohmaru
51

Cara lain untuk melakukan readOnlyatribut ke suatu selectelemen adalah dengan menggunakancss

Anda bisa melakukan seperti:

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

DEMO

Yaje
sumber
8
Solusi yang bagus. Tapi Anda masih bisa mengubah nilainya dengan keyboard.
Mario Werner
1
Ya ini cukup luar biasa. Untuk mengubah nilai dengan keyboard, Anda harus TAB ke elemen dan itu menjadi dipilih kemudian. Jika Anda membuat warna latar belakang menjadi abu-abu atau dinonaktifkan, Anda juga secara visual memberi tahu pengguna bahwa ini "dinonaktifkan" padahal sebenarnya tidak dinonaktifkan. Tidak ada yang mendukung IE lagi yang peduli. Anda juga dapat menempatkan keydown prevent default jika Anda ingin mencegah.
Piotr Kula
Cukup tidak lazim !! Jika yang dipilih perlu diblokir dari ... .on('mouseover', function(){ ... });
pembuatan
pointer-events: nonemencegah fokus dari kursor mouse. Untuk juga mencegah fokus dari keyboard, Anda dapat menambahkannya dengan mengaburkan segera pada semua acara fokus:$('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>

Diuji dan bekerja di IE 6, 7 & 8b2, Firefox 2 & 3, Opera 9.62, Safari 3.2.1 untuk Windows dan Google Chrome.

Grant Wagner
sumber
15
Masalah dengan ini adalah dropdown ditampilkan seolah-olah tidak dibaca. Pengguna akan berpikir hal itu tidak berfungsi ...
Lukas Eder
8
Ini membingungkan bagi pengguna karena mereka masih bisa memilih opsi, tetapi ketika mereka memilihnya, daftar berubah kembali ke nilai yang dipilih sebelumnya. Jauh lebih intuitif untuk menonaktifkan daftar untuk mencegah pengguna memilih apa pun.
dana
11
Saya memiliki masalah yang sama dan menyelesaikannya hanya menampilkan opsi yang dipilih. Tidak perlu JS, lebih sedikit kebingungan untuk pengguna ... <select id="countries"> <option value="7" selected="selected">Country7</option> </select>
Potherca
1
@ppumkin @dana @LukasEder Tidak .. tidak jika Anda dapat memperbaiki UX ini. Misalnya, Anda dapat melakukan sesuatu seperti onchange = 'this.selectedIndex=this.defaultIndex; alert("You should not change this..");'bukan hanya mengubah indeks yang dipilih secara diam-diam ..
Fr0zenFyr
1
@LukasEder Bagi siapa pun yang curiga dengan pengalaman responden, mereka dapat menambahkan beberapa CSS untuk benar-benar menekankan bahwa drop-down tidak boleh diubah. Atur kursor ke not-alloweddan warna latar belakang menjadi #CCC.
Alexander Dixon
36

Solusi jQuery sederhana

Gunakan ini jika pilihan Anda memiliki readonlykelas

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

Atau ini jika pilihan Anda memiliki readonly="readonly"atribut

$('select[readonly="readonly"] option:not(:selected)').attr('disabled',true);
Perangkat Lunak Black Brick
sumber
7
Tolong jelaskan sedikit kode Anda. Apakah kita harus menambahkan kelas 'readonly' ke elemen terpilih? Kapan kita harus memanggil kode ini: hanya di dokumen. Sudah atau setiap kali pilih diaktifkan / dinonaktifkan? Apakah kode sandi Anda aman?
anar khalilov
$(document).ready(function(){$('select option:not(:selected)').attr('disabled',true);});berfungsi dengan baik pada satu pilih. Tidak diperlukan kelas "hanya baca". Pilihan ganda bermasalah karena jika ada lebih dari satu opsi yang sudah dipilih sehingga tidak dinonaktifkan dan pengguna memilih salah satu opsi yang tidak dinonaktifkan, opsi yang sebelumnya dipilih lainnya menjadi tidak dipilih.
gordon
tidak mengerti semua ini.
Piotr Kula
Ini menonaktifkan opsi selain yang dipilih untuk kotak pilih dengan kelas "readonly". Jika Anda memiliki elemen pilih di tangan Anda dapat menulis:$select.find('option').not(':selected').attr('disabled', 'disabled');
Semra
1
Saya suka solusi ini. Saya akan mengubah pemilih select[readonly]sehingga Anda hanya menambahkan atribut readonly ke elemen - dengan cara ini Anda tidak harus memperlakukan pemilih secara berbeda dari jenis lainnya. Javascript kemudian semakin meningkatkan efeknya. Perlu diingat bahwa solusi ini (dan sebagian besar yang lain) hanya membantu agen pengguna memberikan pengalaman pengguna terbaik - itu sebenarnya tidak menegakkan apa pun (yang harus dilakukan di sisi server jika diperlukan).
jgivoni
21

Solusi CSS sederhana:

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

select[readonly] option{
    display:none;
}

Ini menghasilkan Pilih menjadi abu-abu dengan kursor "nonaktifkan" yang bagus saat di arahkan
dan pilih daftar opsi "kosong" sehingga Anda tidak dapat mengubah nilainya.

d.raev
sumber
1
Jika Anda memiliki validasi CSRF (seperti di symfony dan banyak kerangka kerja lainnya), itu tidak akan berfungsi.
ThEBiShOp
11

Ini adalah solusi terbaik yang saya temukan:

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

Kode di atas menonaktifkan semua opsi lain yang tidak dipilih sambil tetap mengaktifkan opsi yang dipilih. Dengan melakukan itu, opsi yang dipilih akan membuatnya menjadi data post-back.

Leniel Maccaferri
sumber
11

Saya tahu ini sudah sangat terlambat, tetapi dapat dilakukan dengan CSS sederhana:

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

Gaya menyembunyikan semua opsi dan grup saat pilih readonly keadaan, sehingga pengguna tidak dapat mengubah pilihannya.

Tidak diperlukan retasan JavaScript.

nrofis
sumber
Bagus dan sederhana. Saya suka itu.
Jonathan Parent Lévesque
Ini adalah solusi yang sangat bagus untuk masalah ini. Terima kasih!
OderWat
10

Masih lebih mudah: tambahkan atribut style ke tag pilihan Anda :

style="pointer-events: none;"
chakraborty mainak
sumber
Ini berfungsi untuk saya tetapi acara pointer akan membuat dukungan lintas browser?
Abhijit Jagtap
3
Tidak akan berhasil. Pengguna dapat mengubah input menggunakan keyboard.
Sandhu
6

Ini adalah solusi paling sederhana dan terbaik. Anda akan menetapkan attr readolny pada pilih Anda, atau attr lain seperti data-readonly, dan melakukan hal berikut

$("select[readonly]").live("focus mousedown mouseup click",function(e){
    e.preventDefault();
    e.stopPropagation();
});
Guilherme Ferreira
sumber
1
Anda harus menambahkan keyup iklan keydown di sini dan juga dropdown masih tersedia dengan "tab" ke dalamnya dan gunakan tombol panah untuk mengubah nilai.
apfz
5

Tetapkan pilih yang dinonaktifkan ketika Anda berencana untuk hanya-baca dan kemudian hapus atribut yang dinonaktifkan sebelum mengirimkan formulir.

// 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
Craig Ambrose
sumber
Kedengarannya seperti kondisi balapan yang menunggu untuk terjadi.
Brendan Byrd
5

Selain menonaktifkan opsi yang seharusnya tidak dapat dipilih, saya ingin benar-benar membuatnya menghilang dari daftar, tetapi masih dapat mengaktifkannya jika saya perlu nanti:

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

Ini menemukan semua elemen terpilih dengan atribut readonly, kemudian menemukan semua opsi di dalam pilihan yang tidak dipilih, lalu menyembunyikannya dan menonaktifkannya.

Penting untuk memisahkan kueri jquery dalam 2 untuk alasan kinerja, karena jquery membacanya dari kanan ke kiri, kode:

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

pertama-tama akan menemukan semua opsi yang tidak dipilih dalam dokumen dan kemudian menyaring yang ada di dalam memilih dengan atribut readonly.

cernunnos
sumber
Mungkin .prop("disabled", true)sebaliknya
sam
4

Satu pendekatan sisi server yang sederhana adalah menghapus semua opsi kecuali yang ingin Anda pilih. Jadi, dalam Zend Framework 1.12, jika $ element adalah Zend_Form_Element_Select:

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

Jika Anda menonaktifkan bidang formulir, ini tidak akan dikirim ketika formulir dikirimkan. Jadi jika Anda membutuhkan readonlyyang berfungsi sepertidisabled tetapi mengirim nilai lakukan ini:

Setelah perubahan apa pun pada properti hanya baca dari suatu elemen.

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

$('select:not([readonly]) option').removeAttr('disabled');
Joaquim Perez
sumber
4

Solusi dengan tabindex. Bekerja dengan input teks terpilih tetapi juga.

Cukup gunakan kelas .disabled.

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" />

Sunting: Dengan Internet Explorer, Anda juga memerlukan JS ini:

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

Sebagai lanjutan dari saran Grant Wagners; di sini adalah snippet jQuery yang melakukannya dengan fungsi handler alih-alih atribut onXXX langsung:

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

};
tukang itu
sumber
2

Saya mengatasinya dengan jquery:

      $("select.myselect").bind("focus", function(){
        if($(this).hasClass('readonly'))
        {
          $(this).blur();   
          return;
        }
      });
memiliki sendiri
sumber
Ini bekerja dengan sangat baik, meskipun animasi mouseover masih akan menampilkan panah dropdown yang terlihat dapat diklik.
Johncl
Ini tidak berfungsi untuk saya di Chrome 26: pilih masih berfungsi penuh.
Andy
Tetapi masih muncul daftar ketika Anda mengklik dua kali pada IE. Lagi pula untuk mencegahnya?
user1995781
2

Jika Anda menggunakan validasi jquery, Anda dapat melakukan hal berikut di bawah ini, saya menggunakan atribut yang dinonaktifkan tanpa masalah:

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

Apa yang saya temukan berfungsi dengan baik, dengan javascript biasa (yaitu: tidak diperlukan pustaka JQuery), adalah mengubah innerHTML dari <select>tag ke nilai tersisa yang diinginkan.

Sebelum:

<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>

Contoh Javascript:

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

Setelah:

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

Dengan cara ini, tidak ada perubahan efek visual, dan ini akan POST / GET dalam <FORM>.

Syd
sumber
1

Daripada memilih itu sendiri, Anda dapat menonaktifkan semua opsi kecuali untuk opsi yang saat ini dipilih. Ini memberikan tampilan drop-down yang berfungsi, tetapi hanya opsi yang ingin Anda sampaikan merupakan pilihan yang valid.

Adam Bellaire
sumber
3
Secara teori ide yang bagus - tetapi tidak ada dukungan untuk opsi yang dinonaktifkan di IE sebelum IE8. tinyurl.com/yle4bto
scunliffe
1

solusi html:

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

yang javascript:

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

untuk menghapus:

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

edit: menambahkan metode hapus

Kadmillos
sumber
@ButtleButkus apakah javascript berfungsi? Saya kira itu bisa menjadi masalah terkait browser. Apakah Anda mencoba menambahkan tabindex ke elemen
Kadmillos
1

Cukup, hapus atribut yang dinonaktifkan sebelum mengirimkan formulir.

    $('form').submit(function () {
        $("#Id_Unidade").attr("disabled", false);
    });
Wendell Carvalho
sumber
1
<select id="case_reason" name="case_reason" disabled="disabled">

disabled="disabled" ->akan mendapatkan nilai Anda dari database dan menunjukkannya di formulir. readonly="readonly" ->Anda dapat mengubah nilai Anda di kotak pilih, tetapi nilai Anda tidak bisa disimpan dalam database Anda.

Afwan Zikri
sumber
salah, ini disimpan. Sepertinya properti 'readonly' tidak diproses oleh semua browser dan karenanya tidak dapat diandalkan.
richey
0

Jika dropdown pilih hanya-baca sejak lahir dan tidak perlu diubah sama sekali, mungkin Anda harus menggunakan kontrol lain? Seperti <div>bidang formulir sederhana (plus bidang tersembunyi) atau <input type="text">?

Ditambahkan: Jika dropdown tidak hanya-baca sepanjang waktu dan JavaScript digunakan untuk mengaktifkan / menonaktifkannya, maka ini masih merupakan solusi - cukup modifikasi DOM sambil jalan.

Vilx-
sumber
Ini tidak hanya dibaca dari awal. Saya menggunakan JavaScript untuk mengubah dan memperbarui. Jika dropdown sebelumnya memiliki nilai tertentu, yang ini hanya bisa dibaca.
Jrgns
Maka mungkin Anda bisa mengganti dropdown ini dengan kotak teks on-the-fly?
Vilx-
Yup, tetapi input tersembunyi yang selalu ada lebih elegan menurut saya
Jrgns
0

Di bawah ini bekerja untuk saya:

$('select[name=country]').attr("disabled", "disabled"); 
john
sumber
11
FYI: Bidang formulir yang dinonaktifkan tidak akan disertakan dalam pengiriman.
mz_01
0

Saya mengelolanya dengan menyembunyikan kotak pilih dan menunjukkan spandi tempatnya dengan hanya nilai informasi. Pada saat menonaktifkan .readonlykelas, kita juga perlu menghapus .toVanishelemen - elemen dan menunjukkannya .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()
            }
    });
fiatjaf
sumber
0

Di IE saya bisa mengalahkan pendekatan onfocus => onblur dengan mengklik ganda. Tetapi mengingat nilainya dan mengembalikannya di acara pertukaran tampaknya menangani masalah itu.

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

Anda dapat melakukan hal serupa tanpa memperluas properti dengan menggunakan variabel javascript.

Sojourneer
sumber
0

Berikut adalah upaya untuk menggunakan fungsi jQuery khusus untuk mencapai fungsionalitas (seperti yang disebutkan di sini):

$(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);

});
tamersalama
sumber