Bei Auswahl der Änderung den Datenattributwert abrufen

273

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>
userBG
quelle
Ist es besser, $ (this) .find (': selected') oder $ (this) .children ('option: selected') zu verwenden?
userBG
2
Siehe diese Frage: stackoverflow.com/questions/648004/…
Jordan Brown

Antworten:

640

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.

Jordan Brown
quelle
Ich habe attr () fälschlicherweise in meinem ersten Beitrag verwendet. Ich meinte data (), aber es gibt für mich 'undefined' zurück.
userBG
6
Ich bin gerade darauf gestoßen und frage mich, ob die erste Methode aus Leistungsgründen oder aus einem anderen Grund bevorzugt wird. @ JordanBrown
Clarkey
1
@Clarkey Ich vermute, dass data () schneller ist als attr (), da attr () zusätzliche Arbeit leisten muss, um herauszufinden, um welche Art von Attribut es sich handelt. Nur eine Vermutung.
dev_willis
37

Versuche Folgendes:

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

Ihr Änderungsabonnent abonniert das Änderungsereignis der Auswahl, sodass der thisParameter das Auswahlelement ist. Sie müssen das ausgewählte Kind finden, von dem Sie die Daten-ID erhalten möchten.

Rich O'Kelly
quelle
Ab 2016 find()ist viel schneller als children()selbst in Fällen wie diesem, in denen wir nur eine Baumtiefe von 2 haben.
Hafenkranich
9
document.querySelector('select').onchange = function(){   
   alert(this.selectedOptions[0].getAttribute('data-attr')); 
};
Sergey Kovalenko
quelle
Bitte bemühen Sie sich immer, Ihren veröffentlichten Codeblock mit Erklärungen und / oder Verweisen (auch wenn die Lösung einfach / "selbsterklärend" ist) auf StackOverflow zu unterstützen, da nicht jeder mit der Syntax / dem Verhalten / der Leistung einer bestimmten Sprache vertraut ist.
Mickmackusa
7

Vanille-Javascript:

this.querySelector(':checked').getAttribute('data-id')
Arthur Araújo
quelle
Bitte bemühen Sie sich immer, Ihren veröffentlichten Codeblock mit Erklärungen und / oder Verweisen (auch wenn die Lösung einfach / "selbsterklärend" ist) auf StackOverflow zu unterstützen, da nicht jeder mit der Syntax / dem Verhalten / der Leistung einer bestimmten Sprache vertraut ist.
Mickmackusa
5

Sie können die contextSyntax mit thisoder 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 .

mickmackusa
quelle
2
$('#foo option:selected').data('id');
Sinan ÇALIŞKAN
quelle
1
Bitte bemühen Sie sich immer, Ihren veröffentlichten Codeblock mit Erklärungen und / oder Verweisen (auch wenn die Lösung einfach / "selbsterklärend" ist) auf StackOverflow zu unterstützen, da nicht jeder mit der Syntax / dem Verhalten / der Leistung einer bestimmten Sprache vertraut ist.
Mickmackusa
Das OP hat kein idAttribut für das Auswahlelement (und benötigt aufgrund des Nutzens von kein Attribut this).
Mickmackusa
1

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)
});
John Bryan Calleja
quelle
1
Bitte bemühen Sie sich immer, Ihren veröffentlichten Codeblock mit Erklärungen und / oder Verweisen (auch wenn die Lösung einfach / "selbsterklärend" ist) auf StackOverflow zu unterstützen, da nicht jeder mit der Syntax / dem Verhalten / der Leistung einer bestimmten Sprache vertraut ist.
Mickmackusa