Newsgroup: it.comp.lang.javascript
Titolo: Funzioni in eventi inline

Ciao a tutti,
ho una pagina XHTML dove ci sono diversi elementi della pagina a cui ho
assegnato delle funzioni ad alcuni event-handler, es.:
<div onmouseover="f()">...</div>
accade che la console di JavaScript di FireFox si arrabbia se l'evento
venisse scatenato prima dell'onload completo della pagina (questo anche le
la funzione in questione fosse definita nella pagina stessa).
E' un problema noto?
voi come vi comportate?
Non si devono definire eventi inline, ma assegnare solo dopo l'onload?

 E' un problema noto?
E' raro al giorno d'oggi che inserisca una funzione in questo modo, ma un
test al volo mi ha confermato che non vi sono problemi di sorta; almeno su
una pagina che ancora non è stata finita di "scaricare" dal server, laddove
il codice si trova in testa e la funzione è quindi già definita per il
parser.
-- 
~ It may be that the old astrologers had the truth exactly reversed,
when they believed that the stars controlled the destinies of men.
The time may come when men control the destinies of stars.
(Arthur C. Clarke)

 la funzione in questione fosse definita nella pagina stessa).
Fermo restando ciň che ha scritto ZER0... non č che nella funzione fai
riferimento a qualche elemento della pagina? Se č cosě, č possibile che, se
la funzione viene invocata prima che la pagina abbia finito di caricarsi,
quell'elemento non sia stato ancora parserizzato e quindi risulti
indefinito.
-- 
Nando [?]
Apostolo della Prova

 test al volo mi ha confermato che non vi sono problemi di sorta;
Io con il mio test invece ho dei problemi:
se aggiorno la pagina e contemporaneamente muovo il mouse la console mi
dice "f is not defined' il comportamento non e' sistematico devo fare
qualche tentativo diciamo 1 volta su 3...

 qualche tentativo diciamo 1 volta su 3...
Ora 1 su 1, mi sono sincronizzato meglio...

 riferimento a qualche elemento della pagina?
No,
e' colpa del mio impreciso "si arrabbia" :(
il problema e' che la console di FF mi dice che la funzione non e' definita

 dice "f is not defined' 
E' qui il tuo errore di interpretazione. Il punto è il reload, non che la
pagina non ha ancora finito di scaricarsi. Quando carichi la pagina la prima
volta, non avrai alcun problema di sorta, questo perché la funzione è
effettivamente definita, nel momento in cui agisci sull'elemento. Quando la
ricarichi, c'è un momento di interregno nel quale il DOM è ancora presente,
ma essendo partito l'evento di "scaricamento" del documento corrente, il
contesto in cui agisce Javascript è stato distrutto e con esso anche la
funzione.
Se è come penso, per fare una riprova potresti impostare l'onbeforeunload
dove setti l'innerHTML del body a stringa vuota. Così facendo, dovresti
riuscire ad eliminare il DOM nel momento in cui il documento viene scaricato
assieme al contesto in cui opera javascript, e quindi non hai più alcun DOM
con cui interagire nel tempo di interregno di cui sopra.
-- 
~ Chi segue gli altri, non arriva mai primo.

 con cui interagire nel tempo di interregno di cui sopra.
Ma bello! Grazie dei chiarimenti!
"onbeforeunload" e' il solito evento che non e' w3c standard ma la maggior
parte dei browser interpretano (ad es. escluso Opera che non gestisce
neanche l'onunload...)?
P.S.
Quindi si potrebbe scegliere alternativamente
un bel:
document.body.style.visibility='hidden'
o un controllo di esistenza della funzione in tutti gli eventi:
if(typeof fun != 'undefined' )fun();
giusto?

 giusto?
Ma per carità. Evita gli event-handler inline e fai prima. Così scrivi anche
del codice non invasivo.
-- 
~ You don't have to be crazy to be a webmaster. But it helps.

 del codice non invasivo.
In realta' il problema non e' 'event-handler inline' (che mi e' piu'
pratico usare) ma e' l'event-handler di per se'...
Cmq, ripensandoci l'approccio che potrei usare e':
document.body.style.visibility='hidden' sull'onbeforeunload
e dovrei fare sogni tranquilli

 e dovrei fare sogni tranquilli
Ribadisco il mio "Ma per carità".
-- 
~ "E' bello essere vivi. Ci sono tante cose che non si possono fare
da morti."

 Che test hai fatto?
Hai ragione :(
Non avevo fatto nessun test, ho parlato a sproposito :(
In effetti FF non si arrabbia se non definisco gli eventi inline...
Vedro' cosa posso fare, ripeto che mi era molto piu' comodo definirli
inline
Grazie di tutto.