Cara terbaik untuk membatalkan pilihan <select> di jQuery?


219
<select size="2">
<option selected="selected">Input your option</option>
<option>Input your option</option>
</select>

Apa cara terbaik, menggunakan jQuery, untuk secara elegan membatalkan pilihan?

Jawaban:


347

Gunakan removeAttr ...

$("option:selected").removeAttr("selected");

Atau Prop

$("option:selected").prop("selected", false)

3
Tidak berfungsi di bawah IE 8. Lihat stackoverflow.com/questions/7960773/…
Clinton Pierce

60
Jawaban ini bukan cara untuk melakukan sesuatu (dan tidak bekerja secara universal untuk boot). Pendekatan yang benar adalah .val([])atau .prop("selected", false)- gulir ke bawah.
Jon

1
JQuery pasti sudah memperbaiki ini, Ini berfungsi sempurna untuk saya di IE8 menggunakan JQuery 1.7.2.
Mikey G

2
ATAU .val (['']) untuk memilih nilai kosong jika ada.
Mark

2
$("option:selected").prop("selected", false)terkadang tidak bekerja. (tidak bekerja di browser chrome dengan jquery v1.4.2)
Rohit Goyani

163

Ada banyak jawaban di sini, tetapi sayangnya semuanya sudah cukup tua dan oleh karena itu bergantung pada attr/ removeAttryang sebenarnya bukan cara untuk pergi.

@coffeeyesplease dengan benar menyebutkan bahwa solusi lintas-browser yang baik harus digunakan

$("select").val([]);

Solusi lintas-browser yang bagus adalah

// Note the use of .prop instead of .attr
$("select option").prop("selected", false);

Anda dapat melihatnya menjalankan swa-uji di sini . Diuji pada IE 7/8/9, FF 11, Chrome 19.


1
Jauh lebih baik daripada jawaban pilihan, (berfungsi lintas peramban dan tidak melibatkan mengacaukan set atribut)
Timothy Groote

1
Jawaban sempurna untuk membatalkan pilihan semua opsi. Tapi itu tidak bisa digunakan untuk membatalkan pilihan tertentu, sedangkan removeAttr bisa.
Mikey G

2
@ MikeGG: Ini , mencatat bahwa Array.indexOfperlu polyfill untuk IE <9 (atau Anda dapat menggunakan metode setara yang disediakan banyak perpustakaan JS).
Jon

1
Apakah Anda memeriksa HTML setelahnya $('#select').val([]);? Sayangnya, ini tidak menghapus selected="selected"atribut. Itu mungkin akhirnya memposting data yang salah. Saya tidak merekomendasikan pendekatan ini!
Fr0zenFyr

1
@ Fr0zenFyr: Jika Anda mulai dengan opsi yang dipilih sebelumnya dan Anda membatalkan pilihan secara manual dengan klik mouse, itu tidak menghapus atribut juga - dan tentu saja mengirimkan formulir dijamin untuk memposting data yang benar. Ada dunia perbedaan antara atribut HTML (yang menentukan keadaan awal) dan properti DOM (yang menentukan tampilan apa dan apa yang dikirimkan). Ini sebenarnya alasan mengapa solusi yang berfokus pada atribut tidak benar. Atribut menentukan nilai awal dari properti, tetapi sejauh itulah yang terjadi.
Jon

24

Sudah lama sejak ditanya, dan saya belum menguji ini di browser yang lebih tua tetapi menurut saya jawaban yang jauh lebih sederhana adalah

$("#selectID").val([]);

.val () berfungsi untuk pilih juga http://api.jquery.com/val/


Ini adalah cara terbaik dan benar-benar membersihkan nilai di sebagian besar browser - terima kasih.
Sagive SEO

Ini hanya berfungsi untuk multi-seleksi. $("select option").prop("selected", false);bekerja secara universal (pada pilihan multi dan tunggal).
splashout

23

Metode paling sederhana

$('select').val('')

Saya hanya menggunakan ini pada pilih sendiri dan itu berhasil.

Saya ada di jQuery 1.7.1 .


1
Saya hanya menghadapi satu masalah tentang solusi ini. Tag opsi masih akan memiliki atribut "terpilih"
Tamara

@Tamara Benarkah? Saya tidak memeriksa. Apakah Anda menggunakan "terpilih" untuk sesuatu dan ini mengacaukan segalanya untuk Anda?
Joshua Pinter

19

Jawaban sejauh ini hanya berfungsi untuk beberapa pilihan di IE6 / 7; untuk non-multi pilih yang lebih umum, Anda perlu menggunakan:

$("#selectID").attr('selectedIndex', '-1');

Ini dijelaskan dalam pos yang ditautkan oleh flyfishr64. Jika Anda melihatnya, Anda akan melihat bagaimana ada 2 kasus - multi / non-multi. Tidak ada yang menghentikan Anda untuk mendapatkan solusi lengkap:

$("#selectID").attr('selectedIndex', '-1').find("option:selected").removeAttr("selected");

7

Oh jquery.

Karena belum ada pendekatan javascript asli, saya merasa perlu menyediakannya.

var select = document.querySelector('select'); //hopefully you'll use a better selector query
select.selectedIndex = 0; // or -1, 0 sets it to first option, -1 selects no options

Dan hanya untuk menunjukkan seberapa cepat ini: benchmark


Terima kasih atas jawaban ini tanpa jQuery! :)
Saromase

6
$("#selectID option:selected").each(function(){
  $(this).removeAttr("selected");
});

Ini akan beralih melalui setiap item dan batalkan pilihan hanya yang diperiksa


5

Google cepat menemukan posting ini yang menjelaskan cara melakukan apa yang Anda inginkan untuk daftar pilih tunggal dan banyak di IE. Solusinya juga tampak cukup elegan:

$('#clickme').click(function() {
        $('#selectmenu option').attr('selected', false);

}); 


3
$(option).removeAttr('selected') //replace 'option' with selected option's selector

3

Terima kasih banyak atas solusinya.

Solusi untuk daftar kombo pilihan tunggal bekerja dengan sempurna. Saya menemukan ini setelah mencari di banyak situs.

$("#selectID").attr('selectedIndex', '-1').children("option:selected").removeAttr("selected");


2

Cara sederhana lain:

$("#selectedID")[0].selectedIndex = -1


1

Biasanya ketika saya menggunakan menu pilih, setiap opsi memiliki nilai yang terkait dengannya. Sebagai contoh

<select id="nfl">
  <option value="Bears Still...">Chicago Bears</option>
  <option selected="selected" value="Go Pack">Green Bay Packers</option>
</select>
console.log($('#nfl').val()) logs "Go Pack" to the console
Set the value to an empty string $('#nfl').val("")
console.log($('#nfl').val()) logs "" to the console

Sekarang ini tidak menghapus atribut yang dipilih dari opsi tetapi yang saya inginkan hanyalah nilainya.


0

Tetapkan id di pilih Anda, seperti:
<select id="foo" size="2">

Maka Anda dapat menggunakan:
$("#foo").prop("selectedIndex", 0).change();

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.