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>

¿Es mejor usar $ (this) .find (': selected') o $ (this) .children ('option: selected')?
userBG

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.


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.


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

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

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 .


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

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

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.