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>
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>
Risposte:
Devi trovare l'opzione selezionata:
$(this).find(':selected').data('id')
o
$(this).find(':selected').attr('data-id')
sebbene sia preferito il primo metodo.
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 this
parametro è l'elemento di selezione. È necessario trovare il figlio selezionato da cui ottenere l'ID dati.
find()
è molto più veloce che children()
anche in casi come questo dove abbiamo solo una profondità dell'albero di 2.
document.querySelector('select').onchange = function(){
alert(this.selectedOptions[0].getAttribute('data-attr'));
};
Vanilla Javascript:
this.querySelector(':checked').getAttribute('data-id')
È possibile utilizzare la context
sintassi con this
o $(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.
$('#foo option:selected').data('id');
id
attributo sull'elemento select (e non ne ha bisogno a causa dell'utilità di this
).
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)
});