Aggiunta di dati aggiuntivi per selezionare le opzioni utilizzando jQuery


139

Spero molto semplice domanda.

Ho la solita <select>scatola come questa

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

Posso ottenere il valore selezionato (usando $("#select").val()) e il valore di visualizzazione dell'articolo selezionato (usando $("#select :selected").text().

Ma come posso memorizzare come un valore aggiuntivo nel <option>tag? Vorrei essere in grado di fare qualcosa di simile <option value="3.1" value2="3.2">other</option>e ottenere il valore value2dell'attributo (che sarebbe 3.2 nell'esempio).


vuoi aggiungere un oggetto nella casella di selezione? o vuoi essere in grado di selezionarne più di uno alla volta e ottenere i risultati?
zsalzbank,

no, voglio semplicemente che ci sia come value2 = "" nel tag <option>, ma non funziona
jim smith

La tua domanda non è chiara (per me, comunque). Cosa intendi con "memorizza un altro valore nelle opzioni selezionate"? Vuoi dire che vuoi aggiungere una nuova opzione alla selezione, che apparirebbe all'utente una volta aperto?
Phrogz,

15
non sfida la logica o la ragione, cavolo. ho una domanda / caso simile in modo da poter confrontare i valori tra le selezioni e salvare il testo delle proprie opzioni sulle opzioni dell'altro mantenendo i valori / i testi di quella selezione, in un modo che sembra possibile è attraverso i dati come indica la risposta sotto. solo perché non ci hai pensato non significa che sfida la logica e la ragione. l'OP era una domanda abbastanza decente che aveva solo bisogno di essere puntato nella giusta direzione, non di avere un gran bicchiere di compiacimento.
user1783229

1
puoi sempre aggiungere un numero qualsiasi di parametri extra usando data-qualcosa e usando .data ('qualunque cosa') ovunque tu faccia un valore. altrimenti. scambia semplicemente qualcosa per value2 o simile a tuo piacimento

Risposte:


320

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

Codice

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

Guarda come un esempio funzionante usando jQuery qui: http://jsfiddle.net/GsdCj/1/
Vedi questo come un esempio funzionante usando JavaScript semplice qui: http://jsfiddle.net/GsdCj/2/

Utilizzando gli attributi di dati da HTML5 è possibile aggiungere ulteriori dati agli elementi in modo sintatticamente valido che sia anche facilmente accessibile da jQuery.


@jimsmith Sì, lo farà. (Se ritieni che una di queste risposte sia utile, dovresti
votarle

1
Che cosa? No non lo farà. Funzionerà in tutti i browser che supportano gli attributi di dati HTML5.
glomad

13
@ithcy Tutti i browser supportano (e hanno per oltre 10 anni) attributi "non validi" nel markup e ottengono / impostano questi attraverso il DOM. Gli attributi "dati" HTML5 sono solo attributi personalizzati con uno schema di denominazione e un nuovo standard che li dichiara legali.
Phrogz,

@Phrogz lo so. Non si tratta di browser che "supportano" attributi non validi, ma piuttosto di ignorarli. Non c'è davvero nessun altro modo di scrivere un browser Web utilizzabile :) Tuttavia penso che sia un tratto chiamare attributi di dati "sintatticamente validi" - dipende dal contesto. Se hai un doctype HTML5, allora sì, sono validi. Altrimenti non lo sono e causeranno il fallimento della convalida del W3C.
Glomad,

@ithcy I browser li "ignorano" nella misura in cui non fanno nulla di speciale con loro, ma non li ignorano nella misura in cui sono completamente disponibili getAttribute(). Stavo rispondendo alla tua affermazione iniziale che la mia risposta non avrebbe funzionato in tutti i browser. Attendo la mia affermazione che funzionerà in tutti i browser (per una definizione piuttosto generosa di "tutto" in questo caso). Fammi vedere un browser che supporta jQuery ma non funziona con questi attributi di dati - anche con un tipo di documento non HTML5 - e mangerò le mie parole.
Phrogz,

5

Per me, sembra che tu voglia creare un nuovo attributo? Vuoi

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

Per fare questo, puoi farlo

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

E poi per recuperarlo, puoi usare

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

Non sarà un codice valido, ma immagino che funzioni bene.


L'altro metodo consiste nell'utilizzare $ (selettore) .data ('valore2', "il tuo valore") e $ (selettore) .data ('valore2') per recuperare ... che è ancora valido.
Mikesir87,

Bene, non sarebbe sintatticamente valido avere attributi non standard nel markup originale, ma a) non ho mai visto nessun browser da quando NS4 ha avuto problemi con questo, e b) se è possibile modificare il DOM produrre qualcosa che è "sintatticamente non valido", vero?
Phrogz,

sì, è davvero ... non valido. perché usare proprietà arbitrarie quando le proprietà data- * sono state definite nello standard html5.
stephenbayer,

3
Come menziona @stephenbayer ... il modo corretto per farlo ora è usare le proprietà data- * supportate da html5. Quelle proprietà non erano davvero in circolazione / in uso pesante quando originariamente risposero nel 2010 :)
mikesir87


-1

Markup HTML / JSP:

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

CODICE JQUERY: Evento: modifica

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

Per avere un elemento libelle.val () o libelle.text ()


<modulo: opzione data-libelle-compte = "$ {compte.libelle} data-raison =" $ {compte.raison} "data-compte =" $ {compte.numero} "> <c: out value =" $ {compte.libelleCompte} MAD "/> </ form: opzione>
Fadid

-4

Per memorizzare un altro valore nelle opzioni selezionate:

$("#select").append('<option value="4">another</option>')
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.