Lors d'une sélection, obtenez la valeur de l'attribut de données


273

Le code suivant renvoie «non défini» ...

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

Est-il préférable d'utiliser $ (this) .find (': selected') ou $ (this) .children ('option: selected')?
userBG

Réponses:


640

Vous devez trouver l'option sélectionnée:

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

ou

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

bien que la première méthode soit préférée.


j'ai utilisé par erreur attr () dans mon message initial, je voulais dire data () mais cela renvoie "indéfini" pour moi.
userBG

6
Je viens de découvrir cela et je me demande si la première méthode est préférée pour des raisons de performances ou pour une autre raison? @JordanBrown
Clarkey

1
@Clarkey, je suppose que data () est plus rapide que attr () car attr () doit faire un travail supplémentaire pour déterminer de quel type d'attribut il s'agit. Juste une supposition.
dev_willis

37

Essayez ce qui suit:

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

Votre abonné au changement s'abonne à l'événement de changement de la sélection, le thisparamètre est donc l'élément de sélection. Vous devez trouver l'enfant sélectionné pour obtenir l'ID de données.


À partir de 2016, find()c'est beaucoup plus rapide que children()même dans des cas comme celui-ci où nous n'avons qu'une profondeur d'arbre de 2.
Hafenkranich

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

Veuillez toujours vous efforcer de prendre en charge votre bloc de code publié avec des explications et / ou des références (même si la solution est simple / "auto-explicative") sur StackOverflow car tout le monde ne connaît pas la syntaxe / le comportement / les performances d'une langue donnée.
mickmackusa

7

Javascript vanille:

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

Veuillez toujours vous efforcer de prendre en charge votre bloc de code publié avec des explications et / ou des références (même si la solution est simple / "auto-explicative") sur StackOverflow car tout le monde ne connaît pas la syntaxe / le comportement / les performances d'une langue donnée.
mickmackusa

5

Vous pouvez utiliser la contextsyntaxe avec thisou $(this). C'est le même effet que 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>

En matière de microoptimisation, vous pouvez opter pour find(). Si vous êtes plutôt un golfeur de code, la syntaxe du contexte est plus brève. Il s'agit essentiellement du style de codage.

Voici une comparaison de performances pertinente .


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

1
Veuillez toujours vous efforcer de prendre en charge votre bloc de code publié avec des explications et / ou des références (même si la solution est simple / "auto-explicative") sur StackOverflow car tout le monde ne connaît pas la syntaxe / le comportement / les performances d'une langue donnée.
mickmackusa

L'OP n'a pas d' idattribut sur l'élément select (et n'en a pas besoin en raison de l'utilité de this).
mickmackusa

1

ça marche pour moi

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

et le script

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

1
Veuillez toujours vous efforcer de prendre en charge votre bloc de code publié avec des explications et / ou des références (même si la solution est simple / "auto-explicative") sur StackOverflow car tout le monde ne connaît pas la syntaxe / le comportement / les performances d'une langue donnée.
mickmackusa
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.