Newsgroup: it.comp.lang.javascript
Titolo: "congelare" una pagina...

Ciao a tutti!
Allora... nelle mie prove con XMLHttpRequest sto cercando di fare un controllo 
di esistenza di un campo..
Nello specifico del nome di un preventivo...
Allora... ho un campo input in cui viene digitato il nome del preventivo, nel 
momento in cui l'utente fa il submit del form relativao al preventivo, per prima 
cosa controllo se il campo e' vuoto...e fin li'...nulla di speciale... poi, se 
non e' vuoto faccio la mia bella richiesta con XMLHttpRequest per verificare se 
nel db esiste già un preventivo con quel nome... ma... c'e' un ma... prima che 
la mia richiesta produca un risultato la funzione continua facendomi il return 
true...
il codece del ramo di funzione incriminato e' questo:
xmlhttp.open("POST", "verPrev.php");
		xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
		xmlhttp.onreadystatechange = function() {
	    if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
	    res = xmlhttp.responseText;
	    if (res == '0')
	    {
		    showError("Esiste gia' un preventivo con questo nome.");
		    return false;
	    }
	    }
	  }
	  xmlhttp.send("prev="+document.forms[0].elements['nomeprev'].value);
 
 
document.forms[0].action='default.php?action=preventivi&option=go&nome='+document.forms[0].elements['nomeprev'].value;
return true;
Ora... io vorrei che la pagina rimanga "congelata" fino a quando la richiesta 
non ha prodotto un risultato... E' fattibile o devo adottare soluzioni alternative?
Di queste soluzioni ne ho pensata una... che onsiste nel mettere un pulsantino 
"verifica nome" di fianco all'input per fare in modo che l'utente verifichi da 
se l'esistenza del nome... il tutto governato da una variabile che viene settata 
opportunamente in caso affermativo o negativo, in modo che se l'utente non passa 
dalla verifica "manuale" del nome venga avvertito di farla...
Pero' non mi piace molto come soluzione...
Ho speranze?
Grazie a tutti!
Viandante


devi vedere la chiamata se è asincrona o sincrona da quello che ho capito ti 
server sincrona quindi nel send mi pare devi mettere il true

 
Ci ho provato... ho messo il true nella open e non va, anzi mi da errore la 
console javascript... mi pare che il true pero' sia per la modalità asincrona... 
ho messo anche false per fare in modalità sincrona, ma non va lo stesso...
La funzione che fa quel pezzo di codice e' messa nell'onsubmit del form, cosi':
onsubmit="return verificaPrev()"
puo' essere questo il problema?
lui arriva cmq alla fine della funzione...
Viandante

 lui arriva cmq alla fine della funzione...
xmlhttp.open([method],[url],false);
xmlhttp.send([param]);
alert(xmlhttp.getAllResponseHeaders() );
Impostando "false", a meno che non vi siano errori js da qualche altra
parte, l'esecuzione dello script è bloccata fintanto che il browser non
riceve una risposta e/o va in timeout. Quindi l'alert viene eseguito *solo*
se il server ha risposto. Una qualsiasi risposta.
-- 
ZER0
~ Prima Legge Fondamentale dell'Irregolarità Metafisica
Le normali leggi della fisica non valgono.(La Fisica nei Cartoni)


si è vero ho sbagliato non ero sicuro, quindi ho sparato (cmq ho precisato 
che non ero sicuro), cmq ho dato per scontato che adavi
a leggerti la reference.
Se puoi dacci qualche altra info altrimenti diventa difficile aiutarti.
ciao


Ho modificato leggermente, facendo eseguire la parte di request da una
funziona a parte (posto la funzione di verifica completa):
function verificaPrev()
{
	var res;
	if (document.forms[0].elements['nomeprev'].value == "")
	{
		showError("Manca il nome del preventivo!");
		return false;
	}
	else
	{
		res = verPrevExist();
		if (!res)
		{
document.forms[0].action='default.php?action=preventivi&option=go&nome='+document.forms[0].elements['nomeprev'].value;
			return true;
		}
		else
			return false;
	}
}
function verPrevExist()
{
	var res;
	xmlhttp.open("POST", "verPrev.php", false);
	xmlhttp.setRequestHeader('Content-Type',
'application/x-www-form-urlencoded');
	xmlhttp.onreadystatechange = function() {
    if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
    res = xmlhttp.responseText;
    if (res == '1')
    {
	    showError("Esiste gia' un preventivo con questo nome.");
	    return true;
    }
    else
    {
	    return false;
    }
    }
  }
  xmlhttp.send("prev="+document.forms[0].elements['nomeprev'].value);
alert(res);
}
Ho impostato false nella open, risultato...la console js non da errori,
la pagina continua il suo viaggio, senza apparentemente entrare in
modalità sincrona...
Ho provato aggiugendo quell'alert(res) prima della fine della
funzione... mi da undefined... quando in realtà dovrebbe darmi 1 o
0...
sembra quasi che non fa res = xmlhttp.responseText;...
pero'...se al posto di alert(res) ci metto alert(xmlhttp.responseText)
mi restituisce 1 o 0, quindi mi chiedo...perche' non lo fa
correttamente prima?
Dato che ho visto che con alert(xmlhttp.responseText) mi restituisce 1
o 0 faccio presto a modificare il tutto affinche' funzioni pero' non
capisco perche' non mi fa l'assegnamento dentro l'if... o meglio
capisco perche' non me lo fa... perche' almeno una delle condizioni e'
false...
La funzione verPrevExist presa singolarmente, cioe' associata ad un
onclick da qualche parte nella pagina, funziona...quindi fa
assegnamento e tutto il resto... richiamandola invece non va...a quanto
pare perche' l'assegnamento non viene fatto...
Viandante

ehm... e' venuto formattato da cani il codice... copia incolla non ha
fatto bene il suo dovere stavolta :P ovviamente non c'e' tutto quello
spazio tra return true e il ;
come non c'e' tutto quello spazio tra if(res e == '1')...
Ho postato da google perche' il server news di virgilio e'
momentaneamente indisposto :P

 pare perche' l'assegnamento non viene fatto...
Sono dubbi,questi, che li dovresti aver già dissipati, con un po' di debug
:)
Se usi un browser gecko, ricordati che esiste anche "console" di output,
alla quale puoi mandare del testo tramite la funzione "dump()".
-- 
ZER0
~ Legge della Combustibilità Inerente, Primo Corollario
Qualsiasi cosa esplode; Poco prima di esplodere, gonfia.(La Fisica nei
Cartoni)

 
mmm utile, lo terro' a mente grazie :)
Grazie mille!
Finalmente ho risolto...
Thanks.
Viandante

 non mi dava aiuti...
Non ti dava aiuti perché non c'erano errori sintattici, ma logici. Come si
dice sempre in questi casi, "Il computer è fondamentalmente stupido. Non fa
ciò che vuoi che faccia, fa ciò che gli dici di fare".
-- 
ZER0
~ Legge della Xilolacerazione
Una spada di legno o di bambù è tagliente quanto una di metallo, se non di
più.(La Fisica nei Cartoni)

 Odio ripeterlo, ma.. bastava un po' di debug. :) 
Vero, come sempre :)
Ah!!
HO CAPITO TUTTO!!
Sono proprio un cretino :) scrivere codice sotto ora di pranzo e' una pessima 
cosa...
Per forza che la variabile res non veniva mai avvalorata... avessi fatto un 
errore del genere in c me ne sarei accorto subito... devo ancora entrare in 
questa logica (pippo = function {...}) in javascript e vedere tutto assieme mi 
ha fatto perdere la nozione dello scope delle variabili... sorry...
Cmq ora ho tramutato tutto in
xmlhttp.open("POST", "verPrev.php", false);
		xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
 
	  xmlhttp.send("prev="+document.forms[0].elements['nomeprev'].value);
 
	  if (xmlhttp.responseText == "1")
	  {
	    showError("Esiste gia' un preventivo con questo nome.");
	    return false;
	  }
	  else
	  {
 
document.forms[0].action='default.php?action=preventivi&option=go&nome='+document.forms[0].elements['nomeprev'].value;
 
			return true;
	  }
e funziona perfettamente
Grazie di tutto!
Soprattutto perche' ora ho imparato che onreadystatechange non ha senso in 
chiamate sincrone
Viandante

 chiamate sincrone
:)


 
:)

 chi ne sa piu' di te sono un valido complemento :)
Sicuramente. E poi non c'è niente di meglio che la reference del linguaggio
per imparare. Basta quella, e di materiale inerente trovi il web pieno.
-- 
ZER0
~ Legge della Proporzionalità Mandibolare
La dimensione della bocca di una persona è direttamente proporzionale al
volume con cui parla o alla quantità di quello che mangia.(La Fisica nei
Cartoni)

 
No, con php me ne sarei accorto, ci sto su da molto piu' tempo e errori del 
genere non ne faccio, di questo ne sono certo :)
Sarà questione di abitudine ma con javascript delle volte perdo ancora la 
visione d'insieme che ho con php o con il c ad esempio... boh...

 genere non ne faccio, di questo ne sono certo :)
No, non mi hai capito. In C č impossibile che tu faccia un errore del
genere, perché il codice semplicemente non ti viene compilato, e ti viene
notificato il perché non č stato compilato.
In PHP puoi potenzialmente farlo, esattamente allo stesso modo che in JS,
ed esattamente per la stessa ragione.
Io di questo parlavo :)
Non volevo entrare nel merito "soggettivo" della questione.
-- 
ZER0 "che ieri ha visto dal vivo Avril"
~ Legge dell'intelletto giovanile
I Bambini sono due volte piů intelligenti degli adulti e dieci volte piů
rompiballe. (La Fisica nei Cartoni)

 
Ah ok, certo, hai perfettamente ragione :)