При изменении выбора получите значение атрибута данных

273

Следующий код возвращает 'undefined' ...

$('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
источник
Лучше использовать $ (this) .find (': selected') или $ (this) .children ('option: selected')?
userBG
2
Смотрите этот вопрос: stackoverflow.com/questions/648004/…
Джордан Браун

Ответы:

641

Вам нужно найти выбранную опцию:

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

или

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

хотя первый метод предпочтительнее.

Джордан Браун
источник
я по ошибке использовал attr () в своем первоначальном посте, я имел в виду data (), но он возвращает «undefined» для меня.
userBG
6
Я только что столкнулся с этим, и мне интересно, если первый метод предпочтительнее из-за соображений производительности или по другой причине? @JordanBrown
Кларки
1
@ Clarkey, я думаю, что data () быстрее, чем attr (), потому что attr () должен проделать дополнительную работу, чтобы выяснить, какой это тип атрибута. Просто угадай.
dev_willis
37

Попробуйте следующее:

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

Ваш подписчик изменений подписывается на событие изменения выбора, поэтому thisпараметр является элементом выбора. Вам нужно найти выбранного ребенка, чтобы получить идентификатор данных.

Рич О'Келли
источник
По состоянию на 2016 год find()намного быстрее, чем children()даже в таких случаях, как этот, где у нас есть только дерево глубиной 2.
Hafenkranich
9
document.querySelector('select').onchange = function(){   
   alert(this.selectedOptions[0].getAttribute('data-attr')); 
};
Сергей Коваленко
источник
Всегда старайтесь поддерживать свой опубликованный блок кода с пояснениями и / или ссылками (даже если решение простое / «самоочевидное») в StackOverflow, потому что не все знакомы с синтаксисом / поведением / производительностью данного языка.
mickmackusa
7

Ванильный Javascript:

this.querySelector(':checked').getAttribute('data-id')
Артур Араужо
источник
Всегда старайтесь поддерживать свой опубликованный блок кода с пояснениями и / или ссылками (даже если решение простое / «самоочевидное») в StackOverflow, потому что не все знакомы с синтаксисом / поведением / производительностью данного языка.
mickmackusa
5

Вы можете использовать contextсинтаксис с thisили $(this). Это тот же эффект, что и 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>

Что касается микрооптимизации, вы можете выбрать find(). Если вы больше любите играть в код, синтаксис контекста будет более кратким. Все сводится к стилю кодирования.

Вот соответствующее сравнение производительности .

mickmackusa
источник
2
$('#foo option:selected').data('id');
Синан ЧАЛИККАН
источник
1
Всегда старайтесь поддерживать свой опубликованный блок кода с пояснениями и / или ссылками (даже если решение простое / «самоочевидное») в StackOverflow, потому что не все знакомы с синтаксисом / поведением / производительностью данного языка.
mickmackusa
У OP нет idатрибута в элементе выбора (и он не нужен из-за полезности this).
mickmackusa
1

это работает для меня

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

и сценарий

$('#foo').on("change",function(){
    var dataid = $("#foo option:selected").attr('data-id');
    alert(dataid)
});
Джон Брайан Каллеха
источник
1
Всегда старайтесь поддерживать свой опубликованный блок кода с пояснениями и / или ссылками (даже если решение простое / «самоочевидное») в StackOverflow, потому что не все знакомы с синтаксисом / поведением / производительностью данного языка.
mickmackusa