Після вибору зміни отримайте значення атрибута даних


273

Наступний код повертає "невизначений" ...

$('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')?
користувачBG

2
Дивіться це запитання: stackoverflow.com/questions/648004/…
Jordan Brown

Відповіді:


640

Вам потрібно знайти обраний варіант:

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

або

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

хоча перший спосіб є кращим.


я помилково використовував attr () у своєму вступному дописі, я мав на увазі дані (), але він повертає "невизначений" для мене.
користувачBG

6
Я щойно натрапив на це, і мені цікаво, чи не віддається перевагу першому методу через причини ефективності, чи інша причина? @JordanBrown
Clarkey

1
@Clarkey, я здогадуюсь, що дані () швидше, ніж 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.