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:
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
dunque, ogni elemento del menu presenta due aspetti:
- 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.
codice:
<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>
pagina di esempio
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:
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"}
);
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.
ecco qui la funzione che si occupa del popolamento del secondo 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;
}
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.
da notare che un elemento del menu viene creato con questa sintassi:
codice:
menu.options[i]=new Option("HTML.it", "http://www.html.it");
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.
la chiamata della funzione è la seguente:
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>
il tutto è dunque:
codice:
<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>
pagina di esempio
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.
codice:
<!--
<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>
pagina di esempio
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! :)