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>

Czy lepiej jest użyć $ (this) .find (': selected') czy $ (this) .children ('option: selected')?
userBG

Odpowiedzi:


640

Musisz znaleźć wybraną opcję:

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

lub

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

chociaż pierwsza metoda jest preferowana.


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.


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

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

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 .


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

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

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,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.