En el cambio de selección, obtenga el valor del atributo de datos

273

El siguiente código devuelve 'indefinido' ...

$('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
fuente
¿Es mejor usar $ (this) .find (': selected') o $ (this) .children ('option: selected')?
userBG
2
Vea esta pregunta: stackoverflow.com/questions/648004/…
Jordan Brown

Respuestas:

640

Necesita encontrar la opción seleccionada:

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

o

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

aunque se prefiere el primer método.

Jordan Brown
fuente
por error utilicé attr () en mi publicación inicial, quise decir data () pero me devuelve 'indefinido'.
userBG
66
Acabo de encontrar esto y me pregunto si el primer método es el preferido debido a razones de rendimiento u otra razón. @JordanBrown
Clarkey
1
@Clarkey, supongo que data () es más rápido que attr () porque attr () tiene que hacer un trabajo adicional para determinar qué tipo de atributo es. Solo una suposición aunque.
dev_willis
37

Intenta lo siguiente:

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

Su suscriptor de cambio se suscribe al evento de cambio de select, por lo que el thisparámetro es el elemento select. Debe encontrar el elemento secundario seleccionado para obtener el ID de datos.

Rich O'Kelly
fuente
A partir de 2016 find()es mucho más rápido que children()incluso en casos como este donde solo tenemos una profundidad de árbol de 2.
Hafenkranich
9
document.querySelector('select').onchange = function(){   
   alert(this.selectedOptions[0].getAttribute('data-attr')); 
};
Sergey Kovalenko
fuente
Siempre intente apoyar su bloque de código publicado con explicaciones y / o referencias (incluso si la solución es simple / "autoexplicativa") en StackOverflow porque no todos están familiarizados con la sintaxis / comportamiento / rendimiento de un idioma determinado.
mickmackusa
7

Javascript de vainilla:

this.querySelector(':checked').getAttribute('data-id')
Arthur Araújo
fuente
Siempre intente apoyar su bloque de código publicado con explicaciones y / o referencias (incluso si la solución es simple / "autoexplicativa") en StackOverflow porque no todos están familiarizados con la sintaxis / comportamiento / rendimiento de un idioma determinado.
mickmackusa
5

Puede usar la contextsintaxis con thiso $(this). Este es el mismo efecto 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>

Como cuestión de microoptimización, puede optar por find(). Si usted es más un jugador de código, la sintaxis de contexto es más breve. Se reduce básicamente al estilo de codificación.

Aquí hay una comparación de rendimiento relevante .

mickmackusa
fuente
2
$('#foo option:selected').data('id');
Sinan ÇALIŞKAN
fuente
1
Siempre intente apoyar su bloque de código publicado con explicaciones y / o referencias (incluso si la solución es simple / "autoexplicativa") en StackOverflow porque no todos están familiarizados con la sintaxis / comportamiento / rendimiento de un idioma determinado.
mickmackusa
El OP no tiene un idatributo en el elemento select (y no lo necesita debido a la utilidad de this).
mickmackusa
1

esto funciona para mi

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

y el guión

$('#foo').on("change",function(){
    var dataid = $("#foo option:selected").attr('data-id');
    alert(dataid)
});
John Bryan Calleja
fuente
1
Siempre intente apoyar su bloque de código publicado con explicaciones y / o referencias (incluso si la solución es simple / "autoexplicativa") en StackOverflow porque no todos están familiarizados con la sintaxis / comportamiento / rendimiento de un idioma determinado.
mickmackusa