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>
userBG
la source
Est-il préférable d'utiliser $ (this) .find (': selected') ou $ (this) .children ('option: selected')?
userBG
2
Voir cette question: stackoverflow.com/questions/648004/…
Jordan Brown

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.

Jordan Brown
la source
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.

Rich O'Kelly
la source
À 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')); 
};
Sergey Kovalenko
la source
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')
Arthur Araújo
la source
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 .

mickmackusa
la source
2
$('#foo option:selected').data('id');
Sinan ÇALIŞKAN
la source
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)
});
John Bryan Calleja
la source
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