salve a tutti,
propongo qui di seguito un paio di funzioni JavaScript riguardo la gestione del tag select (il classico menu a tendina HTML), dato che ultimamente ho letto numerosi thread relativi a questa problematica.
doverosa, in quest'ottica, qualche notazione.
supponiamo di avere un form, di nome f, e supponiamo che al suo interno sia presente un tag select di nome menu.
quali sono, all'atto pratico, i parametri da tenere in considerazione quando si ha a che fare con i tag select? eccone qui un elenco, in relazione al nostro esempio:
dunque, ogni elemento del menu presenta due aspetti:codice:var menu=document.f.menu; // riferimento al tag select var menu.options; // array che contiene le voci del menu var menu.options.length; // numero di voci del menu var menu.selectedIndex; // indice della voce selezionata var menu.options[menu.selectedIndex].value; // valore della voce selezionata var menu.options[menu.selectedIndex].text; // testo della voce selezionata
- un "text", che sarebbe l'etichetta che compare nel menu a tendina;
- un "value", che rappresenta il valore associato al "text" selezionato.
bene, adesso possiamo illustrare le funzioni.
funzione 1: menu a tendina contenente link, da utilizzare per cambiare pagina all'atto della scelta (un classico)
descrizione: tale funzione consente di creare un menu a tendina composto da link che, alla stregua di quello presente in questo forum, permette di implementare un "jump menu": appena viene selezionato un elemento, viene caricato il relativo URL.
pagina di esempiocodice:<select name="menu" onChange="window.location.href=this.options[this.selectedIndex].value;"> <option value="http://www.repubblica.it">Repubblica.it</option> <option value="http://html.it">HTML.it</option> <option value="http://www.ferrari.it">Ferrari</option> </select>
funzione 2: tag select dinamico (contenuto di un tag select relativo alla selezione fatta in un altro tag select)
descrizione: avendo due tag select, questa funzione associa il contenuto del secondo tag select alla selezione effettuata nel primo.
prima di tutto andiamo a creare un array di oggetti, in pratica l'insieme degli elementi che potrebbero comparire nel menu a contenuto dinamico:
come vedete, ogni elementi dell'array è una terna che presenta, rispettivamente, il text dell'elemento, il relativo value e un indicatore, identico quest'ultimo al value di un elemento nel primo menu.codice:var elementi = new Array( {text:"Repubblica", value:"http://www.repubblica.it", indicatore:"it"}, {text:"HTML.it", value:"http://www.html.it", indicatore:"it"}, {text:"Rai", value:"http://www.rai.it", indicatore:"it"}, {text:"CNN", value:"http://www.cnn.com", indicatore:"en"}, {text:"Nasa", value:"http://www.nasa.gov", indicatore:"en"} );
ecco qui la funzione che si occupa del popolamento del secondo menu:
in pratica la funzione scandisce tutto l'array elementi e, per ogni elemento, verifica che ci sia una corrispondenza fra l'indicatore e il parametro "valore" della funzione, che rappresenta il value dell'elemento selezionato nel primo menu.codice:function travasa(dove, valore) { var k=0; for (j=0; j<elementi.length; j++) if (elementi[j].indicatore==valore) { dove.options[k]=new Option(elementi[j].text, elementi[j].value); k++ } dove.options.length=k; }
da notare che un elemento del menu viene creato con questa sintassi:
alla fine della funzione, viene impostata anche la lunghezza dell'array option associato al secondo menu: tale lunghezza (ossia il numero di elementi del menu) non è altro che il valore del contatore k.codice:menu.options[i]=new Option("HTML.it", "http://www.html.it");
la chiamata della funzione è la seguente:
il tutto è dunque:codice:<select name="s1" id="s1" onChange="travasa(this.form.s2, this.options[this.selectedIndex].value);"> <option value="it">Siti italiani</option> <option value="en">Siti inglesi</option> </select>
pagina di esempiocodice:<script language="JavaScript"> <!-- var elementi = new Array( {text:"Repubblica", value:"http://www.repubblica.it", indicatore:"it"}, {text:"HTML.it", value:"http://www.html.it", indicatore:"it"}, {text:"Rai", value:"http://www.rai.it", indicatore:"it"}, {text:"CNN", value:"http://www.cnn.com", indicatore:"en"}, {text:"Nasa", value:"http://www.nasa.gov", indicatore:"en"} ); function travasa(dove, valore) { var k=0; for (j=0; j<elementi.length; j++) if (elementi[j].indicatore==valore) { dove.options[k]=new Option(elementi[j].text, elementi[j].value); k++ } dove.options.length=k; } //--> </script>
funzione 3: scelta degli elementi di un tag select in relazione al contenuto di un campo text
descrizione: scrivendo in un campo text, in un menu a tendina rimangono solo gli elementi i cui value contengono almeno una lettera identica a una di quelle contenute nel campo text.
pagina di esempiocodice:<!-- <script language="JavaScript"> var valori=new Array(); var testi=new Array(); function CaricaVettore() { for (i=0; i<document.form1.elementi.options.length; i++) { valori[i]=document.form1.elementi.options[i].value; testi[i]=document.form1.elementi.options[i].text; } } function Genera(e,f) { var j=0; if (e!="") { var myre=new RegExp("^"+e,"g"); for (i=0; i<testi.length; i++) if ((testi[i].match(myre))) { f.elementi.options[j]=new Option(testi[i], valori[i]); j++; } if (j!=0) f.elementi.options.length=j; else { f.elementi.options[0]=new Option('nessun valore', 'nessun valore'); f.elementi.options.length=1; } } else { for (i=0; i<valori.length; i++) { document.form1.elementi.options[i]=new Option(testi[i], valori[i]); } document.form1.elementi.options.length=valori.length; } } //--> </script>
spero che le funzioni possano servire a qualcuno!
per chiarimenti o modifiche, come anche per correzioni e critiche, sono ovviamente a disposizione. ;)
man mano che creerò altre funzioni sul tag select, sarò contento di condividerle con voi pubblicandole in questo thread.
ciao! :)

Rispondi quotando
avevo lanciato io la moda, mi pare
