Seçim değişikliğinde, veri özelliği değerini alın


273

Aşağıdaki kod 'tanımsız' döndürüyor ...

$('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>

$ (This) .find (': seçili') veya $ (bu) .children ('seçenek: seçili') kullanmak daha mı iyi?
userBG

Yanıtlar:


640

Seçilen seçeneği bulmanız gerekir:

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

veya

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

birinci yöntem tercih edilmesine rağmen.


yanlışlıkla benim ilk yazı attr () kullanılır, ben veri () demek ama benim için 'tanımsız' döndürür.
userBG

6
Ben sadece bu rastladım ve performans nedenlerinden dolayı, ya da başka bir nedenle ilk yöntemin tercih edilip edilmediğini merak ediyorum? @JordanBrown
Clarkey

1
@Clarkey tahminim data () 'ın attr ()' den daha hızlı olması olurdu çünkü attr () ne tür bir nitelik olduğunu anlamak için ekstra iş yapmak zorundadır. Sadece bir tahmin tho.
dev_willis

37

Takip etmeyi dene:

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

Değişiklik aboneniz thisselect öğesinin change olayına abone olur, bu nedenle parametre select öğesidir. Veri kimliğini almak için seçilen alt öğeyi bulmanız gerekir.


2016 itibariyle, sadece 2 ağaç derinliğine sahip olduğumuz gibi durumlarda bile find()çok daha hızlı children().
Hafenkranich

9
document.querySelector('select').onchange = function(){   
   alert(this.selectedOptions[0].getAttribute('data-attr')); 
};

Lütfen herkes belirli bir dilin sözdizimi / davranışı / performansı konusunda bilgi sahibi olmadığından, yayınlanan kod bloğunuzu StackOverflow'da açıklama ve / veya referanslarla (çözüm basit / "kendi kendini açıklayıcı" olsa bile) desteklemeye çalışın.
mickmackusa

7

Vanilya Javascript:

this.querySelector(':checked').getAttribute('data-id')

Lütfen herkes belirli bir dilin sözdizimi / davranışı / performansı konusunda bilgi sahibi olmadığından, yayınlanan kod bloğunuzu StackOverflow'da açıklama ve / veya referanslarla (çözüm basit / "kendi kendini açıklayıcı" olsa bile) desteklemeye çalışın.
mickmackusa

5

Sen kullanabilirsiniz contextile sözdizimi thisya $(this). Bu, aynı etkiye sahiptir 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>

Mikrooptimizasyon meselesi olarak, tercih edebilirsiniz find(). Daha çok bir kod golfçüsüyseniz, bağlam sözdizimi daha kısadır. Temel olarak kodlama stiline gelir.

İşte ilgili bir performans karşılaştırması .


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

1
Lütfen herkes belirli bir dilin sözdizimi / davranışı / performansı konusunda bilgi sahibi olmadığından, yayınlanan kod bloğunuzu StackOverflow'da açıklama ve / veya referanslarla (çözüm basit / "kendi kendini açıklayıcı" olsa bile) desteklemeye çalışın.
mickmackusa

OP id, select öğesinde bir özniteliğe sahip değildir (ve yardımcı programı nedeniyle birine gerek yoktur this).
mickmackusa

1

bu benim için çalışıyor

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

ve senaryo

$('#foo').on("change",function(){
    var dataid = $("#foo option:selected").attr('data-id');
    alert(dataid)
});

1
Lütfen herkes belirli bir dilin sözdizimi / davranışı / performansı konusunda bilgi sahibi olmadığından, yayınlanan kod bloğunuzu StackOverflow'da açıklama ve / veya referanslarla (çözüm basit / "kendi kendini açıklayıcı" olsa bile) desteklemeye çalışın.
mickmackusa
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.