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>

Apakah lebih baik menggunakan $ (ini) .cari (': terpilih') atau $ (ini). Anak ('opsi: terpilih')?
userBG

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.


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.


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')); 
};

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')

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 .


2
$('#foo option:selected').data('id');

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)
});

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
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.