Hinzufügen zusätzlicher Daten zur Auswahl von Optionen mit jQuery

139

Sehr einfache Frage, hoffe ich.

Ich habe die übliche <select>Box so

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

Ich kann den ausgewählten Wert (mithilfe von $("#select").val()) und den Anzeigewert des ausgewählten Elements (mithilfe von) abrufen $("#select :selected").text().

Aber wie kann ich einen zusätzlichen Wert im <option>Tag speichern ? Ich möchte in der Lage sein, so etwas zu tun <option value="3.1" value2="3.2">other</option>und den Wert des value2Attributs zu erhalten (im Beispiel wäre es 3.2).

Jim Smith
quelle
Sie möchten dem Auswahlfeld ein Element hinzufügen? oder Sie möchten in der Lage sein, mehrere gleichzeitig auszuwählen und die Ergebnisse zu erhalten?
Zsalzbank
Nein, ich möchte einfach, dass es im <option> -Tag einen Wert2 = "" gibt, aber das funktioniert nicht
Jim Smith
Ihre Frage ist nicht klar (für mich jedenfalls). Was meinst du mit "einen anderen Wert in den Auswahloptionen speichern"? Meinen Sie damit, dass Sie der Auswahl eine neue Option hinzufügen möchten, die dem Benutzer beim Öffnen angezeigt wird?
Phrogz
15
trotzt weder Logik noch Vernunft, meine Güte. Ich habe eine ähnliche Frage / einen ähnlichen Fall, damit ich die Werte zwischen den Auswahlmöglichkeiten vergleichen und den Text der Optionen der einen auf den Optionen der anderen speichern kann, während die Werte / Texte der Auswahl beibehalten werden. Eine Möglichkeit, die möglich erscheint, sind Daten, wie die Antwort unten zeigt. Nur weil DU nicht daran gedacht hast, heißt das nicht, dass es Logik und Vernunft widerspricht. Das OP war eine anständige Frage, die er nur in die richtige Richtung richten musste, um kein großes Glas Selbstgefälligkeit zu bekommen.
user1783229
1
Sie können jederzeit eine beliebige Anzahl zusätzlicher Parameter hinzufügen, indem Sie data-any und .data ('irgendetwas') verwenden, wo immer Sie sonst einen .value ausführen würden. Tauschen Sie einfach etwas gegen value2 oder ähnliches aus, das Ihren Wünschen entspricht

Antworten:

320

HTML-Markup

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

Sehen Sie dies als Arbeitsbeispiel mit jQuery hier: http://jsfiddle.net/GsdCj/1/
Sehen Sie dies als Arbeitsbeispiel mit einfachem JavaScript hier: http://jsfiddle.net/GsdCj/2/

Durch die Verwendung von Datenattributen von HTML5 können Sie zusätzliche Daten zu den Elementen in eine syntaktisch gültigen Weise hinzufügen , die auch leicht von jQuery ist.

Phrogz
quelle
@jimsmith Ja, das wird es. (Wenn Sie eine dieser Antworten nützlich finden, sollten Sie sie abstimmen. Sie sollten auch eine als "akzeptiert" markieren, wenn Sie festgestellt haben, dass sie Ihr Problem am besten löst.)
Phrogz
1
Was? Nein, wird es nicht. Es funktioniert in allen Browsern, die HTML5-Datenattribute unterstützen.
Glomad
13
@ithcy Alle Browser unterstützen (und haben seit mehr als 10 Jahren) "ungültige" Attribute im Markup und erhalten / setzen diese über das DOM. HTML5-Datenattribute sind nur benutzerdefinierte Attribute mit einem Namensschema und einem neuen Standard, der sie für legal erklärt.
Phrogz
@Phrogz Ich weiß das. Es geht nicht darum, dass Browser ungültige Attribute "unterstützen", sondern darum, sie zu ignorieren. Es gibt wirklich keine andere Möglichkeit, einen verwendbaren Webbrowser zu schreiben :) Ich denke jedoch, dass es schwierig ist, Datenattribute als "syntaktisch gültig" zu bezeichnen - dies hängt von Ihrem Kontext ab. Wenn Sie einen HTML5-Doctype haben, sind diese gültig. Andernfalls ist dies nicht der Fall und führt dazu, dass die W3C-Validierung fehlschlägt.
Glomad
@ithcy Die Browser "ignorieren" sie, sofern sie nichts Besonderes mit ihnen tun, aber sie ignorieren sie nicht , sofern sie vollständig verfügbar sind getAttribute(). Ich habe auf Ihre ursprüngliche Behauptung geantwortet, dass meine Antwort nicht in allen Browsern funktionieren würde. Ich stehe zu meiner Aussage, dass es in "allen" Browsern funktionieren wird (für eine ziemlich großzügige Definition von "alle" in diesem Fall). Zeigen Sie mir einen Browser, der jQuery unterstützt, aber mit diesen Datenattributen nicht funktioniert - auch nicht mit einem Nicht-HTML5-Doctype - und ich werde meine Worte essen.
Phrogz
5

Für mich klingt es so, als ob Sie ein neues Attribut erstellen möchten? Willst du

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

Um dies zu tun, können Sie tun

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

Und um es dann abzurufen, können Sie verwenden

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

Es wird kein gültiger Code sein, aber ich denke, es macht den Job.

mikesir87
quelle
Die andere Methode besteht darin, $ (Selektor) .data ('Wert2', "Ihr Wert") und $ (Selektor) .data ('Wert2') zu verwenden, um ... abzurufen, was noch gültig ist.
mikesir87
Nun, es wäre syntaktisch nicht gültig, nicht standardmäßige Attribute im ursprünglichen Markup zu haben, aber a) ich habe seit den Tagen von NS4 keinen Browser mehr gesehen und b) wenn Sie das DOM ändern können etwas zu produzieren, das "syntaktisch ungültig" ist, ist es wirklich?
Phrogz
Ja, es ist wirklich ... ungültig. Warum sollten Sie beliebige Eigenschaften verwenden, wenn Daten- * Eigenschaften im HTML5-Standard definiert wurden?
Stephenbayer
3
Wie @stephenbayer erwähnt ... ist der richtige Weg, dies jetzt zu tun, die Verwendung der von HTML5 unterstützten Daten- * Eigenschaften. Diese Eigenschaften waren nicht wirklich in der
Nähe
-1

HTML / JSP-Markup:

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

JQUERY CODE: Ereignis: Änderung

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

Ein Element libelle.val () oder libelle.text () haben

Fadid
quelle
<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

So speichern Sie einen anderen Wert in ausgewählten Optionen:

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