jQuery - mengatur nilai yang dipilih dari kontrol pilih melalui deskripsi teksnya

530

Saya memiliki kontrol pilih, dan dalam variabel javascript saya memiliki string teks.

Menggunakan jQuery, saya ingin mengatur elemen yang dipilih dari kontrol pilih menjadi item dengan deskripsi teks yang saya miliki (sebagai lawan dari nilai, yang tidak saya miliki).

Saya tahu pengaturannya dengan nilai cukup sepele. misalnya

$("#my-select").val(myVal);

Tapi saya agak bingung melakukannya melalui deskripsi teks. Saya kira harus ada cara untuk mendapatkan nilai dari deskripsi teks, tetapi otak saya terlalu Jumat sore-red untuk bisa menyelesaikannya.

DanSingerman
sumber
1
@DanAtkinson akan melakukan hal yang sama sendiri. pilih sama sekali tidak ada hubungannya dengan pertanyaan ini.
thecoshman

Jawaban:

757

Pilih menurut deskripsi untuk jQuery v1.6 +

var text1 = 'Two';
$("select option").filter(function() {
  //may want to use $.trim in here
  return $(this).text() == text1;
}).prop('selected', true);
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<select>
  <option value="0">One</option>
  <option value="1">Two</option>
</select>

Versi jQuery di bawah 1.6 dan lebih besar dari atau sama dengan 1.4

var text1 = 'Two';
$("select option").filter(function() {
  //may want to use $.trim in here
  return $(this).text() == text1;
}).attr('selected', true);
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.4.0/jquery.min.js"></script>

<select>
  <option value="0">One</option>
  <option value="1">Two</option>
</select>

Perhatikan bahwa meskipun pendekatan ini akan berfungsi dalam versi yang di atas 1,6 tetapi kurang dari 1,9, itu telah ditinggalkan sejak 1.6. Ini tidak akan berfungsi di jQuery 1.9+.


Versi sebelumnya

val() harus menangani kedua kasus.

$('select').val('1'); // selects "Two"
$('select').val('Two'); // also selects "Two"
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.2.3/jquery.min.js"></script>

<select>
  <option value="0">One</option>
  <option value="1">Two</option>
</select>

Crescent Fresh
sumber
6
Ini terasa seperti itu seharusnya tidak berfungsi (sepertinya itu bisa ambigu) tetapi sebenarnya seharusnya bekerja dengan baik untuk saya. Terima kasih.
DanSingerman
69
Perhatikan bahwa jQuery 1.4 sekarang telah mengubah perilaku ini untuk memilih oleh valuejika atribut telah ditentukan, dan hanya memilih dengan teks jika valueatribut tersebut hilang. Jadi dalam contoh ini $('select').val('Two')akan memilih opsi kedua di 1.3.x, tetapi tidak akan melakukan apa pun di 1.4.x.
Crescent Fresh
18
Jadi, apa cara terbaik untuk melakukannya di 1.4 sekarang?
JR Lawhorne
4
Dalam versi terbaru dari jQuery, .val ('not-an-option-value') akan mengatur ulang pilih ke opsi pertama.
dland
5
Jawaban pertama untuk pertanyaan ini tampaknya menjadi solusi posting 1.3.x stackoverflow.com/questions/3644449/…
DA.
142

Saya belum menguji ini, tetapi ini mungkin bekerja untuk Anda.

$("select#my-select option")
   .each(function() { this.selected = (this.text == myVal); });
spoulson
sumber
90

Coba ini ... untuk memilih opsi dengan teks myText

$("#my-Select option[text=" + myText +"]").prop("selected", true);
Jay Corbett
sumber
@ jawaban spoulson ini bekerja untuk saya ... saya mencoba untuk melakukannya tanpa .each yang
Jay Corbett
2
Dalam banyak kasus, pendekatan ini sayangnya tidak berhasil. Saya bahkan harus menyelesaikan $("#my-Select option[text=" + myText +"]").get(0).selected = true;gaya klasik dari waktu ke waktu: (...
Shahriyar Imanov
2
Pastikan bahwa Anda pertama kali menghapus atribut yang dipilih sebelum mengatur ulang, jika tidak maka itu tidak akan berfungsi (berfungsi untuk saya di 1.9)
esse
3
@MarkW Untuk 1.9, gunakan .propsebagai ganti .attr; penyebab perubahannya adalah di 1.9 jQuery menonaktifkan peretasan lama yang memungkinkan Anda menggunakan .attruntuk mengubah beberapa properti DOM serta atribut HTML. (Google javascript dom properties vs attributesjika Anda tidak tahu perbedaannya.)
Mark Amery
Jawaban yang diperbarui untuk digunakan .prop('selected', true)alih-alih .attr('selected', 'selected')untuk kompatibilitas jQuery 1.9+.
erwaman
43

Saya melakukannya dengan cara ini (jQuery 1.9.1)

$("#my-select").val("Dutch").change();

Catatan: jangan lupa perubahan (), saya harus mencari terlalu lama karena itu :)

ErazerBrecht
sumber
2
Seandainya saya bisa membenarkan beberapa kali. Ini satu jam melewati waktu berhenti dan sekarang saya bisa pulang.
Bob Jordan
Jawaban bagus! singkat dan sederhana ... Ini harusnya di atas ... Tetap memberikan suara.
Muhammad Tarique
Ini berhasil dalam kasus saya, terima kasih! Tapi bukankah ini pilih bukan oleh teks yang ditampilkan, seperti yang diminta OP, tetapi oleh nilainya sendiri, yang tidak dimiliki OP?
Brandon Rhodes
21
$("#myselect option:contains('YourTextHere')").val();

akan mengembalikan nilai opsi pertama yang berisi deskripsi teks Anda. Menguji ini dan berhasil.

Russ Cam
sumber
Terima kasih - saya pikir ini mungkin versi yang saya gunakan, karena saya juga perlu memiliki logika ketika tidak ada teks yang cocok, dan ini tampaknya mekanisme yang paling mudah, untuk dapat melakukan itu.
DanSingerman
1
Ingatlah, itu hanya akan mendapatkan nilai untuk opsi pertama yang cocok dengan teks.
Russ Cam
Selain itu, Anda dapat rantai attr ("terpilih", "terpilih") ke set yang dibungkus alih-alih val () dan ini akan bekerja mirip dengan jawaban CarolinaJay65
Russ Cam
1
OP mengatakan " menetapkan nilai" bukan " mendapatkan nilai"
RousseauAlexandre
15

Untuk menghindari semua komplikasi versi jQuery, jujur ​​saya sarankan menggunakan salah satu dari fungsi javascript yang sangat sederhana ini ...

function setSelectByValue(eID,val)
{ //Loop through sequentially//
  var ele=document.getElementById(eID);
  for(var ii=0; ii<ele.length; ii++)
    if(ele.options[ii].value==val) { //Found!
      ele.options[ii].selected=true;
      return true;
    }
  return false;
}

function setSelectByText(eID,text)
{ //Loop through sequentially//
  var ele=document.getElementById(eID);
  for(var ii=0; ii<ele.length; ii++)
    if(ele.options[ii].text==text) { //Found!
      ele.options[ii].selected=true;
      return true;
    }
  return false;
}
Dave
sumber
Ini memungkinkan pemilihan opsi yang dipilih melalui nilai atau teks (tergantung pada fungsi yang dipanggil). Misalnya: setSelectByValue ('sosis', '2'); Akan menemukan, dan memilih, opsi dengan nilai "2" dalam objek seleksi dengan id "sosis".
Dave
2
@Neal Uh ... itu menjawab pertanyaan?
Mark Amery
10

Saya tahu ini adalah posting lama, tapi saya tidak bisa memilihnya dengan teks menggunakan jQuery 1.10.3 dan solusi di atas. Saya akhirnya menggunakan kode berikut (variasi solusi spoulson):

      var textToSelect = "Hello World";

      $("#myDropDown option").each(function (a, b) {
            if ($(this).html() == textToSelect ) $(this).attr("selected", "selected");
        });

Semoga ini bisa membantu seseorang.

Losbear
sumber
10

Baris ini berfungsi:

$("#myDropDown option:contains(myText)").attr('selected', true);
Diego Unanue
sumber
7
 $("#Test").find("option:contains('two')").each(function(){
     if( $(this).text() == 'two' ) {
        $(this).attr("selected","selected");
     }
 });

Pernyataan if benar-benar cocok dengan "dua" dan "dua tiga" tidak akan cocok

aWebDeveloper
sumber
Tidak, bukan itu yang saya maksudkan. Saya pikir komentar saya agak tidak jelas, jadi saya hapus saja. Saya memang memilih jawaban Anda, karena itu berhasil untuk situasi saya.
Jagd
6

Cara termudah dengan 1.7+ adalah:

$("#myDropDown option:text=" + myText +"").attr("selected", "selected"); 

1.9+

$("#myDropDown option:text=" + myText +"").prop("selected", "selected"); 

Diuji dan bekerja.

RParker
sumber
1
Tidak di 1.9+ tidak. Sejak 1.6 Anda harus menggunakan .propuntuk mengubah properti DOM, bukan .attr(yang untuk atribut HTML / DOM). Lihat stackoverflow.com/q/5874652/1709587
Mark Amery
Saya akan menggunakan ("terpilih", benar) alih-alih nilai sebenarnya dari "terpilih"
mplungjan
5

Ini cara yang sangat sederhana. tolong gunakan itu

$("#free").val("y").change();
Pankaj Chauhan
sumber
4

lihat di plugin jquery selectedbox

selectOptions(value[, clear]): 

Pilih opsi berdasarkan nilai, menggunakan string sebagai parameter $("#myselect2").selectOptions("Value 1");, atau ekspresi reguler $("#myselect2").selectOptions(/^val/i);.

Anda juga dapat menghapus opsi yang sudah dipilih: $("#myselect2").selectOptions("Value 2", true);

Vitor Silva
sumber
3

Hanya sebagai catatan. Nilai yang saya pilih tidak disetel. Dan saya telah mencari di internet. Sebenarnya saya harus memilih nilai setelah panggilan balik dari layanan web, karena saya mendapatkan data darinya.

$("#SelectMonth option[value=" + DataFromWebService + "]").attr('selected', 'selected'); 
$("#SelectMonth").selectmenu('refresh', true);

Jadi penyegaran pemilih adalah satu-satunya hal yang saya lewatkan.

Ammar Bukhari
sumber
Ini yang benar - meskipun ... saya tidak melihat alasan untuk baris kedua. Harus bekerja apa adanya.
Sagive SEO
2

Saya menemukan bahwa dengan menggunakan attrAnda akan berakhir dengan beberapa opsi yang dipilih ketika Anda tidak mau - solusinya adalah menggunakan prop:

$("#myDropDown option:text=" + myText +"").prop("selected", "selected");

Chris Edwards
sumber
1

Saya punya masalah dengan contoh di atas, dan masalah itu disebabkan oleh kenyataan bahwa nilai kotak pilih saya diawali dengan string panjang tetap 6 karakter, tetapi parameter yang diteruskan tidak panjang tetap.

Saya memiliki fungsi rpad yang akan menempel pad string, dengan panjang yang ditentukan, dan dengan karakter yang ditentukan. Jadi, setelah mengisi parameter itu berfungsi.

$('#wsWorkCenter').val(rpad(wsWorkCenter, 6, ' '));


function rpad(pStr, pLen, pPadStr) {
if (pPadStr == '') {pPadStr == ' '};
while (pStr.length < pLen)
    pStr = pStr + pPadStr;
return pStr; 
} 
Keith
sumber
1
 $('#theYear').on('change', function () {
 FY = $(this).find('option:selected').text();
 $('#theFolders').each(function () {
     $('option:not(:contains(' + FY + '))', this).hide();
 });
 $('#theFolders').val(0);
});

$('#theYear').on('mousedown', function () {
 $('#theFolders option').show().find('option:contains("Select")', this).attr('selected', 'selected');
});
tomjm
sumber
0

Jawaban yang diterima ini tampaknya tidak benar, sementara .val ('newValue') benar untuk fungsinya, mencoba untuk mengambil pilih dengan namanya tidak berfungsi untuk saya, saya harus menggunakan id dan nama kelas untuk mendapatkan elemen saya

Sam Alexander
sumber
0

Inilah opsi yang mudah. Cukup atur opsi daftar Anda lalu tetapkan teksnya sebagai nilai yang dipilih:

$("#ddlScheduleFrequency option").selected(text("Select One..."));
DominionDave
sumber
-1

Dapatkan anak-anak dari kotak pilih; loop melalui mereka; ketika Anda telah menemukan yang Anda inginkan, aturlah sebagai opsi yang dipilih; return false untuk menghentikan perulangan.

geowa4
sumber