Su select change, ottieni il valore dell'attributo data


273

Il codice seguente restituisce "non definito" ...

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

È meglio usare $ (questo) .find (': selezionato') o $ (questo) .children ('opzione: selezionato')?
userBG

Risposte:


640

Devi trovare l'opzione selezionata:

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

o

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

sebbene sia preferito il primo metodo.


ho erroneamente usato attr () nel mio post iniziale, intendevo dati () ma restituisce "indefinito" per me.
userBG

6
Mi sono appena imbattuto in questo e mi chiedo se il primo metodo sia preferito per motivi di prestazioni o per un altro motivo? @JordanBrown
Clarkey

1
@Clarkey la mia ipotesi sarebbe che data () sia più veloce di attr () perché attr () deve fare un lavoro extra per capire che tipo di attributo sia. Solo una supposizione però.
dev_willis

37

Prova quanto segue:

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

Il sottoscrittore di modifica si iscrive all'evento di modifica della selezione, quindi il thisparametro è l'elemento di selezione. È necessario trovare il figlio selezionato da cui ottenere l'ID dati.


A partire dal 2016 find()è molto più veloce che children()anche in casi come questo dove abbiamo solo una profondità dell'albero di 2.
Hafenkranich,

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

Cerca sempre di supportare il tuo blocco di codice pubblicato con spiegazioni e / o riferimenti (anche se la soluzione è semplice / "autoesplicativa") su StackOverflow perché non tutti hanno familiarità con la sintassi / il comportamento / le prestazioni di un determinato linguaggio.
Mickmackusa,

7

Vanilla Javascript:

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

Cerca sempre di supportare il tuo blocco di codice pubblicato con spiegazioni e / o riferimenti (anche se la soluzione è semplice / "autoesplicativa") su StackOverflow perché non tutti hanno familiarità con la sintassi / il comportamento / le prestazioni di un determinato linguaggio.
Mickmackusa,

5

È possibile utilizzare la contextsintassi con thiso $(this). Questo è lo stesso effetto di 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>

Per una questione di microottimizzazione, potresti optare per find(). Se sei più un giocatore di codice, la sintassi del contesto è più breve. Dipende fondamentalmente dallo stile di programmazione.

Ecco un confronto delle prestazioni rilevanti .


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

1
Cerca sempre di supportare il tuo blocco di codice pubblicato con spiegazioni e / o riferimenti (anche se la soluzione è semplice / "autoesplicativa") su StackOverflow perché non tutti hanno familiarità con la sintassi / il comportamento / le prestazioni di un determinato linguaggio.
Mickmackusa,

L'OP non ha un idattributo sull'elemento select (e non ne ha bisogno a causa dell'utilità di this).
Mickmackusa,

1

questo funziona per me

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

e la sceneggiatura

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

1
Cerca sempre di supportare il tuo blocco di codice pubblicato con spiegazioni e / o riferimenti (anche se la soluzione è semplice / "autoesplicativa") su StackOverflow perché non tutti hanno familiarità con la sintassi / il comportamento / le prestazioni di un determinato linguaggio.
Mickmackusa,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.