Добавление дополнительных данных для выбора параметров с помощью jQuery

141

Надеюсь, очень простой вопрос.

У меня обычная <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 = "", но это не работает
Джим Смит
Ваш вопрос непонятен (во всяком случае, мне). Что вы имеете в виду под «сохранением другого значения в параметрах выбора»? Вы имеете в виду, что хотите добавить новую опцию к выбору, которая будет отображаться пользователю при открытии?
Phrogz
15
не бросает вызов логике или разуму, боже. У меня есть аналогичный вопрос / случай, поэтому я могу сравнить значения между выбранными и сохранить текст одного варианта на другой вариант, сохраняя при этом значения / тексты выбора, один из способов, который кажется возможным, - это данные, как указано в ответе ниже. то, что ВЫ не подумали об этом, не означает, что это противоречит логике и разуму. OP был достаточно приличным вопросом, ему просто нужно было указать в правильном направлении, а не получить большой стакан самодовольства.
user1783229
1
вы всегда можете добавить любое количество дополнительных параметров, используя data-something и используя .data ('something') везде, где в противном случае вы бы сделали .value. просто замените что-нибудь на value2 или что-нибудь подобное по своему вкусу

Ответы:

323

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.

Phrogz
источник
@jimsmith Да, будет. (Если вы найдете какой-либо из этих ответов полезным, вы должны проголосовать за них. Также следует отметить один из них как «принятый», если вы обнаружили, что он лучше всего решает вашу проблему.)
Phrogz
1
Какие? Нет, не будет. Он будет работать во всех браузерах, поддерживающих атрибуты данных HTML5.
glomad
13
@ithcy Все браузеры поддерживают (и имеют уже более 10 лет) «недопустимые» атрибуты в разметке и получают / устанавливают их через DOM. Атрибуты «данных» HTML5 - это просто настраиваемые атрибуты со схемой именования и новым стандартом, который объявляет их законными.
Phrogz
@Phrogz Я знаю это. Дело не в том, что браузеры «поддерживают» недопустимые атрибуты, а в их игнорировании. На самом деле нет другого способа написать пригодный для использования веб-браузер :) Однако я думаю, что называть атрибуты данных «синтаксически достоверными» - это натяжка - это зависит от вашего контекста. Если у вас есть доктайп HTML5, то да, они действительны. В противном случае это не так, и это приведет к сбою проверки W3C.
glomad 06
1
вместо selected.getAttribute('data-foo');вас можно было использоватьselected.dataset.foo
Виталий Маркитанов
5

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

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

Для этого можно сделать

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

А затем, чтобы получить его, вы можете использовать

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

Это не будет действительный код, но я думаю, он выполняет свою работу.

mikesir87
источник
Другой метод - использовать $ (selector) .data ('value2', «your value») и $ (selector) .data ('value2') для извлечения ... который все еще действителен.
mikesir87,
Что ж, было бы синтаксически неверным иметь нестандартные атрибуты в исходной разметке, но а) я никогда не видел никаких браузеров со времен NS4, и б) если вы можете изменить DOM чтобы создать что-то "синтаксически недействительное", не так ли?
Phrogz
да, действительно ... недействительно. зачем использовать произвольные свойства, когда свойства data- * были определены в стандарте html5.
Stephenbayer
3
Как упоминает @stephenbayer ... правильный способ сделать это сейчас - использовать поддерживаемые html5 свойства data- *. Когда первоначально ответили еще в 2010 году, эти объекты не использовались постоянно и не слишком активно использовались :)
mikesir87,
2

Я сделал два примера из того, что, по моему мнению, может быть вашим вопросом:

http://jsfiddle.net/grdn4/

Проверьте это, чтобы сохранить дополнительные значения. Он использует атрибуты данных для хранения другого значения:

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

Zsalzbank
источник
-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 ()

Фадид
источник
<form: option data-libelle-compte = "$ {compte.libelle} data-raison =" $ {compte.raison} "data-compte =" $ {compte.numero} "> <c: out value =" $ {compte.libelleCompte} MAD "/> </ form: option>
Фадид
-4

Чтобы сохранить другое значение в параметрах выбора:

$("#select").append('<option value="4">another</option>')
Кайл
источник