Newsgroup: it.comp.lang.javascript
Titolo: self.close() Errore...

salve..
ho un problemino con firefox per una cosa che su IE funzionare 
regolarmente.... spiego il tutto
Fin1 apre Popup1
Popup1 richiama una funzione di Fin1 con window.opener.nomefunzione()
a questo punto avviene regolarmente l'esecuzione della funzione
Fin1 esegue nomefunzione() (che contiene un alert)
e al rigo successivo nella popup tendo di chiuderla con
Popup1 esegue self.close()
su firefox il self.close() (e anche window.close) non mi funziona
la finestra rimane nella taskbar e se ci clicco mi appare con i soli 
contorni e genera immediatamente un errore che mi crasha firefox
suggerimenti?
tnx
simple_maL

 e al rigo successivo nella popup *tendo* di chiuderla con
e questa l'ho scritta alla barese... :)
chiedo venia
simple_maL

 contorni e genera immediatamente un errore che mi crasha firefox
se potesse interessare il problema era causato da alcune righe di codice 
ancora in esecuzione (x via di una richiesta XMLHTTP), che non solo non 
permettevano il close, ma mandavano in crash il sistema...
per ora l'unica soluzione (più che altro una gabbola) che ho trovato, è 
stata di eseguire il close() con un timer di 400ms...
e ora funzia..
simple_maL

 stata di eseguire il close() con un timer di 400ms...
Anche perché non è necessariamente detto che dopo 400ms sia tutto a posto,
se c'è di mezzo una richiesta al server (potrebbe metterci più del previsto
a rispondere o elaborare i dati).
Questo tipo di soluzioni con timeout sono sempre abbastanza empiriche, è
sempre bene verificare se c'è una via alternativa più pulita.
-- 
「人は何かの犠牲なしに、何も得る事はできない。
何かを得る為には、同等の代価が必要になる。
それが錬金術における、等価交換の原則だ。」

 sempre bene verificare se c'Ãš una via alternativa piÃ¹ pulita.
già, sono pienamente d'accordo...
 > Ti conviene allora fare una tua funzione di close che si preoccupa di
 > rilasciare le risorse di sistema occupate.
il problema è che invio una richiesta XMLHTTP e nella funzione attivata 
al termine del caricamento, eseguo una serie di operazioni automatiche, 
tra le quali il richiamo di una funzione che mi gestisce i risultati...
in quella funzione ho messo il close(), ma il problema è che subito 
dopo, nella funzione di risposta XML, ho ancora un'altro paio di righe 
di codice con dei controlli che non posso spostare...
hai qualche idea per risolvere?
grazie
simple_maL

 hai qualche idea per risolvere?
Senza vedere il codice, l'unica cosa che posso dirti è di spostare il close;
se non puoi spostare il resto.


>> sempre bene verificare se c'Ã�Å¡ una via alternativa piÃ�Â¹ pulita.
ho scoperto che la mia soluzione è tutt'altro che empirica...
anzi direi che attualmente è l'unica soluzione conosciuta per la 
risoluzione del bug di Firefox..
ecco un esempio di altri che hanno risolto nel medesimo modo:
http://forums.xoad.org/viewtopic.php?pid=153
e cercando in giro ne ho trovati molti altri che invece non sono 
riusciti a risolverlo!!
saluti
simple_maL

 riusciti a risolverlo!!
Perché stai cercando di risolvere il sintomo, non il male.
-- 
~ "When you have eliminated the impossible, whatever remains,
however improbable, must be the truth." (S.H.)

 ha scritto:

Ebbi un problema che mi ricorda il tuo (anche se non sono affatto certo che
si tratti della medesima cosa) e che, col benedetto aiuto di ZER0, risolsi
senza empirismi. La "gabbola" è la prima cosa che viene in mente, perché è
veloce e semplice, ma comprendere il problema alla base è utile anche per
imparare cose che serviranno nel futuro, imho.
-- 
Nando [?]
Apostolo della Prova

 ("basato soltanto sulla pratica spicciola; non scientifico")
ciao!
beh, forse non mi sono ben spiegato...
il concetto che volevo far passare è un altro!
il fatto è che non si tratta di un problema da risolvere, pittosto di un 
bug conosciuto di firefox nell'utilizzo dell'oggetto XMLHttpRequest.
Essendo un bug, o meglio, un comportamento inatteso, non è così semplice 
trovare una soluzione scientifica dato che il problema non è scientifico.
Se l'interprete fosse perfetto, sarebbe indubbiamente il mio codice 
(insieme ai tanti altri che hanno affrontato il medesimo inconveniente) 
a dover essere sistemato, ma, se non erro, se è il browser ad essere 
imperfetto (non potendo io riparare firefox) l'unica soluzione che ho a 
disposizione è la gabbola :)
Detto questo devo concordare sul fatto che la soluzione sia, di base, 
piuttosto empirica, ma quello che bisogna considerare è che non poche 
volte, è stata proprio la soluzione empirica a far "capire" la natura 
del malfunzionamento... pertanto "quella" soluzione, da empirica, 
potrebbe trasformarsi improvvisamente in scientifica...
In definitiva: ancora non so' perchè.. ma così funziona... e chissà che 
questo mi faccia capire il perchè :)
saluti
simple_maL

 In definitiva: ancora non so' perchè.. ma così funziona...
Il perché è chiaro, il problema di approcci del genere però è che non sono
affidabili. Con un po' di lavoro in più puoi ottenere una vera soluzione al
problema,  leggi anche il post di Nando in merito a questo.
Se hai bisogno di una mano, fischia. :)


ZER0 ha scritto:
[CUT]
La mia situazione è:
- Pagina1 apre una Pagina2
- dalla Pagina2 eseguo delle operazioni, poi da un bottone richiamo una 
funzione su Pagina1 e la chiusura di Pagina2 con self.close();
- La funzione di Pagina1 esegue un'operazione sull'oggetto XMLHTTP
Di per se, questo dovrebbe funzionare??
Direi che la risposta è si... oltretutto su IE funziona normalmente.
Su firefox genera un errore incomprensibile e si piomba il tutto.
Se invece di inserire la richiesta AJAX sulla funzione di Pagina1, 
eseguo un piccolo timeout con una funzione tampone, in questo modo:
function Pag2Return(result)
{
	setTimeout('Pag2Function(\''+ result +'\');',1);
}
function Pag2Function(result)
{
	..
	richiesta AJAX
	..
}
tutto funziona.... fine :)
grazie, saluti
simple_maL
P.S. stavo cercando il post di Nando che parla di quel prob simile.. ma 
come si chiama? :|

 tutto funziona.... fine :)
Ma l'hai capito almeno il perché? :)
E ti ripeto, così non "curi il male".


 come si chiama? :|
E chi se lo ricorda :) Ad ogni modo, credo che la problematica fosse
sostanzialmente dissimile.


 E ti ripeto, così non "curi il male".
Purtroppo lo so...
ma mi sento leggermente consolato dal fatto che il prob presentato 
sopra, non è stato attualmente risolto da nessuno (o almeno nessuno che 
abbia avuto l'accortezza di renderlo pubblico :))
ancora saluti e grazie
simple_maL

 sostanzialmente dissimile.
ok, grazie lo stesso Nando!
saluti
simple_maL

 ok, grazie lo stesso Nando!
Ci si prova.
Piuttosto, se e quando ti va, potresti mettermi/ci a parte di qualche
ulteriore dettaglio? M'hai messo la curiosità e non ho capito esattamente
qual è il contesto in cui si presenta il problema.


 sopra, non è stato attualmente risolto da nessuno 
Perché solitamente, se si programma in un certo modo, il bug non si
verifica.
Come ti è già stato detto, comunque, non è un problema dissimile da quello
che aveva avuto Nando. Se non hai modo di mettere online il codice per
poterci dare un'occhiata, puoi vedere di risolvere la cosa basandoti su
quanto è già stato detto in proposito.
Prova a fare una ricerca su google groups in questo NG cercando
"nsIXMLHttpRequest.status".


 XMLHTTP..
A maggior ragione è una questione di context javascript. Il codice eseguito
da setTimeout/setInterval è decontestualizzato.


 XMLHTTP..
A maggior ragione è una questione di context javascript. Il codice eseguito
da setTimeout/setInterval è decontestualizzato.
Ma senza avere sottomano un po' di codice, oltre le ipotesi non si va.


 
ti pasto il codice relativo al problema.
Premessa:
Dalla pagina di base apro con window.open una finestra chiamata Dialog.
in questa finestra ho un form in cui aggiungo/modifico i vari campi di 
un record, al submit dello stesso eseguo una mia funzione
JxFunction('GET','miapag.php',JxQueryForm('frmShow'),'RecordCheckSave');
che mi istanzia al volo un oggetto della mia classe jx (abbreviazione di 
  ajax) che con metodo get apre la pag miapag.php, inviando tutte le 
variabili del form in una query generata automaticamente dalla funzione 
JxQueryForm(nomeform) e alla fine invia il risultato alla funzione 
RecordCheckSave che riceve "OK|id_record" o "KO|txtErrore"
function RecordCheckSave(result)
{
// spezzo le 2 parti della stringa
var arrResult = result.split("|");
// se è ok
if (arrResult[0]=="OK")
{ // arrResult[1] restituisce ID aggiunto o modificato
    JxToDebug('<? echo $_GET['returnFn'] ;  ?>');		
    <?
    // eseguo eventuale funzione che mi ha inviato l'opener
    if ($_GET['returnFn'])
       echo "window.opener{$_GET['returnFn']}(arrResult[1]); ";
    ?>
    self.close();
}
[..]
questo è inutile perchè non viene eseguito nella circostanza che ci 
interessa
[..]
}
la returnFn è:
function ReturnFn(result)
{	
   setTimeout('Refresh(\''+ result +'\')',1);
}
function Refresh(myValue)
{	
   myValue = myValue || '' ;
   oDbSelect.setValue(myValue);
   oDbSelect.Init() ;	
}
oDbSelect è un mio oggetto js per una select collegata ad una table di 
un db mysql e la funzione init non fa altro che aggiornare il contenuto 
inizializzandola... ma per farlo al suo interno esegue un'altra chiamata 
XMLHTTP.
se come returnFn uso direttamente Refresh ottengo il succitato errore, 
invece così come la sto' usando ora funziona regolarmente.
in quel caso l'errore avviene qui:
JxHttpRequest.onreadystatechange = function()
{
// Funzione che tratta la risposta
if (JxHttpRequest.readyState == 4)
{
   JxHttpRequest.responseText;
   try {JxStatusRequest=JxHttpRequest.status;}
       catch(e) {alert("Exception : " + e);}
andando sempre a finire nel catch a prescindere dalla durata e 
dall'esito dell'operazione.
xciò mi sfugge il perche 1ms in + possa cambiare la situazione..
dimmi se ti può servire qualche altra indicazione...
grazie ancora ZERO
simple_maL

 ricordo male o l'upload di file non si può fare tramite xmlhttprequest?
uhauahah di dove sei Nando? :) LOL
cmq si, non si possono fare upload client->server via AJAX (o almeno io 
non ci sono riuscito) in quanto non può passare il riferimento al file 
come fai con un form multipart.
Quello che faccio io è usare un mio filebrowser per effettuare l'upload 
e poi usare una pag caricata con XMLHTTP che mi esegue una copia e una 
thumb dell'immagine che sta' già sul server...
in alcuni casi (per immagini molto grandi) l'operazione mi ha superato 
il timeout di 30sec :|
ciau
simple_maL

 ricordo male o l'upload di file non si può fare tramite xmlhttprequest?
Per essere precisi, da pagina web non puoi accedere al file sul PC di cui
vuoi fare l'upload. Potendo accedere al file (signed scripts, html su file
locale, estensione per FF/Moz o altro) il problema sparisce e
xmlhttprequest puo' benissimo essere usato per l'invio di "files".
Per esempio con un codice di questo tipo:
http://www.adematteis.net/ow2/index.php?q=javascript/xmlhttprequest_uploadfiles
'bye

 dimmi se ti può servire qualche altra indicazione...
Il codice online :) 


 
(:|)  simple_maL

 (:|)  simple_maL
Per l'acronimo, non per il tuo jx :)


ZER0 ha scritto:
 > On Wed, 24 May 2006 11:36:44 +0200, simple:maL wrote:
 > Per l'acronimo, non per il tuo jx :)
 >
 >
capito :)
senti ora il sistema è integrato in un CM con dati di un cliente quindi 
non posso farti vedere la cosa velocemente...
ma forse l'errore sta proprio nel mio jx :D
se mi dai un tuo indirizzo email te lo allego, magari mi saprai dire se 
è proprio scritto coi piedi o se c'è qualcosa che si salva :(
in tal caso sarei molto contento se la classe ti potesse tornare utile 
(anche se per una piccola parte)
grazie mille ZERO
ciao
simple_maL

 thumb dell'immagine che sta' già sul server...
Ah, ok, ho capito.


 ha scritto:

Questa possibilità mi era sconosciuta. Grazie per la precisazione :)


 dall'esito dell'operazione.
Come dice ZER0, la situazione ricorda quella in cui mi trovai io:
readyState vale 4 ma status non è disponibile e il tentativo di accedervi
solleva un'eccezione. La cosa ha un senso, anche se inizialmente può
sfuggire. Senza stare a discutere su questo, io mi permetterei di
suggerirti di cambiare le cose in questo modo: la chiusura della popup
(finestra Dialog, come l'hai chiamata tu) la delegherei all'opener, cioè
farei in modo che la finestra "madre", dopo aver eseguito tutti i compiti
inerenti il refresh, chiuda la figlia. Insomma, come già è stato detto da
personaggi più autorevoli, sposterei quel close() da dov'è ora. Ovviamente
IMHO :)
