Newsgroup: it.comp.lang.javascript
Titolo: realizzare funzione init()

Ciao a tutti...
Ho affidato all'evento onload nel body il compito di caricare delle
funzioni JS al caricamento della pagina in questo modo:
<body onload="setVariables(); checkLocation(); ajaxpage('file1.php',
'mrg');">
funziona bene con firefox, opera e IE fino alla versione 6.
Per quanto riguarda IE7 il tag onload non ha alcun effetto, infatti
eliminando l'attributo onload nel body ottengo lo stesso risultato
anche negli altri browser. (tanto per verificare che fosse quello il
problema)
A mio avviso la soluzione sarebbe di realizzare una funzione di
inizializzazione che carichi le funzioni interessate tramite
window.onload, solo che non so da dove cominciare...e vi chiedo di
guidarmi verso la soluzione...ve ne sarei molto grato.
Posso creare la init in un file esterno? Come faccio se per il
funzionamento di alcuni oggetti nel sito ho gia utilizzato
window.onload in alcune funzioni?
Grazie in anticipo per ogni suggerimento.. spero di essere riuscito a
spiegarmi

 window.onload, solo che non so da dove cominciare...
Fai sicuramente bene perché ottieni un codice più pulito.
Ma se non ti funziona l'onload sul body, non ti funzionerà neanche un
approccio del genere.
-- 
~ "E' bello essere vivi.
Ci sono tante cose che non si possono fare da morti."

 approccio del genere.
Ho tentato questo approccio realizzando questa funzione:
function addEvent(obj, evType, fn){
 if (obj.addEventListener){
   obj.addEventListener(evType, fn, false);
   return true;
 } else if (obj.attachEvent){
   var r = obj.attachEvent("on"+evType, fn);
   return r;
 } else {
obj['on'+evType] = fn
}
}
addEvent(window, 'load', startlist);
addEvent(window, 'load', setVariables);
addEvent(window, 'load', checkLocation);
il risultato è che funziona correttamente su FF, ma ora non accade
nulla su explorer 6 e IE7.
Provo a darti l'indirizzo del sito così puoi dare un'occhiata tu
stesso al codice: 
www.secondocircolomontesilvano.it
Spero che potrai dedicarmi un po' del tuo tempo... Grazie ancora...

 stesso al codice: 
www.secondocircolomontesilvano.it
Su IE6, con la notifica degli errori attivata, l'errore è che "bw is
undefined".
Ho notato che "bw" lo definisci in una delle funzioni che poi associ
all'onload tramite "addEvent". Questo è sbagliato per due ragioni:
Le variabili globali andrebbero sempre definite fuori dalle funzioni
e non dentro queste; e se l'ordine cronologico nel quale le funzioni
vengono chiamate è fondamentale, *non* puoi usare l'attachEvent dato
che non puoi sapere a priori la sequenza con cui IE le invoca.
Ergo, innanzitutto definisci le variabili globali; e se vuoi mantere
le funzioni così come sono, utilizza direttamente "window.onload":
	window.onload = function(){
		startlist();
		setVariables();
		checkLocation();
	}
Dopo, possiamo passare a verificare l'errore che manda in crisi IE7.
-- 
~ Se il destino è contro di noi, peggio per lui!

 Dopo, possiamo passare a verificare l'errore che manda in crisi IE7.
 Confido in te.. e nella tua pazienza

  Confido in te.. e nella tua pazienza
Dunque, adesso che il codice è a posto ho potuto dare un'occhiata.
L'errore su IE7, che dovrebbe venire anche a te se hai abilitato la
notifica come ti ho suggerito, è:
	"ENDivName.offsetHeight is null or not an object"
Guardando il codice, se ne capisce il perché: il menu che usi non è
stato sviluppato seguendo l'approccio "object checking" ma "browser
sniffing", e all'epoca IE7 non esisteva ancora. Se provi a fare:
	alert(
bw.ie
)
su IE<7 ti restituirà 1, mentre su IE7 0.
A questo punto posso solo suggerirti di:
- Cambiare menu, con uno che usi l'object checking.
- Verificare se l'autore del menu ne ha rilasciato una versione più
recente che contempli IE7.
- Metterti di buzzo buono ad adattare quel codice a IE7, ma da quel
che ho capito non so se ne hai le competenze necessarie... Potresti
però approfittare dell'occasione per approfondire la materia.
C'è una quarta soluzione, quella di "comodo": far credere al codice
che è in presenza di IE6 anche quando invece si sta usando IE7.
Sostituendo:
this.ie6r=((this.ver.indexOf("MSIE 6")>-1) && this.dom &&
(document.compatMode == "BackCompat"))?1:0;
this.ie6s=((this.ver.indexOf("MSIE 6")>-1) && this.dom &&
(document.compatMode == "CSS1Compat"))?1:0;
Con:
this.ie6r=( (this.ver.indexOf("MSIE 6")>-1 || this.ver.indexOf("MSIE
7")>-1) && this.dom && (document.compatMode == "BackCompat"))?1:0;
this.ie6r=( (this.ver.indexOf("MSIE 6")>-1 || this.ver.indexOf("MSIE
7")>-1) && this.dom && (document.compatMode == "CSS1Compat"))?1:0;
Ovviamente è una pezza, ed il mio consiglio rimane quello di optare
per una delle tre soluzioni precedenti.
-- 
~ "Gli affetti profondi somigliano alle donne oneste;
hanno paura di essere scoperte e passano nella vita
con gli occhi bassi." (G. Flaubert)



Ho usato la soluzione di "comodo" per il momento... ci sono ancora
molti dettagli che necessitano di un consiglio/soluzione di un
esperto, ma non vorrei approfittare della tua disponibilità. Ti saluto
e ti ringrazio infinitamente...

 Ti saluto e ti ringrazio infinitamente...
Di niente, a presto.
-- 
~  "FINARMENTE  LI SFRATTATI AVRANNO UN TETTO SULLA  TESTA!
 ...però tirato ammodino, un  tegolo pe' vorta.." (Il vernacoliere)

 posso non ti rispondo. :)
Allora vado subito al punto... vorrei richiamare una funzione JS dopo
il caricamento di una pagina realizzato via XMLHttpRequest in un div
ma ovviamente la funzione non ha nessun effetto. Immagino che nascano
delle limitazioni caricando pagine in modo asincrono con ajax ma forse
tu sai come aggirare il problema. L'indirizzo lo conosci se vuoi
concedermi un'altra rapida occhiata...

 ma ovviamente la funzione non ha nessun effetto.
Se cerchi negli archivi di questo NG troverai informazioni in merito a
questo genere di operazione. In pratica, se con innerHTML inserisci in
un tag del codice di markup che contiene anche un tag script, questo è
ignorato (nel senso, non viene eseguito).
Un modo per eseguirlo è recuperare dalla stringa la parte di codice, e
farne l'eval (si è parlato anche di problemi inerenti all'XSS - "Cross
Site Scripting" - e simili, puoi trovare informazioni nel NG o su web)
-- 
~ "Io ho fatto questo, dice la mia memoria
Io non posso aver fatto questo, dice il mio orgoglio.
Alla fine, è la memoria ad arrendersi." (Nietzsche)

 Site Scripting" - e simili, puoi trovare informazioni nel NG o su web)
Ho trovato una soluzione anche a questo. A presto...