Bagaimana cara membuat dropdown readonly menggunakan jquery?

93

Saya menggunakan pernyataan berikut untuk membuatnya menjadi hanya baca tetapi tidak berfungsi.

$('#cf_1268591').attr("readonly", "readonly"); 

Saya tidak ingin menonaktifkannya, saya ingin membuatnya hanya untuk dibaca.

Karim Ali
sumber
4
Apa perbedaan antara dropdown readonly dan dropdown standar?
Leo
Apakah ini benar-benar masalah jQuery? Atau mungkin dropdown tidak berfungsi dengan atribut readonly?
Ilia G
Kanishka Panamaldeniya sudah memberi Anda jawaban yang benar (harus membuatnya sebagai jawaban, bukan komentar).
qbantek
2
Dropdown tidak selalu hanya bisa dibaca. Hanya baca berarti Anda dapat melihat nilainya tetapi tidak dapat mengubahnya.
Suncat2000

Jawaban:

185
$('#cf_1268591').attr("disabled", true); 

drop down selalu hanya untuk dibaca. yang dapat Anda lakukan adalah membuatnya dinonaktifkan

jika Anda bekerja dengan formulir, bidang yang dinonaktifkan tidak terkirim, jadi gunakan bidang tersembunyi untuk menyimpan nilai tarik-turun yang dinonaktifkan

Kanishka Panamaldeniya
sumber
28
Membuat dropdown dinonaktifkan tidak dikirim. Saya akan mencoba solusi Anda.
Karim Ali
3
Satu masalah dengan menonaktifkan pilih (drop-down) adalah bahwa fokus hilang di beberapa browser (misalnya IE9). Ini bisa menjadi masalah jika elemen pilih dinonaktifkan saat panggilan ajax diproses, misalnya, karena posisi pengguna di formulir hilang.
Chris
1
Terima kasih atas saran Anda. Hanya sebuah pertanyaan; bagaimana cara menyimpan nilai drop-down di bidang tersembunyi? Apakah Anda memiliki beberapa contoh kode untuk itu?
kramer65
2
"Solusi" lainnya adalah mengaktifkan bidang tersebut sebelum pengiriman formulir. Atau dalam kasus saya di mana saya mengirim data dalam format JSON (aktifkan, dapatkan data, nonaktifkan lagi): var disabled = $ (yourform) .find (': input: disabled'). RemoveAttr ('disabled'); var data = getFormJSONData ($ (yourform)); disabled.attr ('disabled', 'disabled');
KDT
4
Anda harus menggunakan prop()sekarang.
alex
146

Saya memiliki masalah yang sama, solusi saya adalah menonaktifkan semua opsi yang tidak dipilih. Sangat mudah dengan jQuery:

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

Edit => Jika Anda memiliki beberapa dropdown pada halaman yang sama, nonaktifkan semua opsi yang tidak dipilih pada pilih-ID seperti di bawah ini.

$('#select_field_id option:not(:selected)').attr('disabled', true);
Bertrand D.
sumber
27
Ide yang hebat! Untuk menggunakan praktik terbaik dengan versi jQuery saat ini, saya akan menggunakan metode prop untuk menyetel nilai yang dinonaktifkan. yaitu$('option:not(:selected)').prop('disabled', true);
Chris O'Connell
Ini adalah solusi yang sangat jenaka!
Jacques
1
IYA! ide yang hebat.
Eric
1
Ini harus menjadi jawaban n ° 1.
Erwan Clügairtz
23

Inilah yang Anda cari:

$('#cf_1268591').attr("style", "pointer-events: none;");

Bekerja seperti pesona.

mainak chakraborty
sumber
2
Jawaban yang bagus tetapi berhati-hatilah karena ini masih memungkinkan pemilihan untuk di tab. Anda juga perlu menyeteltabindex="-1"
uesports135
Hebat, saya butuh ini, karena cacat tidak dipetakan ke model terima kasih atas jawaban Anda.
sina_Islam
22

Coba yang ini .. tanpa menonaktifkan nilai yang dipilih ..

$('#cf_1268591 option:not(:selected)').prop('disabled', true);

Ini bekerja untuk saya ..

Prabhagaran
sumber
1
Sejalan dengan jawaban Anda, saya menghapus opsi lain $ ('# cf_1268591 opsi: tidak (: dipilih)'). Remove ();
Seth Winters
13

Saya akan membuat lapangan dinonaktifkan. Kemudian, saat formulir dikirim, buat agar tidak dinonaktifkan. Menurut saya, ini lebih mudah daripada harus berurusan dengan bidang yang tersembunyi.

//disable the field
$("#myFieldID").prop( "disabled", true );           

//right before the form submits, we re-enable the fields, to make them submit.
$( "#myFormID" ).submit(function( event ) {
    $("#myFieldID").prop( "disabled", false );
});     
NL3294
sumber
13

Menyetel elemen dengan disabledtidak akan mengirimkan data, namun selectelemen tidak memiliki readonly.

Anda dapat mensimulasikan readonlytentang selectpenggunaan CSS untuk penataan dan JS untuk mencegah perubahan dengan tab:

select[readonly] {
  background: #eee;
  pointer-events: none;
  touch-action: none;
}

Kemudian gunakan seperti:

var readonly_select = $('select');
$(readonly_select).attr('readonly', true).attr('data-original-value', $(readonly_select).val()).on('change', function(i) {
    $(i.target).val($(this).attr('data-original-value'));
});

Hasil:

Lucas Bustamante
sumber
2
Pendekatan yang sangat keren, tetapi pengguna masih dapat menggunakan TAB pada keyboard untuk memilih nilai.
Ricardo Martins
1
@RicardoMartins terima kasih, memperbarui jawaban untuk mencegah perubahan dengan TAB
Lucas Bustamante
8

Jquery sederhana untuk menghapus opsi yang tidak dipilih.

$('#your_dropdown_id option:not(:selected)').remove();
abhi chavda
sumber
Juga solusi saya. Lebih baik daripada membuatnya menjadi cacat.
Gianluca Demarinis
6

Untuk menyederhanakan, berikut adalah plugin jQuery yang melakukannya tanpa kerumitan: https://github.com/haggen/readonly

Arthur Corenzan
sumber
Potongan kode (kecil) yang bagus, terima kasih. Ini menonaktifkan tarik-turun sehingga tidak dapat diubah tetapi masih memungkinkan nilai-nilainya untuk dikirim. Sangat berguna.
Alex Hopkins
3

Baris ini membuat pemilihan dengan readonlyatribut hanya-baca:

$('select[readonly=readonly] option:not(:selected)').prop('disabled', true);
admirhodzic
sumber
2

Kode ini pertama-tama akan menyimpan pilihan asli di setiap dropdown. Kemudian jika pengguna mengubah pilihan itu akan mengatur ulang dropdown ke pilihan aslinya.

http://jsfiddle.net/4aHcD/22/

//store the original selection
$("select :selected").each(function(){
    $(this).parent().data("default", this);
});

//change the selction back to the original
$("select").change(function(e) {
    $($(this).data("default")).prop("selected", true);
});
Homer
sumber
2

Opsi termudah bagi saya adalah membuat pilih sebagai hanya-baca dan menambahkan:

onmousedown="return false" onkeydown="return false"

Anda tidak perlu menulis logika tambahan apa pun. Tidak ada masukan tersembunyi atau dinonaktifkan dan kemudian diaktifkan kembali saat pengiriman formulir.

Awais Tariq
sumber
1

Ini adalah artikel lama, tetapi saya ingin memperingatkan orang-orang yang akan menemukannya. Hati-hati dengan atribut yang dinonaktifkan dengan elemen yang didapat dengan nama. Aneh tapi sepertinya tidak terlalu berhasil.

ini tidak berhasil:

<script language="JavaScript">
function onChangeFullpageCheckbox() {    
$('name=img_size').attr("disabled",$("#fullpage").attr("checked"));
</script>

pekerjaan ini:

<script language="JavaScript">
function onChangeFullpageCheckbox() {    
$('#img_size').attr("disabled",$("#fullpage").attr("checked"));
</script>

Ya, saya tahu bahwa sebaiknya saya menggunakan prop dan bukan attr, tetapi setidaknya sekarang prop tidak akan berfungsi karena versi lama jquery, dan sekarang saya tidak bisa memperbaruinya, jangan tanya kenapa ... perbedaan html hanya ditambahkan id:. ..

<select name="img_size" class="dropDown" id="img_size">
<option value="200">200px
</option><option value="300">300px
</option><option value="400">400px
</option><option value="500">500px
</option><option value="600" selected="">600px
</option><option value="800">800px
</option><option value="900">900px
</option><option value="1024">1024px
</option></select>

<input type="checkbox" name="fullpage" id="fullpage" onChange="onChangeFullpageCheckbox()" />

...

Saya belum menemukan kesalahan pada skrip, dan pada versi dengan nama, tidak ada kesalahan pada konsol. Tapi tentu saja itu bisa jadi kesalahan saya dalam kode

Terlihat di: Chrome 26 di Win 7 Pro

Maaf untuk tata bahasa yang buruk.

Andrej
sumber
1

Saya telah menemukan, cara yang lebih baik untuk melakukan ini adalah dengan menggunakan CSS untuk menghapus pointer-event dan mengubah opacity pada drop down (coba 0.5). Ini memberi kesan kepada pengguna bahwa itu dinonaktifkan seperti biasa, tetapi masih memposting data.

Memang ini memiliki beberapa masalah dengan kompatibilitas ke belakang, tetapi menurut saya merupakan pilihan yang lebih baik daripada mengatasi masalah nonaktif / hanya baca yang mengganggu.

pengguna3427526
sumber
Bisakah Anda menguraikan tentang CSS yang diperlukan untuk melakukan ini?
Cocowalla
1

Anda juga dapat menonaktifkannya dan pada saat Anda membuat panggilan kirim, aktifkan. Saya pikir adalah cara termudah :)

Hictus
sumber
1

Ini bekerja dengan sangat baik

$('#cf_1268591 option:not(:selected)').prop('disabled', true);

Dengan ini saya dapat melihat opsi tetapi saya tidak dapat memilihnya

Ricardo Mendes
sumber
0

Tidak ada yang namanya drop-down hanya baca. Yang dapat Anda lakukan adalah menyetel ulang ke nilai pertama secara manual setelah setiap perubahan.

$("select").change(function(event) {
    $(this).val($(this).find("option").first().val());
});

http://jsfiddle.net/4aHcD/

Alex Turpin
sumber
3
tidak baik jika opsi yang dipilih saat ini bukan yang pertama dalam daftar seperti dalam contoh ini: jsfiddle.net/4aHcD/19
Homer
@Homer, kode ini dimaksudkan untuk mengatur ulang setelah ada perubahan, dan berfungsi dalam efek itu. Jika Anda ingin menjalankannya pada awalnya alih-alih mengubah sendiri nilai awal karena alasan tertentu, Anda selalu dapat memanggil peristiwa perubahan pada elemen Anda setelah mendeklarasikan acara, menggunakan $("select").change(), seperti jsfiddle.net/4aHcD/20
Alex Turpin
2
ketika halaman pertama kali dimuat, jika item ketiga dipilih dan pengguna mencoba mengubahnya ke item kedua, kode Anda mengubah pilihan ke item pertama. Saya tidak berpikir itu seharusnya tidak melakukan itu. Berikut adalah contoh dari apa yang menurut saya diinginkan OP, dropdown yang tidak akan mengubah nilai yang dipilih berdasarkan interaksi pengguna: jsfiddle.net/4aHcD/22
Homer
Apa yang saya butuhkan dan apa yang diminta OP adalah cara membuatnya menjadi hanya-baca. Itu berarti Anda dapat melihat nilai atau nilai yang dipilih tetapi tidak dapat mengubahnya. Artinya, tampilan meniru tampilan kontrol yang dapat diedit tanpa dapat mengeditnya.
Suncat2000
0

Cobalah untuk membuat string kosong saat "menekan tombol"

Htmlnya adalah:

<input id="cf_1268591" style="width:60px;line-height:16px;border:1px solid #ccc">

Jquery adalah:

$("#cf_1268591").combobox({
  url:"your url",
  valueField:"id",
  textField:"text",
  panelWidth: "350",
  panelHeight: "200",
});

// buat setelah keyup dengan string kosong

var tb = $("#cf_1268591").combobox("textbox");
  tb.bind("keyup",function(e){
  this.value = "";
});
Hendro
sumber
0

Mungkin Anda bisa mencoba cara ini

function myFunction()
{
   $("select[id^=myID]").attr("disabled", true);
   var txtSelect = $("select[id^=myID] option[selected]").text();
}

Ini menetapkan nilai pertama dari drop-down sebagai default dan tampaknya hanya untuk dibaca

Monicalh
sumber
0

html5 mendukung:

`
     $("#cCity").attr("disabled", "disabled"); 
     $("#cCity").addClass('not-allow');

`

Atul Kumar
sumber
0

Berikut adalah sedikit variasi dari jawaban lain yang menyarankan penggunaan orang cacat. Karena atribut "disabled" sebenarnya dapat memiliki nilai apa pun dan tetap menonaktifkan, Anda dapat menyetelnya ke readonly, seperti disabled = "readonly". Ini akan menonaktifkan kontrol seperti biasa, dan juga akan memungkinkan Anda untuk dengan mudah menatanya secara berbeda dari kontrol yang dinonaktifkan biasa, dengan CSS seperti:

select[disabled=readonly] {
    .... styles you like for read-only
}

Jika Anda ingin data dimasukkan, kirim, gunakan bidang tersembunyi atau aktifkan sebelum mengirim, seperti yang dijelaskan di jawaban lain.

DaveInMaine
sumber
0

Seperti yang dikatakan @Kanishka, jika kami menonaktifkan elemen formulir, itu tidak akan dikirimkan. Saya telah membuat cuplikan untuk masalah ini. Saat elemen pemilihan dinonaktifkan, ini membuat bidang input tersembunyi dan menyimpan nilainya. Jika diaktifkan, hapus field input tersembunyi yang dibuat.

Info lebih lanjut

jQuery(document).ready(function($) {
  var $dropDown = $('#my-select'),
    name = $dropDown.prop('name'),
    $form = $dropDown.parent('form');

  $dropDown.data('original-name', name); //store the name in the data attribute 

  $('#toggle').on('click', function(event) {
    if ($dropDown.is('.disabled')) {
      //enable it 
      $form.find('input[type="hidden"][name=' + name + ']').remove(); // remove the hidden fields if any
      $dropDown.removeClass('disabled') //remove disable class 
        .prop({
          name: name,
          disabled: false
        }); //restore the name and enable 
    } else {
      //disable it 
      var $hiddenInput = $('<input/>', {
        type: 'hidden',
        name: name,
        value: $dropDown.val()
      });
      $form.append($hiddenInput); //append the hidden field with same name and value from the dropdown field 
      $dropDown.addClass('disabled') //disable class
        .prop({
          'name': name + "_1",
          disabled: true
        }); //change name and disbale 
    }
  });
});
/*Optional*/

select.disabled {
  color: graytext;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<form action="#" name="my-form">
  <select id="my-select" name="alpha">
    <option value="A">A</option>
    <option value="B">B</option>
    <option value="C">C</option>
  </select>
</form>
<br/>
<button id="toggle">toggle enable/disable</button>

Amiya
sumber