Ajout de données supplémentaires pour sélectionner des options à l'aide de jQuery

139

Question très simple j'espère.

J'ai la <select>boîte habituelle comme celle-ci

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

Je peux obtenir la valeur sélectionnée (en utilisant $("#select").val()) et la valeur d'affichage de l'élément sélectionné (en utilisant $("#select :selected").text().

Mais comment puis-je stocker comme une valeur supplémentaire dans le <option>tag? Je voudrais pouvoir faire quelque chose comme <option value="3.1" value2="3.2">other</option>et obtenir la valeur de l' value2attribut (qui serait 3,2 dans l'exemple).

Jim Smith
la source
vous souhaitez ajouter un élément à la zone de sélection? ou vous voulez pouvoir en sélectionner plusieurs à la fois et obtenir les résultats?
zsalzbank
non je veux simplement qu'il y ait comme valeur2 = "" dans la balise <option>, mais cela ne fonctionne pas
jim smith
Votre question n'est pas claire (pour moi, en tout cas). Qu'entendez-vous par «stocker une autre valeur dans les options de sélection»? Voulez-vous dire que vous souhaitez ajouter une nouvelle option à la sélection, qui apparaîtrait à l'utilisateur une fois ouverte?
Phrogz
15
ne défie pas la logique ou la raison, mon Dieu. J'ai une question / un cas similaire afin que je puisse comparer les valeurs entre les sélections et enregistrer le texte de l'une des options sur les options de l'autre tout en conservant les valeurs / textes de cette sélection, une façon dont il semble possible est d'utiliser les données comme l'indique la réponse ci-dessous. ce n'est pas parce que VOUS n'y avez pas pensé que cela défie la logique et la raison. le PO était une question assez décente, il avait juste besoin d'être dirigé dans la bonne direction, pas un grand verre de suffisance.
user1783229
1
vous pouvez toujours ajouter n'importe quel nombre de paramètres supplémentaires en utilisant data-tout et en utilisant .data ('n'importe quoi') partout où vous feriez un .value autrement. il suffit d'échanger n'importe quoi pour value2 ou similaire à votre goût

Réponses:

320

Balisage 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>

Code

// 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');

Voir ceci comme un exemple de travail utilisant jQuery ici: http://jsfiddle.net/GsdCj/1/
Voir ceci comme un exemple de travail utilisant du JavaScript brut ici: http://jsfiddle.net/GsdCj/2/

En utilisant des attributs de données HTML5, vous pouvez ajouter des données supplémentaires aux éléments d'une manière syntaxiquement valide qui est également facilement accessible à partir de jQuery.

Phrogz
la source
@jimsmith Oui, ce sera le cas. (Si vous trouvez l'une de ces réponses utile, vous devriez la voter. Vous devriez également en marquer une comme "acceptée" si vous estimez qu'elle résout le mieux votre problème.)
Phrogz
1
Quoi? Non, ce ne sera pas le cas. Il fonctionnera dans tous les navigateurs prenant en charge les attributs de données HTML5.
glomad
13
@ithcy Tous les navigateurs prennent en charge (et ont depuis plus de 10 ans) des attributs "invalides" dans le balisage, et les obtiennent / les définissent via le DOM. Les attributs "données" HTML5 ne sont que des attributs personnalisés avec un schéma de dénomination et une nouvelle norme qui les déclare légaux.
Phrogz
@Phrogz Je le sais. Ce n'est pas une question de navigateurs "prenant en charge" des attributs invalides, mais plutôt une question de les ignorer. Il n'y a vraiment pas d'autre moyen d'écrire un navigateur Web utilisable :) Cependant, je pense qu'il est difficile d'appeler les attributs de données "syntaxiquement valides" - cela dépend de votre contexte. Si vous avez un doctype HTML5, alors oui, ils sont valides. Sinon, ils ne le seront pas et entraîneront l'échec de la validation W3C.
glomad
@ithcy Les navigateurs « ignorer » les dans la mesure où ils font rien de spécial avec eux, mais ils ne pas les ignorer dans la mesure où ils sont entièrement disponibles pour getAttribute(). Je répondais à votre affirmation initiale selon laquelle ma réponse ne fonctionnerait pas dans tous les navigateurs. Je maintiens ma déclaration selon laquelle cela fonctionnera dans «tous» les navigateurs (pour une définition assez généreuse de «tous» dans ce cas). Montrez-moi un navigateur qui prend en charge jQuery mais ne fonctionne pas avec ces attributs de données - même avec un doctype non HTML5 - et je mangerai mes mots.
Phrogz
5

Pour moi, il semble que vous vouliez créer un nouvel attribut? Veux-tu

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

Pour ce faire, vous pouvez faire

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

Et puis pour le récupérer, vous pouvez utiliser

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

Ce ne sera pas un code valide, mais je suppose que cela fait le travail.

mikesir87
la source
L'autre méthode consiste à utiliser $ (selector) .data ('value2', "your value") et $ (selector) .data ('value2') pour récupérer ... qui est toujours valide.
mikesir87
Eh bien, il ne serait pas syntaxiquement valide d'avoir des attributs non standard dans le balisage d'origine, mais a) Je n'ai jamais vu de navigateur depuis l'époque de NS4 avoir un problème avec cela, et b) si vous pouvez modifier le DOM produire quelque chose qui est "syntaxiquement invalide", est-ce vraiment?
Phrogz
oui, c'est vraiment ... invalide. pourquoi utiliser des propriétés arbitraires lorsque les propriétés data- * ont été définies dans le standard html5.
stephenbayer
3
Comme le mentionne @stephenbayer ... la bonne façon de faire maintenant consiste à utiliser les propriétés data- * prises en charge par html5. Ces propriétés n'étaient pas vraiment présentes / très utilisées lors de la réponse initiale en 2010 :)
mikesir87
-1

Balisage HTML / JSP:

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

CODE JQUERY: Événement: changement

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

Avoir un élément libelle.val () ou libelle.text ()

Fadid
la source
<form: option data-libelle-compte = "$ {compte.libelle} data-raison =" $ {compte.raison} "data-compte =" $ {compte.numero} "> <c: out value =" $ {compte.libelleCompte} MAD "/> </ form: option>
Fadid
-4

Pour stocker une autre valeur dans certaines options:

$("#select").append('<option value="4">another</option>')
Kyle
la source