Menurut spesifikasi HTML, select
tag dalam HTML tidak memiliki readonly
atribut, hanya disabled
atribut. 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 readonly
atribut untuk sebuah select
tag, dan masih mendapatkan data POST?
javascript
html
Jrgns
sumber
sumber
Jawaban:
Anda harus menjaga
select
elemendisabled
tetapi juga menambahkan elemen lain yang tersembunyiinput
dengan 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:
sumber
selected
nilai yang dikirim kembali bukan seluruh daftar. Jadi, Andahidden
duduk di depanselect
dan 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.Kita juga bisa menggunakan ini
Nonaktifkan semua kecuali opsi yang dipilih:
Dengan cara ini dropdown masih berfungsi (dan mengirimkan nilainya) tetapi pengguna tidak dapat memilih nilai lain.
Demo
sumber
option
tagdisabled
$("#yourSelectId option:not(:selected)).attr("disabled", "disabled")
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:
Untuk mengaktifkannya kembali sebelum pengiriman sehingga GET / POST data disertakan:
Selain itu, Anda dapat mengaktifkan kembali setiap input yang dinonaktifkan atau memilih:
sumber
Cara lain untuk melakukan
readOnly
atribut ke suatuselect
elemen adalah dengan menggunakancss
Anda bisa melakukan seperti:
DEMO
sumber
... .on('mouseover', function(){ ... });
pointer-events: none
mencegah 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();});
Diuji dan bekerja di IE 6, 7 & 8b2, Firefox 2 & 3, Opera 9.62, Safari 3.2.1 untuk Windows dan Google Chrome.
sumber
<select id="countries"> <option value="7" selected="selected">Country7</option> </select>
onchange = 'this.selectedIndex=this.defaultIndex; alert("You should not change this..");'
bukan hanya mengubah indeks yang dipilih secara diam-diam ..not-allowed
dan warna latar belakang menjadi#CCC
.Solusi jQuery sederhana
Gunakan ini jika pilihan Anda memiliki
readonly
kelasAtau ini jika pilihan Anda memiliki
readonly="readonly"
atributsumber
$(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.$select.find('option').not(':selected').attr('disabled', 'disabled');
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).Solusi CSS sederhana:
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.
sumber
Namun pilihan lain yang lebih kontemporer (tidak ada permainan kata-kata) adalah untuk menonaktifkan semua opsi dari elemen pilih selain yang dipilih.
Namun perlu dicatat bahwa ini adalah fitur HTML 4.0 dan 6,7,8 beta 1 tampaknya tidak menghargai ini.
http://www.gtalbot.org/BrowserBugsSection/MSIE7Bugs/OptionDisabledSupport.html
sumber
Ini adalah solusi terbaik yang saya temukan:
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.
sumber
Saya tahu ini sudah sangat terlambat, tetapi dapat dilakukan dengan CSS sederhana:
Gaya menyembunyikan semua opsi dan grup saat pilih
readonly
keadaan, sehingga pengguna tidak dapat mengubah pilihannya.Tidak diperlukan retasan JavaScript.
sumber
Masih lebih mudah: tambahkan atribut style ke tag pilihan Anda :
sumber
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
sumber
Tetapkan pilih yang dinonaktifkan ketika Anda berencana untuk hanya-baca dan kemudian hapus atribut yang dinonaktifkan sebelum mengirimkan formulir.
sumber
Selain menonaktifkan opsi yang seharusnya tidak dapat dipilih, saya ingin benar-benar membuatnya menghilang dari daftar, tetapi masih dapat mengaktifkannya jika saya perlu nanti:
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:
pertama-tama akan menemukan semua opsi yang tidak dipilih dalam dokumen dan kemudian menyaring yang ada di dalam memilih dengan atribut readonly.
sumber
.prop("disabled", true)
sebaliknyaSatu 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:
sumber
Jika Anda menonaktifkan bidang formulir, ini tidak akan dikirim ketika formulir dikirimkan. Jadi jika Anda membutuhkan
readonly
yang berfungsi sepertidisabled
tetapi mengirim nilai lakukan ini:Setelah perubahan apa pun pada properti hanya baca dari suatu elemen.
sumber
Solusi dengan tabindex. Bekerja dengan input teks terpilih tetapi juga.
Cukup gunakan kelas .disabled.
CSS:
JS:
HTML:
Sunting: Dengan Internet Explorer, Anda juga memerlukan JS ini:
sumber
Sebagai lanjutan dari saran Grant Wagners; di sini adalah snippet jQuery yang melakukannya dengan fungsi handler alih-alih atribut onXXX langsung:
sumber
Saya mengatasinya dengan jquery:
sumber
Jika Anda menggunakan validasi jquery, Anda dapat melakukan hal berikut di bawah ini, saya menggunakan atribut yang dinonaktifkan tanpa masalah:
sumber
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:
Contoh Javascript:
Setelah:
Dengan cara ini, tidak ada perubahan efek visual, dan ini akan POST / GET dalam
<FORM>
.sumber
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.
sumber
solusi html:
yang javascript:
untuk menghapus:
edit: menambahkan metode hapus
sumber
Cukup, hapus atribut yang dinonaktifkan sebelum mengirimkan formulir.
sumber
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.sumber
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.
sumber
Di bawah ini bekerja untuk saya:
sumber
Saya mengelolanya dengan menyembunyikan kotak pilih dan menunjukkan
span
di tempatnya dengan hanya nilai informasi. Pada saat menonaktifkan.readonly
kelas, kita juga perlu menghapus.toVanish
elemen - elemen dan menunjukkannya.toShow
.sumber
Di IE saya bisa mengalahkan pendekatan onfocus => onblur dengan mengklik ganda. Tetapi mengingat nilainya dan mengembalikannya di acara pertukaran tampaknya menangani masalah itu.
Anda dapat melakukan hal serupa tanpa memperluas properti dengan menggunakan variabel javascript.
sumber
Berikut adalah upaya untuk menggunakan fungsi jQuery khusus untuk mencapai fungsionalitas (seperti yang disebutkan di sini):
sumber