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


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>

Лучше использовать $ (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(). Если вы больше любите играть в код, синтаксис контекста будет более кратким. Все сводится к стилю кодирования.

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


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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.