Na alteração selecionada, obtenha o valor do atributo de dados

273

O código a seguir retorna '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
fonte
É melhor usar $ (this) .find (': selected') ou $ (this) .children ('option: selected')?
precisa
2
Veja esta pergunta: stackoverflow.com/questions/648004/…
Jordan Brown

Respostas:

640

Você precisa encontrar a opção selecionada:

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

ou

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

embora o primeiro método seja preferido.

Jordan Brown
fonte
equivocadamente usei attr () no meu post inicial, eu quis dizer data (), mas ele retorna 'indefinido' para mim.
precisa
6
Acabei de me deparar com isso e estou me perguntando se o primeiro método é preferido devido a razões de desempenho ou outra razão? @JordanBrown
Clarkey
1
@ Clarkey meu palpite seria que data () é mais rápido que attr () porque attr () tem que fazer um trabalho extra para descobrir que tipo de atributo é. Apenas um palpite.
dev_willis 19/03
37

Tente o seguinte:

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

Seu assinante de mudança assina o evento de mudança do select, portanto, o thisparâmetro é o elemento select. Você precisa encontrar o filho selecionado para obter o ID de dados.

Rich O'Kelly
fonte
A partir de 2016 find()é muito mais rápido do que children()mesmo em casos como este, onde só temos uma profundidade árvore de 2.
Hafenkranich
9
document.querySelector('select').onchange = function(){   
   alert(this.selectedOptions[0].getAttribute('data-attr')); 
};
Sergey Kovalenko
fonte
Sempre tente apoiar seu bloco de código publicado com explicações e / ou referências (mesmo que a solução seja simples / "autoexplicativa") no StackOverflow, porque nem todo mundo está familiarizado com a sintaxe / comportamento / desempenho de um determinado idioma.
Mckmackusa 23/04/19
7

Javascript de baunilha:

this.querySelector(':checked').getAttribute('data-id')
Arthur Araújo
fonte
Sempre tente apoiar seu bloco de código publicado com explicações e / ou referências (mesmo que a solução seja simples / "autoexplicativa") no StackOverflow, porque nem todo mundo está familiarizado com a sintaxe / comportamento / desempenho de um determinado idioma.
Mckmackusa 23/04/19
5

Você pode usar a contextsintaxe com thisou $(this). Este é o mesmo efeito 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>

Por uma questão de microoptimização, você pode optar por find(). Se você é mais um jogador de código, a sintaxe de contexto é mais breve. Tudo se resume ao estilo de codificação basicamente.

Aqui está uma comparação de desempenho relevante .

mickmackusa
fonte
2
$('#foo option:selected').data('id');
Sinan ÇALIŞKAN
fonte
1
Sempre tente apoiar seu bloco de código publicado com explicações e / ou referências (mesmo que a solução seja simples / "autoexplicativa") no StackOverflow, porque nem todo mundo está familiarizado com a sintaxe / comportamento / desempenho de um determinado idioma.
Mckmackusa 23/04/19
O OP não possui um idatributo no elemento de seleção (e não precisa de um por causa do utilitário de this).
Mckmackusa 23/04/19
1

isso funciona para mim

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

e o script

$('#foo').on("change",function(){
    var dataid = $("#foo option:selected").attr('data-id');
    alert(dataid)
});
John Bryan Calleja
fonte
1
Sempre tente apoiar seu bloco de código publicado com explicações e / ou referências (mesmo que a solução seja simples / "autoexplicativa") no StackOverflow, porque nem todo mundo está familiarizado com a sintaxe / comportamento / desempenho de um determinado idioma.
Mckmackusa