Newsgroup: it.comp.lang.javascript
Titolo: Tipo le combo di access, si puo'?

Ciao
Applicazione su INTRANET
Tabella MySQL di dati anagrafici (circa 6000 record)
Programmatore: agli inizi con JS.
L'utente deve poter digitare Cognome+Nome per scegliere il record da 
visualizzare. Io vorrei pero' che tale scelta funzionasse come le combo 
di access in cui digiti "TRAP" e lui gia' ti scrive "TRAPPATTONI" e 
sotto ti elenca tutti quelli che iniziano per "TRAP".
Inoltre non vorrei interrogare il server per aggiornare l'elenco ad ogni 
tasto premuto. Siccome e' una tabella che cambia raramente, vorrei 
sfruttare in qualche modo la cache del client, forse creando col PHP un 
file .js tipo:
var All_Cognomi_Nomi = new Array ("Alberti Alberto", "Alberti Anna",
... , ... ,...,
... , "Zurzolo Vito")
(per 6000 nominativi sarebbero piu' di 100 KB)
Poi magari, con JS, ad ogni tasto premuto popoleri una tabella (o una 
Select?) con i nomi che fanno match con quanto finora digitato.
CRedevo che questa mia fosse un'esigenza abbastanza sentita, eppure ho 
cercato e ricercato ma in rete non ho trovato nulla di simile. Anche 
solo per avere qualche spunto.
Avete qualche suggerimento (o qualche link) da cui partire nella mia 
impresa?
Grazie per la pazienza
Marco

 sotto ti elenca tutti quelli che iniziano per "TRAP".
Mozilla (bonta' sua!) fa lo stesso lavoro in automatico semplicemente 
cliccando sulla select e cominciando a digitare.
IE purtroppo (provato solo 5.5) ogni lettera digitata la considera come 
*prima* lettera.
Ergo, ripiega su questo: 
http://www.jsdir.com/staffscripts/script065.asp
-- 
Ciao, Riccardo
------------------------------------------------------------------------
http://www.jsdir.com
  ---- Bring Your Site To Life!!!!
http://www.wmtools.it
 ---- WebMasterTools - Servizi per il tuo sito
http://www.dev2dev.it
 ---- La rete ha connesso nuove particelle - D2D006
------------------------------------------------------------------------
Per rispondere: togli i PUNTO .

 Ergo, ripiega su questo: 
http://www.jsdir.com/staffscripts/script065.asp
Grazie per la segnalazione. Il sito e' davvero notevole, c'e' un sacco 
di roba di cui avro' bisogno presto ;-)
Per il mio problema ho deciso di caricare i 5800 Cognomi+Nomi 
direttamente nell'HTML. La pagina diventa pero' 160 KB :-(
Vabbe' che girera' su una intranet, chiuderemo un occhio.
Ho modificato la routine che mi hai segnalato perche' mi sembrava un po' 
lenta. Ho trovato in rete una ricerca binaria in Javascript e l'ho 
adattata al caso mio. E' molto veloce, non credevo, infatti mi spaccavo 
la testa cercando metodi per tenere la combo piu' vuota possibile, e 
invece :-)
Arigrazie & Ciao
Marco
Se puo' servire questo e' il codice
----------------------------
La form HTML:
<FORM NAME="modulo">
<INPUT TYPE="text" NAME="input" VALUE="Scrivi..." onKeyUp="Cerca()" 
onFocus="this.select()"> <BR>
<select name="CgNm">
<option....
....
</select>
-----------------------
La funzione Cerca() fa una ricerca binaria del testo digitato tra le 
righe option di una select
(NB: LA RICERCA BINARIA FUNZIONA SOLO SE L'ARRAY E' ORDINATO)
function Cerca()
{
    with (document.modulo)
    {	StringToSearch=input.value.toUpperCase();	
       	if (StringToSearch.length > 0)		{
	  		Ind= binSearch(CgNm.options,0,CgNm.options.length,StringToSearch);
			if (CgNm.options[Ind].text.indexOf(StringToSearch)==0)
				CgNm.selectedIndex=Ind;
			else
				CgNm.selectedIndex=-1;	}
	}
}
--------------------
Funzione ricorsiva che fa la ricerca binaria di una stringa (x) 
nell'array options (arr)
function binSearch(arr, ini, end, x)
{    var medio = Math.floor((ini + end) / 2);
     if (ini >= end) return ini;
     if (arr[medio].text > x) return binSearch(arr, ini, medio , x);
     else if (arr[medio].text < x)
         return binSearch(arr, medio + 1, end, x);
     else
         return medio;
}

 invece :-)
Non ci avevo pensato ad ottimizzare la ricerca (beh, su Internet anch'io 
cercherei una soluzione alternativa per la massa di dati piuttosto).
La implemento nello script, ok?


 La implemento nello script, ok?
OK
;-)
Marco