Додавання додаткових даних для вибору параметрів за допомогою jQuery


139

Дуже просте запитання, сподіваюся.

У мене є звичайний такий <select>ящик

<select id="select">
    <option value="1">this</option>
    <option value="2">that</option>
    <option value="3">other</option>
</select>

Я можу отримати вибране значення (за допомогою $("#select").val()) та відображене значення вибраного елемента (за допомогою $("#select :selected").text().

Але як я можу зберігати як <option>тег додаткове значення в тезі? Мені б хотілося зробити щось на кшталт <option value="3.1" value2="3.2">other</option>і отримати значення value2атрибута (що було б 3,2 у прикладі).


Ви хочете додати елемент у вікно вибору? або ви хочете мати можливість вибрати декілька одночасно та отримати результати?
zsalzbank

ні, я просто хочу, щоб у тезі <option> було схоже на value2 = "", але це не працює
Джим Сміт

Ваше питання незрозуміле (для мене як би там не було). Що ви маєте на увазі під "збереженням іншого значення у параметрах вибору"? Ви маєте на увазі, що хочете додати нову опцію до вибору, яка з’явиться користувачеві при відкритті?
Фрогз

15
не кидає логіки чи розуму, боже. У мене є аналогічне запитання / випадок, тому я можу порівнювати значення між виділеними і зберігати текст варіантів одного на параметри іншого, зберігаючи значення / тексти вибору, один із способів, який видається можливим, - це за допомогою даних, зазначених у відповіді нижче. тільки те, що ви не думали про це, не означає, що він не відповідає логіці та розуму. ОП було досить пристойним питанням, його просто потрібно було вказати в правильному напрямку, а не отримати велику склянку самовдоволення.
користувач1783229

1
ви завжди можете додати будь-яку кількість додаткових параметрів, використовуючи дані-будь-що, та використовуючи .data ("будь-що"), де б ви не зробили. просто поміняйте щось на значення2 або схоже на ваш смак

Відповіді:


320

Розмітка HTML

<select id="select">
  <option value="1" data-foo="dogs">this</option>
  <option value="2" data-foo="cats">that</option>
  <option value="3" data-foo="gerbils">other</option>
</select>

Код

// JavaScript using jQuery
$(function(){
    $('select').change(function(){
       var selected = $(this).find('option:selected');
       var extra = selected.data('foo'); 
       ...
    });
});

// Plain old JavaScript
var sel = document.getElementById('select');
var selected = sel.options[sel.selectedIndex];
var extra = selected.getAttribute('data-foo');

Дивіться це як робочий зразок за допомогою jQuery тут: http://jsfiddle.net/GsdCj/1/
Дивіться це як робочий зразок, використовуючи звичайний JavaScript тут: http://jsfiddle.net/GsdCj/2/

Використовуючи атрибути даних з HTML5, ви можете додавати додаткові дані до елементів у синтаксично правильному способі, який також легко доступний з jQuery.


@jimsmith Так, так і буде. (Якщо ви вважаєте, що будь-яка з цих відповідей є корисною, ви повинні їх проголосувати. Також слід позначити її як "прийняту", якщо ви виявили, що вона найкраще вирішує вашу проблему.)
Фрогз

1
Що? Ні, це не буде. Він працюватиме у всіх браузерах, які підтримують атрибути даних HTML5.
гломада

13
@ithcy Усі веб-переглядачі підтримують (і мають протягом 10+ років) "недійсні" атрибути в розмітці та отримують / встановлюють їх через DOM. Атрибути "data" HTML5 - це лише спеціальні атрибути зі схемою іменування та новим стандартом, який оголошує їх законними.
Фрогз

@Phrogz Я це знаю. Справа не в тому, що браузери "підтримують" недійсні атрибути, а скоріше питання їх ігнорування. Іншого способу написання корисного веб-браузера насправді немає :) Однак я думаю, що атрибути даних "синтаксично дійсні" - це розтягнення - це залежить від вашого контексту. Якщо у вас є HTML5-тип, то так, вони дійсні. Інакше вони не є, і вони призведуть до відмови перевірки W3C.
гломад

@ithcy Браузери "ігнорують" їх настільки, що вони не роблять з ними нічого особливого, але не ігнорують їх настільки, наскільки вони доступні getAttribute(). Я відповідав на ваше первісне твердження, що моя відповідь працюватиме не у всіх браузерах. Я висловлююсь за своє твердження, що воно працюватиме в браузерах "усіх" (для цього випадку досить щедре визначення "всіх"). Покажіть мені браузер, який підтримує jQuery, але не працює з цими атрибутами даних - навіть із нетиповим HTML5-типом - і я з'їм свої слова.
Фрогз

5

Для мене це звучить так, як ви хочете створити новий атрибут? Хочеш?

<option value="2" value2="somethingElse">...

Для цього можна зробити

$(your selector).attr('value2', 'the value');

А потім, щоб отримати його, ви можете використовувати

$(your selector).attr('value2')

Це не буде дійсним кодом, але, мабуть, це робить свою роботу.


Інший метод полягає у використанні $ (selector) .data ('value2', "your value") та $ (selector) .data ('value2') для отримання ..., який все ще діє.
mikesir87

Ну, не було б синтаксично правильним мати нестандартні атрибути в початковій розмітці, але а) я ніколи не бачив жодного браузера, оскільки в часи NS4 не було жодної проблеми з цим, і б) якщо ви можете змінити DOM виробляти щось, що є "синтаксично недійсним", це насправді?
Фрогз

так, це дійсно ... недійсне. чому використовувати довільні властивості, коли властивості data * визначені у стандарті html5.
stephenbayer

3
Як згадує @stephenbayer ... правильний спосіб зробити це зараз - це використання підтримуваних html5 властивостей даних *. Ці властивості насправді не використовувались та не використовувались, коли спочатку відповіли ще у 2010 році :)
mikesir87

2

Я зробив два приклади з того, що, на мою думку, може бути вашим питанням:

http://jsfiddle.net/grdn4/

Перевірте це, щоб зберегти додаткові значення. Він використовує атрибути даних для зберігання іншого значення:

http://jsfiddle.net/27qJP/1/


-1

Розмітка HTML / JSP:

<form:option 
data-libelle="${compte.libelleCompte}" 
data-raison="${compte.libelleSociale}"   data-rib="${compte.numeroCompte}"                              <c:out value="${compte.libelleCompte} *MAD*"/>
</form:option>

КОД JQUERY: Подія: зміна

var $this = $(this);
var $selectedOption = $this.find('option:selected');
var libelle = $selectedOption.data('libelle');

Мати елемент libelle.val () або libelle.text ()


<форма: параметр data-libelle-compte = "$ {compte.libelle} data-raison =" $ {compte.raison} "data-compte =" $ {compte.numero} "> <c: out value =" $ {compte.libelleCompte} MAD "/> </ form: option>
Fadid

-4

Щоб зберегти інше значення у вибраних опціях:

$("#select").append('<option value="4">another</option>')
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.