Der folgende Code gibt 'undefined' zurück ...
$('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>
Der folgende Code gibt 'undefined' zurück ...
$('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>
Antworten:
Sie müssen die ausgewählte Option finden:
$(this).find(':selected').data('id')
oder
$(this).find(':selected').attr('data-id')
obwohl die erste Methode bevorzugt ist.
Versuche Folgendes:
$('select').change(function(){
alert($(this).children('option:selected').data('id'));
});
Ihr Änderungsabonnent abonniert das Änderungsereignis der Auswahl, sodass der this
Parameter das Auswahlelement ist. Sie müssen das ausgewählte Kind finden, von dem Sie die Daten-ID erhalten möchten.
find()
ist viel schneller als children()
selbst in Fällen wie diesem, in denen wir nur eine Baumtiefe von 2 haben.
document.querySelector('select').onchange = function(){
alert(this.selectedOptions[0].getAttribute('data-attr'));
};
Vanille-Javascript:
this.querySelector(':checked').getAttribute('data-id')
Sie können die context
Syntax mit this
oder verwenden $(this)
. Dies ist der gleiche Effekt wie 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>
Aus Gründen der Mikrooptimierung können Sie sich entscheiden find()
. Wenn Sie eher ein Code-Golfer sind, ist die Kontextsyntax kürzer. Im Grunde kommt es auf den Codierungsstil an.
Hier ist ein relevanter Leistungsvergleich .
$('#foo option:selected').data('id');
id
Attribut für das Auswahlelement (und benötigt aufgrund des Nutzens von kein Attribut this
).
das funktioniert bei mir
<select class="form-control" id="foo">
<option value="first" data-id="1">first</option>
<option value="second" data-id="2">second</option>
</select>
und das Skript
$('#foo').on("change",function(){
var dataid = $("#foo option:selected").attr('data-id');
alert(dataid)
});