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>

Ist es besser, $ (this) .find (': selected') oder $ (this) .children ('option: selected') zu verwenden?
userBG

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.


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.


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

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

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 .


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

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

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.