Pada perubahan pilih, dapatkan nilai atribut data

273

Kode berikut mengembalikan 'tidak terdefinisi' ...

$('select').change(function(){
    alert($(this).data('id'));
});

<select>
    <option data-id="1">one</option>
    <option data-id="2">two</option>
    <option data-id="3">three</option>
</select>
userBG
sumber
Apakah lebih baik menggunakan $ (ini) .cari (': terpilih') atau $ (ini). Anak ('opsi: terpilih')?
userBG
2
Lihat pertanyaan ini: stackoverflow.com/questions/648004/…
Jordan Brown

Jawaban:

640

Anda perlu menemukan opsi yang dipilih:

$(this).find(':selected').data('id')

atau

$(this).find(':selected').attr('data-id')

meskipun metode pertama lebih disukai.

Jordan Brown
sumber
saya keliru menggunakan attr () dalam posting inital saya, maksud saya data () tetapi mengembalikan 'tidak terdefinisi' untuk saya.
userBG
6
Saya baru saja menemukan ini dan saya bertanya-tanya apakah metode pertama lebih disukai karena alasan kinerja, atau alasan lain? @JordanBrown
Clarkey
1
@Clarkey tebakan saya adalah data () lebih cepat dari attr () karena attr () harus melakukan pekerjaan ekstra untuk mengetahui tipe atribut apa itu. Tebakan saja.
dev_willis
37

Coba yang berikut ini:

$('select').change(function(){
  alert($(this).children('option:selected').data('id'));
});

Pelanggan perubahan Anda berlangganan acara perubahan pilihan, jadi thisparameternya adalah elemen pilih. Anda perlu menemukan anak yang dipilih untuk mendapatkan data-id dari.

Rich O'Kelly
sumber
Per 2016 find()jauh lebih cepat daripada children()dalam kasus seperti ini di mana kita hanya memiliki kedalaman 2 pohon.
Hafenkranich
9
document.querySelector('select').onchange = function(){   
   alert(this.selectedOptions[0].getAttribute('data-attr')); 
};
Sergey Kovalenko
sumber
Harap selalu berusaha untuk mendukung blok kode yang Anda posting dengan penjelasan dan / atau referensi (bahkan jika solusinya sederhana / "cukup jelas") di StackOverflow karena tidak semua orang terbiasa dengan sintaks / perilaku / kinerja bahasa yang diberikan.
mickmackusa
7

Vanilla Javascript:

this.querySelector(':checked').getAttribute('data-id')
Arthur Araújo
sumber
Harap selalu berusaha untuk mendukung blok kode yang Anda posting dengan penjelasan dan / atau referensi (bahkan jika solusinya sederhana / "cukup jelas") di StackOverflow karena tidak semua orang terbiasa dengan sintaks / perilaku / kinerja bahasa yang diberikan.
mickmackusa
5

Anda dapat menggunakan contextsintaks dengan thisatau $(this). Ini adalah efek yang sama dengan find().

$('select').change(function() {
    console.log('Clicked option value => ' + $(this).val());
    <!-- undefined console.log('$(this) without explicit :select => ' + $(this).data('id')); -->
    <!-- error console.log('this without explicit :select => ' + this.data('id')); -->
    console.log(':select & $(this) =>    ' + $(':selected', $(this)).data('id'));
    console.log(':select & this =>       ' + $(':selected', this).data('id'));
    console.log('option:select & this => ' + $('option:selected', this).data('id'));
    console.log('$(this) & find =>       ' + $(this).find(':selected').data('id'));
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<select>
    <option data-id="1">one</option>
    <option data-id="2">two</option>
    <option data-id="3">three</option>
</select>

Sebagai masalah optimasi mikro, Anda mungkin memilih find(). Jika Anda lebih suka pegolf kode, sintaks konteksnya lebih singkat. Itu datang ke gaya coding pada dasarnya.

Berikut ini adalah perbandingan kinerja yang relevan .

mickmackusa
sumber
2
$('#foo option:selected').data('id');
Sinan ÇALIŞKAN
sumber
1
Harap selalu berusaha untuk mendukung blok kode yang Anda posting dengan penjelasan dan / atau referensi (bahkan jika solusinya sederhana / "cukup jelas") di StackOverflow karena tidak semua orang terbiasa dengan sintaks / perilaku / kinerja bahasa yang diberikan.
mickmackusa
OP tidak memiliki idatribut pada elemen pilih (dan tidak memerlukannya karena utilitas this).
mickmackusa
1

ini bekerja untuk saya

<select class="form-control" id="foo">
    <option value="first" data-id="1">first</option>
    <option value="second" data-id="2">second</option>
</select>

dan skripnya

$('#foo').on("change",function(){
    var dataid = $("#foo option:selected").attr('data-id');
    alert(dataid)
});
John Bryan Calleja
sumber
1
Harap selalu berusaha untuk mendukung blok kode yang Anda posting dengan penjelasan dan / atau referensi (bahkan jika solusinya sederhana / "cukup jelas") di StackOverflow karena tidak semua orang terbiasa dengan sintaks / perilaku / kinerja bahasa yang diberikan.
mickmackusa