Newsgroup: it.comp.lang.javascript
Titolo: Loop infinito in Javascript

Ciao.
Sto' sviluppando un sito web basato su una struttura a due frame: il primo
(visibile all'utente) permette l'iterazione all'utente; il secondo frame
invece non è visibile e permette di eseguire azioni lato server facendo il
submit di sè stesso. Mi spiego meglio: quando ad esempio un utente inserisce
dei dati nel primo form e clicca sul pulsante "Salva" una funzione
Javascript salva questi dati in una textbox presente nel frame nascosto. Nel
secondo frame è attivo un timer che periodicamente esegue un'altra funzione
Javascript che controlla se la textbox contiene dati, se la textbox non
risulta vuota allora esegue un submit in modo che il codice php presente
lato server possa eseguire quanto specificato nella textbox...
Tutto questo funziona egregiamente però ho anche un'altra necessità: la
prima funzione (quella eseguita dal pulsante Salva) dopo avere riportato i
dati nella textbox nascosta deve rimanere in attesa finchè il frame nascosto
non si sia ricaricato e... non riesco a farglielo fare!
In particolare il problema non è nel sapere quando il secondo frame si sia
caricato ma piuttosto il problema è che non posso fare un loop nella prima
funzione perchè finchè non termina l'esecuzione della prima funzione
l'intervallo presente sul secondo frame non viene eseguito; in sostanza il
tentativo è stato quello di modificare la funzione del pulsante Salva in
questo modo:
function SaveData() {
    ....
    ....
    ....
    <scrivo i dati sul secondo frame>
    while (<il frame 2 non è caricato>) {
        window.status='Salvataggio in corso ...';
    }
    window.status='Dati salvati!';
    ....
    ....
    ....
}
Ma per l'appunto il fatto è che il ciclo while non fa' terminare la funzione
finchè non rileva il ricarico del secondo frame; a sua volta il timer
presente nel secondo frame non viene elaborato finchè non è finita la prima
funzione e quindi non fa' ricaricare il secondo frame...  morale della
favola il ciclo while diventa infinito!!!
Esiste un'istruzione Javascript da inserire all'interno del ciclo che
oblighi il sistema a processare gli altri eventi in attesa? (ad esempio in
VB questa funzione esiste e si chiama doEvents)
PS: Non posso implementare un secondo intervallo sul primo frame...
Qualcuno può aiutarmi?
Grazie in anticipo.

 non si sia ricaricato e... non riesco a farglielo fare!
Avendo a disposizione un unico flusso di programma, sei costretto a legare
la questione agli eventi.
La tua funzione scrive il window.status e termina, il codice php dopo aver
fatto le sue operazioni torna alla pagina chiamante aggiungendo un valore in
querystring. Nel frame nascosto l'event handler onload verifica la presenza
del valore e fa comportare di conseguenza il frame visibile.


Ma... i flussi di programma non sono due? (uno per ogni frame?)

Ho appena fatto un altro test: se al posto del ciclo while metto un alert
(che quindi ferma l'esecuzione della funzione finchè non lo chiudo cliccando
su ok); tutto funziona...
Questa non è una verifica del fatto che i due frame "girano" ciascuno per
conto suo?


Yes, mi sono espresso male.
Javascript e' interpretato e l'istanza dell'interprete e' una per tutti i
frame.
A quel while non fornisci una reale condizione di uscita, piu' che altro
pianti l'interprete.
Hai provato comunque a seguire il mio consiglio?

 > Questa non č una verifica del fatto che i due frame "girano" ciascuno


 istantaneamente).
Non intendevo quello.
Mi autocito:


 ha scritto nel messaggio
news:b9doa6$i2jke$1...@ID-167519.news.dfncis.de...


, 
and...@acquacontrol.com
 says...
Premesso che non ho seguito tutto il thread, ti chiedo: E' un sito 
internet, o una web application? Che tipo di browser devi considerare?
Perche' se ti "limiti" a IE (5.0 o 5.5, non ricordo, e 
superiori)/Browser Gecko (Mozilla, Netscape) risolvi tutto con 
l'XmlHttpRequest con chiamata sincrona, e ti eviti un sacco di mal di 
testa.
-- 
C'ya,
ZER0
  :. job profile - coder.gfxer.webDesigner
"When you have eliminated the impossible, whatever remains,
however improbable, must be the truth." (S.H.)

E' una web application scritta in php e come browser uso Mozilla...
Non sono molto ferrato riguardo "XmlHttpRequest"... (diciamo pure che
immagino a mala pena cosa possa significare!)
Dov'è che posso trovare qualche informazione a riguardo? E magari un
bell'esempio?
Grazie.


In questo caso la proposta di Zer0 e' sicuramente la migliore.
Puoi partire da:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/xmlsdk30/htm/xmobjxmlhttprequest.asp
Perche' l'implementazione in Mozilla ha piu' o meno seguito Microsoft.
La prima differenza sostanziale e' la creazione dell'oggetto, per Moz: var
tuoOggetto=new XMLHttpRequest()
Per una "tabella delle differenze": 
http://www.mozilla.org/xmlextras/
Questo pero' potrebbe costringerti a cambiare la logica dell'applicazione in
maniera sostanziale.
Se non ne hai il tempo (ma studia comunque la questione) mi sembra che ti
potesse andare bene il mio consiglio e che non ti costringesse affatto a
cambiare di tanto il frame nascosto.
Ovvero se la questione e' solo un messaggio nella status, la funzione del
frame superiore fara' sempre di questo:
- copia dei dati nel form del frame invisibile, cambia la status bar, submit
del form.
Il frame inferiore dovra' solo avere un event-handler per l'evento onload:
- la pagina php riceve il form e rispedisce al client la pagina precedente
ma con un valore in querystring (es. a=1)
- l'event handler controlla la presenza di questo valore e, se lo trova,
cambia la status bar

domandina interessante:
gira su apache?
(non sò da voi ma da me il cielo ha tuonato!)

 bell'esempio?
Oltre i link che ti ho dato, c'e' google che e' sempre pronto a fornirti 
ogni aiuto, in termini di documentazione e sorgenti, che desideri :)


 (non sò da voi ma da me il cielo ha tuonato!)
???
Non ti ho capito proprio.

 (non sò da voi ma da me il cielo ha tuonato!)
Qui c'e' un tempo favoloso. E dire che di solito fa pieta'. :)


 ha scritto nel messaggio
news:b9dsr7$qd$1...@newsreader.mailgate.org...


 Ciao.
