Newsgroup: it.comp.lang.javascript
Titolo: XMLHttpRequest e aggiornamento di vari elementi della pagina

Ciao a tutti,
ho un grosso problema a gestire una pagina in cui devo aggiornare
diversi elementi di un form.
Per farla breve, ho una serie di select (diciamo A, B, C e D);
scegliendo un'opzione di A il selettore B si aggiorna e mostra le
opzioni possibili risultanti dalla voce scelta nel selettore A.
Scegliendo un'opzione in B il selettore C si aggiorna in base alle voci
scelte in A e B, ecc (in pratica affino la ricerca nei dati presenti in
un db)
Per aggiornare i vari select devo riferirmi al loro name (o id).
Ho creato una funzione (aggiornaSelect) che, appena riceve l'ok e il
responseText aggiorna il select. Il problema è che, siccome questa
fuzione viene assegnata all'evento onreadystatechange (in un altra
funzione che gestisce la chiamata al server e il passaggio dei
parametri), non so come fare a passarle un valore, come ad esempio il
name della select da aggiornare.
L'alternativa sarebbe scrivere tante funzioni quante sono le select da
aggiornare, ma credo sia un inutile spreco di codice, e immagino ci sia
un sistema migliore.
Ho dato un'occhiata alla reference e in rete, ma non ho trovato niente
di utile in proposito...
La domanda è sempre quella: qualche suggerimento?  : )
-- 
Mr. Fix @ work

 Mr. Fix @ work
Penso di aver capito il problema, ma mi sembra un problema già
risolto......
nel senso che le 4 select hanno ognuna un nome.
immagino con all'evento onChange di una select richiami la
funzione che carica la successiva.
Se alla funzione passi anche il nome della select successiva, hai
risolto, no?
Forse non ho capito il tuo quesito, prova a postare il codice
interessato ;)
Saluti

 interessato ;)
Ora ho il server spento, comunque è una cosa del genere:
function aggiornaElemento() {
   // ricevo il testo e memorizzo in una variabile
 
   document.nomeForm.nomeElemento.innerHTML = testoRicevuto;
}
Mentre nella funzione che prepara i dati ho:
function preparaDati(elemento) {
   // In base al parametro elemento preparo i dati
 
   XMLHttpRequest.onreadystatechange = aggiornaElemento;
}
In pratica riesco a passare il nome dell'elemento fino alla prima
funzione, ma non a quella assegnata al metodo onreadystatechange
Spero di non aver confuso ulteriormente le idee... : )


 so come si fa) a passare un parametro a quella funzione
non fai prima a passarlo direttamente nella responseText? all'inizio ci
metti un bel <campo>ID</campo> e lo rimuovi nell'onreadystatechange.
-- 
"Emancipate yourselves from mental slavery;
None but ourselves can free our minds"
									    B.M.

 }
Ordunque, le soluzioni son più o meno le solite. Variabile globale,
incapsulare tutto in un oggetto sigleton, closure, o far rimbalzare
l'id/name da client a server.
Se opti per l'ultimo caso, e i browser che utilizzi hanno un buon supporto
di XmlHttpRequest, il metodo più indolore per te sarebbe passare il tutto
tramite http header; in questo modo non "sporchi" il responseText di
risposta, e non devi rivedere la logica che hai fin'ora utilizzato per
l'output.
-- 
~ "La malinconia è la felicità di esser tristi." (Victor Hugo)

 }
Closure.
  function aggiornaElemento(elemento) {  ...  }
  function preparaDati(elemento) 
  {
    XMLHttpRequest.onreadystatechange 
        = function() { aggiornaElemento(elemento); };
 }
MM

 metti un bel <campo>ID</campo> e lo rimuovi nell'onreadystatechange.
Si, hai ragione, inizialmente avevo pensato ad un metodo simile,
mettendo un separatore tipo | (senza tag), però se riesco ad evitare di
splittare il risultato preferisco... : )
Diciamo che la tenevo come soluzione di ripiego...


 l'output.
Interessante anche questa soluzione, ma per ora opto per la variabile
globale... Sto testando il tutto ora e mi pare non ci siano
controindicazioni...
Thanks as usual, se passi dalla Liguria una "minerale sgasata" non te la
leva nessuno... ; )


  }
Questo è un altro approccio interessante ma mi chiedo, a titolo di
studio, quali sono i vantaggi rispetta alla dichiarazione di una
variabile globale nella prima funzione?
Maggiori prestazioni? Ottimizzazione delle risorse? Ottimizzazione della
memoria?  Giusto per imparare qualcosa di nuovo... ^_^


 variabile globale nella prima funzione?
Eviti di avere a spasso una variabile globale. Attualmente non è considerata
una "best practices" nella programmazione OOP usare variabili globali.
Motivo, tra l'altro, per cui è nato il design pattern "singleton".
Inoltre ci sono dei casi in cui non è possibile usare una variabile globale.
Pensa se tu avessi un oggetto che deve svolgere quel compito, e diverse
istanze di quell'oggetto.
Le closure, però, non sono da usare così alla leggera. Sono tra le cause
prime di memory leak nei browser, soprattutto in IE (quantomeno IE<7); e la
persistenza di una variabile viene modificata radicalmente rispetto al suo
"naturale" corso. In sintesi: usale, se sai usarle (spesso capita di fare
closure senza rendersene conto) perché è uno strumento potente, ma da usare
con le pinze. E se possibile, almeno dal mio punto di vista, evitale se non
sono necessarie. 
Qua una lettura di approfondimento:
http://www.jibbering.com/faq/faq_notes/closures.html
-- 
~ "La realtà è ciò che, quando smetti di crederle, non va via."
(Philip K. Dick)

 
http://www.jibbering.com/faq/faq_notes/closures.html
Molto interessante, thanks!  : )


 Molto interessante, thanks!  : )
De nada. Quando hai bisogno, noi siam qua.
-- 
~ "L'arte non riproduce cio' che e' visibile,ma rende visibile cio' che non
sempre lo e'"
(Paul Klee)

 De nada. Quando hai bisogno, noi siam qua.
Porgo i miei ringraziamenti, non vivissimi ma in via di rianimazione...
