Newsgroup: it.comp.lang.javascript
Titolo: elementi di una select province-> comuni

Salve a tutti
ho una pagina con una form per una registrazione di un utente.
ci sono le due caselle provincia e comune che sull onchange della
provincia mi seleziona solo i comuni di quella provincia.
il codice javascript l ho un po modificato in base alle mie esigenze.
il problema e' che sull onchange della provincia mi mette i comuni di
quella provincia ma mi mette anche tante  <option> in bianco tanti
sono i restanti comuni di tutte le province.
Volevo sapere se qualcuno puoi aiutarmi a far in modo che metta solo i
comuni della provincia selezionata senza aggiungere i valori in
bianco.
il codice e' questo:
<script language="JavaScript" type="text/javascript">
function filtery(pattern, list){
 /*
 /*
 filtery(pattern, list)
 pattern: a string of zero or more characters by which to filter the
list
 list: reference to a form object of type, select
 if the dropdown list passed in hasn't
 already been backed up, we'll do that now
 */
 if (!list.bak){
   /*
   We're going to attach an array to the select object
   where we'll keep a backup of the original dropdown list
   */
   list.bak = new Array();
   for (n=0; n<list.length; n++){
     list.bak[list.bak.length] = new Array(list[n].value,
list[n].text);
     //alert (list[n].value+' '+list[n].text)
   }
 }
 /*
 We're going to iterate through the backed up dropdown
 list. If an item matches, it is added to the list of
 matches. If not, then it is added to the list of non matches.
 */
 match = new Array();
 nomatch = new Array();
 for (n=0;n<list.bak.length;n++){
  //alert(list.bak[n]
[0].toLowerCase().indexOf(pattern.toLowerCase()));
  if(list.bak[n][0].toLowerCase().indexOf(pattern.toLowerCase())!=-1){
	 match[match.length] = new Array(list.bak[n][0], list.bak[n][1]);
   }else{
    nomatch[nomatch.length] ='' //new Array(list.bak[n][0], list.bak[n]
[1]);
   //alert(list.bak[n][0]);
   }
 }
 /*
 Now we completely rewrite the dropdown list.
 First we write in the matches, then we write
 in the non matches
 */
 for (n=0; n<match.length; n++){
   list[n].value = match[n][0];
   list[n].text = match[n][1];
 }
 for (n=0; n<nomatch.length; n++){
   list[n+match.length].value ='' //nomatch[n][0];
   list[n+match.length].text =''// nomatch[n][1];
 }
 /*
 Finally, we make the 1st item selected - this
 makes sure that the matching options are
 immediately apparent
 */
 list.selectedIndex=0;
}
// -->
</script>
<form id="form1" name="form1" method="post" action="">
      <p>
     <label>provincia
           <select name="prov2" id="prov2"
onchange="filtery(this.value,this.form.comune)">>
             <option value="Selezionare una provincia"
selected="selected"></option>
             <option value="084">Agrigento</option>
             <option value="006">Alessandria</option>
           </select>
         </label>
         <label>comune
           <select name="comune" id="comune" />
         	    <option value="Selezionare un comune"
selected="selected"></option>
             <option value="028">Abano Terme</option>
             <option value="098">Abbadia Cerreto</option>
             <option value="097">Abbadia Lariana</option>
             <option value="052">Abbadia San Salvatore</option>
             <option value="095">Abbasanta</option>
             <option value="068">Abbateggio</option>
             <option value="015">Abbiategrasso</option>
             <option value="047">Abetone</option>
             <option value="076">Abriola</option>
             <option value="088">Acate</option>
             <option value="071">Accadia</option>
             <option value="004">Acceglio</option>
             <option value="077">Accettura</option>
             <option value="066">Acciano</option>
             <option value="057">Accumoli</option>
             <option value="076">Acerenza</option>
             <option value="065">Acerno</option>
             <option value="063">Acerra</option>
             <option value="087">Aci Bonaccorsi</option>
             <option value="087">Aci Castello</option>
             <option value="087">Aci Catena</option>
             <option value="087">Aci Sant'Antonio</option>
             <option value="087">Acireale</option>
             <option value="043">Acquacanina</option>
             <option value="060">Acquafondata</option>
             <option value="078">Acquaformosa</option>
             <option value="017">Acquafredda</option>
             <option value="041">Acqualagna</option>
         </form>
ho messo solo alcune province e comuni se no e' lunghissima...
grazie per l aiuto che mi darete.

 comuni della provincia selezionata senza aggiungere i valori in bianco.
ok, ma, domanda: e se scelgo una provincia e malauguratamente ho 
sbagliato? Visto che cancelli tutti i comuni NON della provincia, non 
troverai mai gli altri ...
comunque sia, così al volo, sarà una function tipo questa:
function filtra(sender,output) {
 for(var objs=output.options,x=objs.length-1;x>=0;x--) 
  if(objs[x].value!=sender.value) 
	output.remove(x);
}

 - Mostra testo citato -
Ciao grazie innanzitutto per l'aiuto... piu tardi provo...
Se sbagli provincia non ci dovrebbe essere problema perche la prima
volta fa un "backup" di tutti i comuni in un array (list.bak) almeno
credo... ;)

 credo... ;)
se usi la function che ti ho dato non fa alcun backup, se usi quella che 
hai scopiazzato non rimuove le option dalla select ma le "svuota" ...
oggigiorno queste cose si fanno con xmlhttp ("ajax"); altrimenti devi 
crearti un array client-side dei comuni, e popolare la select con quei 
valori (ma saranno parecchi, non so se ne vale la pena e quale potrebbe 
essere la velocità, e devi rifare lo script)


Si lo so che si fanno con ajax ma si aprirebbe un altra capitolo...
ma non basterebbe in qualche modo dopo che ha fatto il backup, ha
popolato la select con le option giuste rispetto alla provincia, ha
messo le option vuote rimuovere le option vuote dalla select? senza
cancellare il "backup" che poi altro non e' che l array dei comuni
client-side?
Grazie ancora

 client-side?
e perché allora popoli la select all'inizio? All'avvio crea un array con 
i comuni, non metterli nella select e *POI* crei un backup ...
Devi cambiare logica ... ma, come dicevo, i comuni sono tantissimi, non 
saprei dirti per la velocità: dovresti a ogni scelta di provincia 
passarti un migliaio di valori e popolare la select con solo quelli 
corretti.

 sono i restanti comuni di tutte le province.
Come ti ha suggerito Cristiano, anche io non considererei alternative 
non ajax, i comuni in italia sono tantissimi, ti tieni una pagina 
mostruosamente pesante, ed anche parecchio inefficiente nella ricerca.
Io ti incollo una funzione presa da una mia pagina:
$("select[name|=prov]").change(function () {
             if ($("select[name|=prov] option:selected").val()) {
                 $.post("includes/select_comuni.php", { provincia: 
$("select[name|=prov] option:selected").val()},
                    function(data){
                      $("#comuni").html(data);
                    });
             } else {
                 $("#comuni select").find("option:gt(0)").remove();
             }
        })
e il pezzo rilevante di html:
<select class="inserimenti valid" name="prov">
<option value="">---</option>
<option value="084">AG</option>
<option value="006">AL</option>
<option value="042">AN</option>
<option value="007">AO</option>
.
.
.
</select>
<td id="comuni" class="seconda_colonna">
<select class="inserimenti" name="comune">
<option value="">---</option>
<option value="084001">Agrigento</option>
<option value="084002">Alessandria della Rocca</option>
.
.
.
</select>
</td>
Usa jquery e di fatto chiama una pagina php passandogli l'istat della 
provincia (il value della select delle province), la pagina php 
restituisce un html con dentro la select e le option popolate dei comuni 
relativi.
In + nelle province il primo elemento � statico senza value, il che vuol 
dire che quando si seleziona quella option rimuove tutte le option dalla 
select dei comuni (lasciando solo la prima che � anche in questo caso � 
statica senza value, cos� viene facile fare una successiva validazione).
Se puoi usare scripting server side (che sia php o altro) io userei una 
soluzione di questo tipo.
Se non puoi, valuterei cmq le performance di una chiamata ajax su un 
json e che venga parsato dal tuo script e popoli la seconda select con i 
risultati accettabili, almeno diluisci il carico tra il caricamento 
della pagina e la prima interrogazione al file dei comuni.
Ciauz
-- 
Z.

 
ma usare un po di detersivo, e json per ste cose ?
perche i comuni sono solo 8100
ci metti la meta del tempo con un db e chiamate lato sever
1a chiamata le province popolata all'avvio della pagina
i comuni nella seconda chiamata


Vi ringrazio Per l'aiuto....
Ho deciso per terminare in breve quello che devo fare di fare
sull'onchange della provincia l'apertura di una pagina aspx dove
bisogna selezionare il comune corrispondente e lo scrive nella textbox
nella pagina.
mi trovo decisamente meglio a usare script server side.
Avrei voluto usare ajax (anche per imparare qualcosa di nuovo) ma di
tempo ne ho poco..intanto lo facci ocosi' e poi applicandomi un
pochino lo trasformero in ajax (almeno spero) .
Grazie ancora per l aiuto.