Po wybraniu zmiany pobierz wartość atrybutu danych

273

Poniższy kod zwraca „niezdefiniowany” ...

$('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
źródło
Czy lepiej jest użyć $ (this) .find (': selected') czy $ (this) .children ('option: selected')?
userBG
2
Zobacz to pytanie: stackoverflow.com/questions/648004/...
Jordan Brown

Odpowiedzi:

640

Musisz znaleźć wybraną opcję:

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

lub

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

chociaż pierwsza metoda jest preferowana.

Jordan Brown
źródło
błędnie użyłem attr () w moim początkowym poście, miałem na myśli data (), ale dla mnie zwraca „niezdefiniowany”.
userBG
6
Właśnie się z tym spotkałem i zastanawiam się, czy pierwsza metoda jest preferowana ze względu na wydajność, czy z innego powodu? @JordanBrown
Clarkey
1
@Clarkey zgaduję, że data () jest szybsza niż attr (), ponieważ attr () musi wykonać dodatkową pracę, aby ustalić, jaki to jest typ atrybutu. Tylko zgadnij.
dev_willis
37

Spróbuj wykonać następujące czynności:

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

Subskrybent zmiany subskrybuje zdarzenie zmiany wybranego, więc thisparametrem jest element select. Musisz znaleźć wybrane dziecko, aby uzyskać identyfikator danych.

Rich O'Kelly
źródło
Od 2016 r. find()Jest znacznie szybszy niż children()w takich przypadkach, w których mamy tylko 2 drzewa głębokości.
Hafenkranich
9
document.querySelector('select').onchange = function(){   
   alert(this.selectedOptions[0].getAttribute('data-attr')); 
};
Sergey Kovalenko
źródło
Zawsze staraj się obsługiwać wysłany blok kodu za pomocą objaśnień i / lub referencji (nawet jeśli rozwiązanie jest proste / „samoobjaśniające”) na StackOverflow, ponieważ nie wszyscy znają składnię / zachowanie / wydajność danego języka.
mickmackusa,
7

JavaScript waniliowy:

this.querySelector(':checked').getAttribute('data-id')
Arthur Araújo
źródło
Zawsze staraj się obsługiwać wysłany blok kodu za pomocą objaśnień i / lub referencji (nawet jeśli rozwiązanie jest proste / „samoobjaśniające”) na StackOverflow, ponieważ nie wszyscy znają składnię / zachowanie / wydajność danego języka.
mickmackusa,
5

Możesz użyć contextskładni za pomocą thislub $(this). Jest to taki sam efekt jak 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>

W ramach mikrooptymalizacji możesz się zdecydować find(). Jeśli jesteś bardziej golfistą, składnia kontekstu jest krótsza. Zasadniczo sprowadza się do stylu kodowania.

Oto odpowiednie porównanie wydajności .

mickmackusa
źródło
2
$('#foo option:selected').data('id');
Sinan ÇALIŞKAN
źródło
1
Zawsze staraj się obsługiwać wysłany blok kodu za pomocą objaśnień i / lub referencji (nawet jeśli rozwiązanie jest proste / „samoobjaśniające”) na StackOverflow, ponieważ nie wszyscy znają składnię / zachowanie / wydajność danego języka.
mickmackusa,
OP nie ma idatrybutu na elemencie select (i nie potrzebuje go ze względu na użyteczność this).
mickmackusa,
1

to działa dla mnie

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

i skrypt

$('#foo').on("change",function(){
    var dataid = $("#foo option:selected").attr('data-id');
    alert(dataid)
});
John Bryan Calleja
źródło
1
Zawsze staraj się obsługiwać wysłany blok kodu za pomocą objaśnień i / lub referencji (nawet jeśli rozwiązanie jest proste / „samoobjaśniające”) na StackOverflow, ponieważ nie wszyscy znają składnię / zachowanie / wydajność danego języka.
mickmackusa,