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.