Saya memiliki formulir input yang memungkinkan saya memilih dari beberapa opsi, dan melakukan sesuatu ketika pengguna mengubah pilihan. Misalnya,
<select onChange="javascript:doSomething();">
<option>A</option>
<option>B</option>
<option>C</option>
</select>
Sekarang, doSomething()
hanya akan terpicu ketika seleksi berubah .
Saya ingin memicu doSomething()
ketika pengguna memilih opsi apa pun, mungkin yang sama lagi.
Saya telah mencoba menggunakan pengendali "onClick", tetapi itu dipicu sebelum pengguna memulai proses pemilihan.
Jadi, apakah ada cara untuk memicu fungsi di setiap pilih oleh pengguna?
Memperbarui:
Jawaban yang disarankan oleh Darryl tampaknya berhasil, tetapi tidak berhasil secara konsisten. Terkadang acara dipicu segera setelah pengguna mengklik menu drop-down, bahkan sebelum pengguna menyelesaikan proses pemilihan!
javascript
html
html-select
dom-events
ePharaoh
sumber
sumber
Jawaban:
Inilah cara paling sederhana:
Berfungsi baik dengan pemilihan mouse dan keyboard tombol Atas / Bawah yang pilih difokuskan.
sumber
undefined
.if(type(this.selectedIndex) != undefined; doSomething()
doSomething()
fungsi tidak dipicu ketika pengguna memilih opsi yang sudah dipilih. Lihat plunk ini , di mana warna latar belakang hanya berubah jika Anda memilih opsi yang berbeda dari yang saat ini dipilih.doSomething()
ketika satu opsi tertentu dipilih, misalnya "opsi 3" dalam contoh di atas, gunakanif (this.selectedIndex==4)
dimana angka "4" mewakili indeks numerik opsi, BUKAN yang ditentukanvalue
! (yaitu, "opsi 3" adalah opsi keempat<select name="ab">
).Saya membutuhkan sesuatu yang persis sama. Inilah yang bekerja untuk saya:
Mendukung ini:
sumber
Saya memiliki masalah yang sama ketika saya membuat desain beberapa bulan yang lalu. Solusi yang saya temukan adalah menggunakan
.live("change", function())
kombinasi dengan.blur()
elemen yang Anda gunakan.Jika Anda ingin melakukan sesuatu ketika pengguna cukup mengklik, bukan mengubah, ganti saja
change
denganclick
.Saya memberikan ID saya dropdown
selected
,, dan menggunakan yang berikut:Saya melihat ini tidak memiliki jawaban yang dipilih, jadi saya pikir saya akan memberikan masukan saya. Ini bekerja dengan baik untuk saya, jadi semoga orang lain dapat menggunakan kode ini ketika mereka macet.
http://api.jquery.com/live/
Sunting: Gunakan
on
pemilih sebagai lawan.live
. Lihat jQuery .on ()sumber
Hanya sebuah ide, tetapi apakah mungkin untuk melakukan onclick pada masing-masing
<option>
elemen?Pilihan lain bisa menggunakan on blur pada pilih. Ini akan memecat kapan saja pengguna mengklik dari pilih. Pada titik ini Anda dapat menentukan opsi apa yang dipilih. Agar pemicu ini merata pada waktu yang tepat, klik opsi dapat mengaburkan bidang (membuat sesuatu yang lain aktif atau hanya .blur () di jQuery).
sumber
Pendekatan onclick tidak sepenuhnya buruk tetapi seperti yang dikatakan, itu tidak akan dipicu ketika nilainya tidak diubah oleh klik-mouse.
Namun dimungkinkan untuk memicu acara onclick di acara onchange.
sumber
Akan memperluas jawaban jitbit. Saya merasa aneh ketika Anda mengklik drop down dan kemudian mengklik drop down tanpa memilih apa pun. Berakhir dengan sesuatu di sepanjang baris:
Ini lebih masuk akal bagi pengguna dan memungkinkan JavaScript untuk berjalan setiap kali mereka memilih opsi apa pun termasuk opsi sebelumnya.
Kelemahan dari pendekatan ini adalah bahwa itu memecah kemampuan untuk tab ke drop-down dan menggunakan tombol panah untuk memilih nilai. Ini dapat diterima bagi saya karena semua pengguna mengklik semuanya sepanjang waktu sampai akhir keabadian.
sumber
this
bukan$(this)
. Namun, saya tidak mendapatkan semua perilaku yang dimaksudkan dari ini; itu tidak mengingatkan ketika saya memilih kembali opsi yang sama.onchange
dipicu saat menambahkan opsi penghapusan ke kotak pilih melalui JS. Tidak hanya ketika pengguna memilih itemJika Anda benar-benar membutuhkan ini untuk bekerja seperti ini, saya akan melakukan ini (untuk memastikan itu berfungsi dengan keyboard dan mouse)
Sayangnya onclick akan berjalan beberapa kali (mis. Onpening pilih ... dan pada seleksi / tutup) dan onkeypress mungkin menyala ketika tidak ada perubahan ...
sumber
Untuk menjalankan acara dengan benar setiap kali pengguna memilih sesuatu (bahkan opsi yang sama), Anda hanya perlu mengelabui kotak pilih.
Seperti orang lain katakan, tentukan
selectedIndex
fokus negatif untuk memaksa acara perubahan. Meskipun ini memungkinkan Anda untuk mengelabui kotak pilih, itu tidak akan berfungsi setelah itu selama masih memiliki fokus. Perbaikan sederhana adalah dengan memaksa kotak pilih untuk kabur, yang ditunjukkan di bawah ini.JS / HTML standar:
Plugin jQuery:
Anda dapat melihat demo yang berfungsi di sini .
sumber
Sebenarnya, acara onclick TIDAK akan menyala ketika pengguna menggunakan keyboard untuk mengubah pilihan dalam kontrol pilih. Anda mungkin harus menggunakan kombinasi onChange dan onClick untuk mendapatkan perilaku yang Anda cari.
sumber
Ini mungkin tidak langsung menjawab pertanyaan Anda, tetapi masalah ini bisa diselesaikan dengan penyesuaian tingkat desain sederhana. Saya memahami ini mungkin tidak 100% berlaku untuk semua kasus penggunaan, tetapi saya sangat menyarankan Anda untuk mempertimbangkan kembali aliran pengguna aplikasi Anda dan jika saran desain berikut dapat diterapkan.
Saya memutuskan untuk melakukan sesuatu yang sederhana dari hacking alternatif untuk
onChange()
menggunakan peristiwa lain yang tidak benar-benar dimaksudkan untuk tujuan ini (blur
,click
, dll)Cara saya menyelesaikannya:
Cukup pra-tunda tag opsi placeholder seperti pilih yang tidak memiliki nilai untuk itu.
Jadi, alih-alih hanya menggunakan struktur berikut, yang membutuhkan alternatif hack-y:
Pertimbangkan untuk menggunakan ini:
Jadi, dengan cara ini, kode Anda BANYAK lebih disederhanakan dan
onChange
akan berfungsi seperti yang diharapkan, setiap kali pengguna memutuskan untuk memilih sesuatu selain nilai default. Anda bahkan dapat menambahkandisabled
atribut ke opsi pertama jika Anda tidak ingin mereka memilihnya lagi dan memaksa mereka untuk memilih sesuatu dari opsi, sehingga memicuonChange()
kebakaran.Pada saat jawaban ini, saya sedang menulis aplikasi Vue yang kompleks dan saya menemukan bahwa pilihan desain ini telah banyak menyederhanakan kode saya. Saya menghabiskan berjam-jam untuk masalah ini sebelum saya menyelesaikan dengan solusi ini dan saya tidak perlu menulis ulang banyak kode saya. Namun, jika saya menggunakan alternatif peretasan, saya harus memperhitungkan kasus tepi, untuk mencegah penembakan ganda atas permintaan ajax, dll. Ini juga tidak mengacaukan perilaku peramban default sebagai bonus bagus (diuji pada ponsel browser juga).
Terkadang, Anda hanya perlu mengambil langkah mundur dan memikirkan gambaran besar untuk solusi paling sederhana.
sumber
Apa yang saya lakukan ketika dihadapkan dengan Masalah serupa adalah saya menambahkan 'onFocus' ke kotak pilih yang menambahkan opsi generik baru ('pilih opsi' atau sesuatu yang serupa) dan default sebagai opsi yang dipilih.
sumber
Jadi tujuan saya adalah untuk dapat memilih nilai yang sama beberapa kali yang pada dasarnya menimpa fungsi onchange () dan mengubahnya menjadi metode onclick () yang bermanfaat.
Berdasarkan saran di atas saya datang dengan ini yang bekerja untuk saya.
http://jsfiddle.net/dR9tH/19/
sumber
onfocus="this.selectedIndex=-1"
solusi lain : Pilihan saat ini nuked jika Anda tab ke komponen, atau jika Anda mouse dari menu tanpa memilih apa pun. Tekan tab pada biola Anda untuk melihat apa yang saya maksud. (Juga perhatikan Anda mendapatkan nilai kosong dan tidak '-' ketika Anda melakukan ini. Itu karenaselectedIndex=-1
tidak membuat Anda<option value="-1">
; itu akan menjadi sedikit perbaikan di sini untuk digunakanonfocus="this.selectedIndex=0"
. Ini adalah solusi yang setengah layak, tapi saya tidak seperti kehilangan pilihan saat ini hanya karena aku mengintip menu, atau bahkan hanyapertama-tama Anda menggunakan onChange sebagai pengendali event dan kemudian menggunakan variabel flag untuk membuatnya melakukan fungsi yang Anda inginkan setiap kali Anda membuat perubahan
sumber
Tambahkan opsi tambahan sebagai yang pertama, seperti tajuk kolom, yang akan menjadi nilai default dari tombol dropdown sebelum mengkliknya dan reset pada akhir
doSomething()
, jadi ketika memilih A / B / C, acara pertukaran selalu memicu, ketika pemilihanState
dilakukan, jangan lakukan apa-apa dan kembali.onclick
sangat tidak stabil seperti yang banyak orang sebutkan sebelumnya. Jadi yang perlu kita lakukan adalah membuat label tombol awal yang berbeda dengan pilihan sebenarnya sehingga pertukaran akan berfungsi pada opsi apa pun.sumber
Hal yang luar biasa tentang tag pilih (dalam skenario ini) adalah bahwa tag tersebut akan mengambil nilainya dari tag opsi.
Mencoba:
Bekerja layak untuk saya.
sumber
gunakan jquery:
sumber
Inilah solusi saya, sangat berbeda dari yang lain di sini. Menggunakan posisi mouse untuk mencari tahu apakah opsi diklik sebagai lawan mengklik kotak pilih untuk membuka dropdown. Itu memanfaatkan posisi event.screenY karena ini adalah satu-satunya variabel lintas browser yang dapat diandalkan. Event hover harus dipasang terlebih dahulu sehingga dapat mengetahui posisi kontrol relatif terhadap layar sebelum acara klik.
Ini jsFiddle saya http://jsfiddle.net/sU7EV/4/
sumber
Anda harus mencoba menggunakan
option:selected
sumber
Apa yang berhasil untuk saya:
Dengan cara itu, onchange memanggil 'doSomething ()' ketika opsi berubah, dan onclick panggilan 'doSomething ()' ketika acara onchange salah, dengan kata lain, ketika Anda memilih opsi yang sama
sumber
Coba ini (peristiwa dipicu saat Anda memilih opsi, tanpa mengubah opsi):
http://jsbin.com/dowoloka/4
sumber
Di sini Anda memiliki indeks yang dikembalikan, dan dalam kode js Anda dapat menggunakan pengembalian ini dengan satu saklar atau apa pun yang Anda inginkan.
sumber
Coba ini:
sumber
Beberapa waktu yang lalu sekarang tetapi dalam menjawab pertanyaan awal, apakah ini membantu? Masukkan saja
onClick
ke dalamSELECT
garis. Lalu, letakkan apa yang ingin AndaOPTION
lakukan diOPTION
barisan. yaitu:sumber
sumber
Saya telah menghadapi kebutuhan yang sama dan akhirnya menulis arahan angular untuk hal yang sama -
tautan guthub - pilih sudut
Digunakan
element[0].blur();
untuk menghapus fokus dari tag pilih. Logika adalah untuk memicu blur ini pada klik kedua dropdown.as-select
akan terpicu bahkan ketika pengguna memilih nilai yang sama di dropdown.DEMO - tautan
sumber
Satu jawaban Sejati adalah untuk tidak menggunakan bidang pilih (jika Anda perlu melakukan sesuatu ketika Anda memilih kembali jawaban yang sama.)
Buat menu dropdown dengan div konvensional, tombol, tampilkan / sembunyikan menu. Tautan: https://www.w3schools.com/howto/howto_js_dropdown.asp
Bisa dihindari seandainya ada yang bisa menambahkan pendengar acara ke opsi. Jika ada pendengar onSelect untuk elemen pilih. Dan jika mengklik pada bidang pilih tidak semakin mematikan mousedown, mouseup, dan klik semua pada saat yang sama pada mousedown.
sumber
Ada beberapa hal yang ingin Anda lakukan di sini untuk memastikannya mengingat nilai yang lebih lama dan memicu acara pertukaran bahkan jika opsi yang sama dipilih lagi.
Hal pertama yang Anda inginkan adalah acara onChange reguler:
Untuk memiliki pemicu onChange event bahkan ketika opsi yang sama dipilih lagi, Anda dapat membatalkan pilihan yang dipilih ketika dropdown menerima fokus dengan mengaturnya ke nilai yang tidak valid. Tetapi Anda juga ingin menyimpan nilai yang dipilih sebelumnya untuk mengembalikannya jika pengguna tidak memilih opsi baru:
Kode di atas akan memungkinkan Anda untuk memicu pertukaran bahkan jika nilai yang sama dipilih. Namun, jika pengguna mengklik di luar kotak pilih, Anda ingin mengembalikan nilai sebelumnya. Kami melakukannya di onBlur:
sumber
Harap perhatikan bahwa Penangan Kejadian tidak didukung untuk tag OPSI di IE, dengan pemikiran cepat..Saya datang dengan solusi ini, cobalah dan berikan saya tanggapan Anda:
Apa yang saya lakukan di sini sebenarnya adalah mengatur ulang indeks pilih sehingga acara pertukaran akan selalu terpicu, benar bahwa Anda kami kehilangan item yang dipilih ketika Anda mengklik dan mungkin mengganggu jika daftar Anda panjang, tetapi mungkin membantu Anda di suatu tempat ..
sumber
bagaimana dengan mengubah nilai pilih ketika elemen mendapatkan fokus, misalnya (dengan jquery):
sumber
Saya menemukan solusi ini.
aturIndex yang dipilih dari elemen pilih ke 0 awalnya
sebut metode ini di acara Ubah
sumber