Newsgroup: it.comp.lang.javascript
Titolo: Chiarimento sullo scope

Salve a tutti,
ho un piccolo problema: sembra che la variabile http (globale) non venga
vista all'interno di una funzione che ho impostato come handler.
Ecco l'errore:
Errore: http is not defined
File sorgente: 
http://localhost/nardin/codici.js
Riga: 35
Ed ecco il codice (la riga incriminata è indicata dal commento):
var http = getHTTPObject();
function imposta_dati_residenza(cod_citta, emit_warning, id_citta, id_prov, id_cap) {
	if(cod_citta == "")
		return;
    http.open("GET", "getCityProv.php?cod_res=" + cod_citta, true);
    http.onreadystatechange = function() {
//La seguente è la riga numero 35
        if (http.readyState == 4) {
            results = http.responseText.split(",");
            if(results[0] == "nf") {
				if(emit_warning)
	                window.alert("Il codice comune " + cod_citta + " non è presente nel database.");
            }
            else {
                id_citta.value = results[0];
                id_prov.value = results[1];
                id_cap.value = results[2];
            }
        }
    }
    http.send(null);
}
Grazie in anticipo! :)
-- 
[ Andrea Spadaccini - a.k.a. Lupino/Lupin85 - Catania - ICQ#: 91528290 ]
[ GPG ID: 5D41ABF0 - key @ 
pgp.mit.edu
 - Slackware 10.1 w/Linux 2.4.22 ]
[ Linux User # 313388 - MAIL: a.spadaccini(at)catania(dot)linux(dot)it ]

 vista all'interno di una funzione che ho impostato come handler.
Molto strano. Hai modo di pubblicare tale pagina online, in modo da poter
vedere l'errore a runtime?
Il codice che hai scritto, ad una prima occhiata sembrerebbe a posto.
-- 
~ "The demo effect, you don't expect"

 Il codice che hai scritto, ad una prima occhiata sembrerebbe a posto.
Cosě tanto per io cambierei il nome della var...giusto per un test.
-- 
"Emancipate yourselves from mental slavery;
None but ourselves can free our minds"
									    B.M.

 Il codice che hai scritto, ad una prima occhiata sembrerebbe a posto.
Premetto (come del resto gia' sapete) che sono un grande ignorante e
neanche so che oggetto restituisca getHTTPObject.
La mia domanda e' questa: in questo frammento di codice
    http.onreadystatechange = function() {
    //La seguente è la riga numero 35
        if (http.readyState == 4) {
            results = http.responseText.split(",");
si aggiunge un metodo all'oggetto http (o no?); all'interno del metodo,
quindi, non si dovrebbe usare this in luogo di http?
Se la mia domanda rivela la mia idiozia fatemelo notare con garbo, grazie
:)
-- 
~Nando~ :-/__.oO
Apostolo della Prova

 si aggiunge un metodo all'oggetto http (o no?); 
no, si "assegna" una funzione all'oggetto che viene scatenata dall'evento
onreadystatechange.
Hai provato a cambiare il nome dell'oggetto da http a pippo ?
-- 
"e mai che mi sia venuto in mente
 di essere più ubriaco di voi
 di essere molto più ubriaco di voi"
									  F.D.A.

 Hai provato a cambiare il nome dell'oggetto da http a pippo ?
Ma chi, io?
E mica sono Lupino!
:-)


 :-)
:-)
era seria la mia proposta. i nomi riservati alle variabili creano sempre
problemi. Probabilmente non è questo il problema (non vedo perché http
debba essere riservato) ma, dato che comunque è un protocollo e quindi il
browser da qualche parte lo interpreta in modo "speciale", io un tentativo
lo farei: dappertutto dove hai nominato l'oggetto http sostituisci con un
altro nome che non sia riservato (pippo vedo che non ti piace, fai allora
uno splendido XmlHttpObject...)
-- 
"Non sai che ci vuol scienza
 ci vuol costanza
 ad invecchiare senza maturità"
									    F.G.

 :)
"Garbo" in questo momento è fuori sede, ma c'è "Sandrone" con la sua fidata
mazza chiodata, che verrà volentieri a fartelo capire a domicilio. :P
-- 
~ Non ci sono certezze, solo ragionevoli probabilità. (W. Howe)

 E vabbuo'... niente this, quindi?
In questo specifico caso, no. Negli altri altri casi, generalmente si.
-- 
~ Always remember you're unique, just like everyone else.

 uno splendido XmlHttpObject...)
Giusto per confondere ulteriormente le acque con XMLHttpRequest, eh? :)
-- 
~ La donna è un male, ma un male necessario. (Aulo Gellio)

 Giusto per confondere ulteriormente le acque con XMLHttpRequest, eh? :)
Uff ... "Mortadella" va bene? E' abbastanza anonimo? sempre lì a fare le
pulci... :-)
-- 
"Voi abili a tenere sempre un piede qua e uno là
 avrete un avvenire certo in questo mondo qua
 però la dignità
 dove l'avete persa?"
									    V.R.

 sempre lì a fare le pulci... :-)
Macché. E' solo la vecchia abitudine di tendere a far bene le cose, quando
si fanno.
P.S.
Le volevi, le "pulci"? :D
-- 
~ Il futuro è nelle nostre mani.
Purtroppo.

 Le volevi, le "pulci"? :D
:-) sì, me la sono proprio cercata questa.
-- 
"E' l' ignoranza che crea l'intolleranza
 di gente cieca e senza coscienza"
									  S.S.S.

 No, onreadystatechange è un evento decontestualizzato.
Forse ma forse ho capito... forse...
Vorrei avere 48-72 ore al giorno...


 :-) sì, me la sono proprio cercata questa.
:)
-- 
~ "When you have eliminated the impossible, whatever remains,
however improbable, must be the truth." (S.H.)

 Vorrei avere 48-72 ore al giorno...
Se riesci ad ottenerle fammi sapere com'è che hai fatto, mi raccomando...
-- 
~ "Nei film americani, qualsiasi problema che venga considerato
sufficientemente catastrofico, puo' essere risolto facendo esplodere uno
o piu' ordigni nucleari" (ZER0 & Cosimo)

 Se riesci ad ottenerle fammi sapere com'č che hai fatto, mi raccomando...
Sě, basta perň non farlo sapere al capo altrimenti da 8 [10] [12] ore al
giorno verrebbero alzate a 38!! (non dimentichiamoci chi c'č al governo,
non diamo adito a simili pensieri che quello li prende al volo!!) 


 Il codice che hai scritto, ad una prima occhiata sembrerebbe a posto.
Tra l'altro a volte funziona ed a volte no!! Mi spiego meglio:
funziona perfettamente se viene richiamata passando come parametri dei
controlli contenuti nella stessa pagina da cui parte la richiesta (in
parole povere, se passo come id_citta ecc.. degli oggetti ottenuti tramite
document.getElementById('qualcosa')).
Non funziona se passo come parametri degli oggetti della finestra parent
(ottenuti tramite opener.document.getElementById('qualcosa')).
E' davvero strano!!
Non è possibile che ci siano dei conflitti, dato che codici.js è incluso
da ambo le pagine html?


 (ottenuti tramite opener.document.getElementById('qualcosa')).
Ah ma allora e' tutto chiaro. L'errore e' palese.
:-)


 :-)
Mi sembra di cogliere dell'ironia nel tuo messaggio.. :D
Se però sbaglio (e quindi non sei ironico), potresti spiegarmi dov'è
l'errore?
TIA,


 l'errore?
Ma non che non sbagli :-)
Sono un ignorantone, qui per lo piu' lurko per (cercare di) imparare
qualcosa.
Riguardo al tuo problema, quindi, davvero non posso aiutarti, mi spiace.
Ho pensato che potesse aver a che fare con le policies di sicurezza dei
browser... ma alla fine non credo... non lo so. Cmq dai un occhio qui,
giusto per toglierti il pensiero:
http://tinyurl.com/233tq
Verso la fine della pagina vi e' un paragrafo sulle limitazioni nell'uso di
xmlHttpRequest imposte per motivi di sicurezza. Magari per caso c'entra
qualcosa :-)
So long.


 	                window.alert("Il codice comune " + cod_citta + " non è presente nel database.");
Cos'è cod_citta per questa function?


 da ambo le pagine html?
Senza avere il codice effettivo sotto mano, tutto può essere.
La js console non ti dà altri errori? L'unico errore che mostra è quello
alla riga 35?
-- 
~ Io ho una filosofia semplice: Riempi ciò che è vuoto.
Vuota ciò che è pieno. Gratta ciò che prude.
(A. R. Longworth)

 (quindi, quando questa function termina, scompaiono)
Ha fatto una closure. Il punto è che onreadystatechange è un evento un po'
particolare, come sappiamo. E quindi il fatto che la closure implichi
riferimenti a elementi di un altro context potrebbe generare un'anomalia.
Anche se mi pare strano.
Appena ho un attimo di tempo, provo.
-- 
~ Se potete leggere questo, la mia donna è caduta.
(Letta sul retro di una maglietta di un motociclista)

 Ha fatto una closure. 
Cos'è che ha fatto??? pu'aret, speriamo non sia qualcosa di grave e che si
rimetta presto...


 rimetta presto...
google -> javascript clousure -> buona lettura :)


 google -> javascript clousure -> buona lettura :)
Ecco il settimo risultato per le pagine in italiano:
http://tinyurl.com/bm5pf
:-)


 :-)
:-)
 
http://jibbering.com/faq/faq_notes/closures.html
Stampato, ottima lettura da cesso!


 Grazie in anticipo! :)
Rispondo qui perché non so a chi rispondere.
Tra l'altro ho appena notato che, quando faccio la richiesta incriminata,
lo http.readyState non arriva mai a 4, ma si ferma ad 1.
Vi aiuta questo?
Grazie mille a tutti voi per l'interessamento!!!!! :)


 quello alla riga 35?
Già.


 Cos'è cod_citta per questa function?
Una string.


 Non conoscevo assolutamente le closure, 
Le closure fanno parte di quei meccanismi che è facile innescare anche
inconsapevolmente. Ed è bene starci attenti.
-- 
~ ..ma in effetti il concetto di WYSIWYG (quello che vedi è quello che
ottieni) si applica ai computer malissimo, così come si applica alle
donne... (The Real Programmer)