Newsgroup: it.comp.lang.javascript
Titolo: Solito conflitto con UnLoad e simili..

Salve, mi trovo con l'ennesimo problema del conflitto di due script
che fanno uso di javascript mediante "OnLoad" e in alcuni casi di
"OnUnload" all'interno della stessa pagina o cmq nel body!
Si tratta uno, il famoso script  NiftCorners che mi permette di avere
dei box con gli angoli arrotondati utilizzando Javascript in accoppiata
dei css, l'altro Sylesheets sempre in javascript  e css mi permette
di selezionare un diverso layout al sito mantenendo quello selezionato
anche per i successivi accessi!
Per venirmi incontro vi posto il codice per poter meglio risolvere il
problema.
Per ognuno di essi vengono richiamati gli script dall'esterno e si
compongono dei seguenti file e codice:
Script: NiftCorners
Codice Nift.js:
function NiftyCheck(){
if(!document.getElementById || !document.createElement)
    return(false);
var b=navigator.userAgent.toLowerCase();
if(b.indexOf("msie 5")>0 && b.indexOf("opera")==-1)
    return(false);
return(true);
}
function Rounded(selector,bk,color,size){
var i;
var v=getElementsBySelector(selector);
var l=v.length;
for(i=0;i<l;i++){
    AddTop(v[i],bk,color,size);
    AddBottom(v[i],bk,color,size);
    }
}
function RoundedTop(selector,bk,color,size){
var i;
var v=getElementsBySelector(selector);
for(i=0;i<v.length;i++)
    AddTop(v[i],bk,color,size);
}
function RoundedBottom(selector,bk,color,size){
var i;
var v=getElementsBySelector(selector);
for(i=0;i<v.length;i++)
    AddBottom(v[i],bk,color,size);
}
function AddTop(el,bk,color,size){
var i;
var d=document.createElement("b");
var cn="r";
var lim=4;
if(size && size=="small"){ cn="rs"; lim=2}
d.className="rtop";
d.style.backgroundColor=bk;
for(i=1;i<=lim;i++){
    var x=document.createElement("b");
    x.className=cn + i;
    x.style.backgroundColor=color;
    d.appendChild(x);
    }
el.insertBefore(d,el.firstChild);
}
function AddBottom(el,bk,color,size){
var i;
var d=document.createElement("b");
var cn="r";
var lim=4;
if(size && size=="small"){ cn="rs"; lim=2}
d.className="rbottom";
d.style.backgroundColor=bk;
for(i=lim;i>0;i--){
    var x=document.createElement("b");
    x.className=cn + i;
    x.style.backgroundColor=color;
    d.appendChild(x);
    }
el.appendChild(d,el.firstChild);
}
function getElementsBySelector(selector){
var i;
var s=[];
var selid="";
var selclass="";
var tag=selector;
var objlist=[];
if(selector.indexOf(" ")>0){  //descendant selector like "tag#id tag"
    s=selector.split(" ");
    var fs=s[0].split("#");
    if(fs.length==1) return(objlist);
    return(document.getElementById(fs[1]).getElementsByTagName(s[1]));
    }
if(selector.indexOf("#")>0){ //id selector like "tag#id"
    s=selector.split("#");
    tag=s[0];
    selid=s[1];
    }
if(selid!=""){
    objlist.push(document.getElementById(selid));
    return(objlist);
    }
if(selector.indexOf(".")>0){  //class selector like "tag.class"
    s=selector.split(".");
    tag=s[0];
    selclass=s[1];
    }
var v=document.getElementsByTagName(tag);  // tag selector like "tag"
if(selclass=="")
    return(v);
for(i=0;i<v.length;i++){
    if(v[i].className==selclass){
        objlist.push(v[i]);
        }
    }
return(objlist);
}
Codice Layout.js:
window.onload=function(){
if(!NiftyCheck())
    return;
	RoundedTop("div.contenuto","#F0F0F0","#E7E7E7");
	RoundedBottom("div.contenuto","#F0F0F0","#E7E7E7");
	RoundedTop("div.box1dx","#F0F0F0","#999999","small");
	RoundedBottom("div.box1dx","#F0F0F0","#CCCCCC","small");
	RoundedTop("div.box2dx","#F0F0F0","#999999","small");
	RoundedBottom("div.box2dx","#F0F0F0","#CCCCCC","small");
	RoundedTop("div.box3dx","#F0F0F0","#999999","small");
	RoundedBottom("div.box3dx","#F0F0F0","#E7E7E7","small");
	RoundedTop("div.box4dx","#F0F0F0","#999999","small");
	RoundedBottom("div.box4dx","#F0F0F0","#CCFF66","small");
	RoundedTop("div.box1sx","#F0F0F0","#999999","small");
	RoundedBottom("div.box1sx","#F0F0F0","#E5ECF9","small");
	RoundedTop("div.box2sx","#F0F0F0","#999999","small");
	RoundedBottom("div.box2sx","#F0F0F0","#E5ECF9","small");
	RoundedTop("div.box3sx","#F0F0F0","#999999","small");
	RoundedBottom("div.box3sx","#F0F0F0","#E5ECF9","small");
	RoundedTop("div.box4sx","#F0F0F0","#999999","small");
	RoundedBottom("div.box4sx","#F0F0F0","#E5ECF9","small");
	RoundedTop("div.box5sx","#F0F0F0","#999999","small");
	RoundedBottom("div.box5sx","#F0F0F0","#CCFF66","small");
	RoundedTop("div.boxinfo","#F0F0F0","#CCCCCC","small");
	RoundedBottom("div.boxinfo","#F0F0F0","#CCCCCC","small");
	Rounded("div#formg","#E7E7E7","#CCCCCC");
	Rounded("div#formc","#E7E7E7","#CCCCCC");
	Rounded("label","#CCCCCC","#F0F0F0","small");
	RoundedBottom("div#footer","#A6A4A6","#E5ECF9","5");
}
Oltre a questi due naturalmente vi è anche il css che non ha
importanza in questa sede!
L'altro...
Script Sylesheets
Codice SyleSwap:
// JavaScript Document
//function changeSheet performs the style swap when given a title
function changeSheet(theSheet) {
  if(document.styleSheets){
    var c = document.styleSheets.length;
     for(var i=0;i<c;i++){
      if(document.styleSheets[i].title!=theSheet){
        document.styleSheets[i].disabled=true;
      }else{
        document.styleSheets[i].disabled=false;
      }
    }
  }
}
Quest'ultimo inoltre viene richiamato nel body in questo modo:
<body onload= "pageLoad()"  onUnload="applyChange()">
ed è quello che funziona non facendo vedere gli angoli
arrotondati...Quindi va in comflitto!!
Come risolvere??
Per un riferimento potete vederlo all'indirizzo 
http://www.medief.com
Grazie per la collaborazione

 <body onload= "pageLoad()"  onUnload="applyChange()">
Elimina dal body questi due attributi, lasciando solo <body>.
E aggiungi invece in coda a tutte le funzioni js, dentro il tag script sempre:
window.onload=function(){
	NiftyLoad();
	pageLoad();
}
window.onunload=function(){
	applyChange();
}
In sostanza: invece di assegnare direttamente all'onload la funzione per gli
angoli arrotondati, gli abbiamo dato un nome.
In questo modo la invochiamo, assieme a pageLoad, da una funzione anonima
assegnata all'event-handler onload.
Cosě facciamo felici tutt'eddue.
-- 
~ "Viviamo dei vuoti lasciati da qualcun'altro."

Ok, grazie, gentilissimo adesso applico subito le tue modifiche!

Allora ho provato come hai detto, ma non funziona! quindi ti chiedo
conferma se ho capito bene..L'ultima parte che dici di inserire in coda
a tutte le funzioni, deve essere inserita all'interno degli script che
richiamo esternamente..esempio
<script type="text/javascript"
src="../javascript/layout.js">codice</script> , o devo inserirlo dopo
il body richiamandoli sempre all'interno del tag <script>?
Ho provato in entrambi i casi ma non funziona...non so dimmi te dove
sbaglio. Grazie per l'attenzione





 }
Cioe', questa e' la funzione da eseguire al caricamento della pagina per
ottenere gli angoli arrotondati (bah... vabbe', de gustibus...).
Fatte queste premesse, veniamo a una possibile soluzione (ammettendo pero'
che la funzione pageLoad esista davvero e che non esistano altre
assegnazioni all'handler dell'evento onload)
1) Cambia la riga:
  window.onload=function() {
che ti ho indicato sopra con:
  function angoliArrotondati() {
Cambia solo la riga, nient'altro
2) Elimina gli attributi onload e onunload dal tag body, cioe' scrivi solo:
  <body>
3) Sposta questa roba:
  <script type="text/javascript" src="javascript/tooltip.js"></script>
  <script type="text/javascript" src="javascript/fontSize.js"></script>
  <script type="text/javascript" src="javascript/nifty.js"></script>
  <script type="text/javascript" src="javascript/layout.js"></script>
  <script type="text/javascript" src="javascript/styleSwap.js"></script>
  all'interno dal tag head (cioe', prima di </head>)
4) immediatamente dopo queste righe, e quindi sempre prima di </head>,
metti:
  <script type="text/javascript">
  //<![CDATA[
    window.onload=function() {
      pageLoad();
      angoliArrotondati();
      };
    window.onunload=function {
      applyChange();
      };
  //]]>
  </script>
Il tutto dorebbe funzionare, ribadisco, *sempre che non vi siano altre
istruzioni del tipo window.onload=function... nei file js esterni!!!*
Prova e vedi se va. Nel caso, un bonifico sul conto
9876942798749287984729879824987972 e' ben accetto :)
Se ho scritto cazzate, chiedo venia.
-- 
Nando [?]
Ex-Apostolo della Ex-Prova

 Prova e vedi se va. 
azz, ma tu fino a qualche giorno fa non ti vendevi come newbie?
:)
ced

Ok funziona, rispettando il post di ZERO, ma credo sia simile anche per
te NANDO.
Si non avevo postato bene il codice la funzione pageLoad è definta.
Solo che ora si presenta questo: Gli ngoli arrotondati si vedono, si
applica lo stylesheet per il layout, ma quando faccio aggiorna o cambio
pagina ritorna al layout iniziale, cosa che non deve accadere. Proprio
in questo caso che la funzione applyChange dovrebbe funzionare..come si
fa??
Newbie??? ma quando mai...

 fa??
Se hai scritto correttamente il codice, dovrebbe funzionarti. Ovvero, dovresti
avere qualcosa del tipo:
window.onunload=function(){
	applyChange();
}
nel tuo codice.
Puoi verificare che l'event-handler venga invocato, e che la funzione
applyChange sia definita:
window.onunload=function(){
	alert( window.applyChange )
	applyChange();
}
Se l'event-handler viene invocato e la funzione è definita, dovrebbe
visualizzarti un alert con il contenuto della stessa. Se non ti viene
visualizzato alcun alert, non viene invocato l'event-handler; se ti risponde
invece "undefined" significa che la funzione non è definita.
In ogni caso, prova a pubblicare online i sorgenti aggiornati, e vediamo cosa
c'è che non va.


 fa??
Se hai scritto correttamente il codice, dovrebbe funzionarti. Ovvero, dovresti
avere qualcosa del tipo:
window.onunload=function(){
	applyChange();
}
nel tuo codice.
Puoi verificare che l'event-handler venga invocato, e che la funzione
applyChange sia definita:
window.onunload=function(){
	alert( window.applyChange )
	applyChange();
}
Se l'event-handler viene invocato e la funzione è definita, dovrebbe
visualizzarti un alert con il contenuto della stessa. Se non ti viene
visualizzato alcun alert, non viene invocato l'event-handler; se ti risponde
invece "undefined" significa che la funzione non è definita.
Ovviamente controlla di avere i cookie abilitati. Tale funzione si baserà
sicuramente su di essi per poter funzionare correttamente.


 ha scritto:

Sinceramente, mi ritengo ancora un newbie. Questo non vuol dire che io sia
completamente sprovveduto; pero', ho moltissimo rispetto per le persone che
hanno studiato e lavorato per anni nel settore e la cui cultura nel campo
e' 1000000 milione di volte superiore alla mia e, inoltre, mi interesso a
queste cose per hobby, non per professione: per questo credo sia giusto
parlare di me stesso come di un inesperto.
Rileggendo, direi un logorroico, noioso inesperto :)


 parlare di me stesso come di un inesperto.
L'esperienza è a prescindere da titoli o professioni. Come hai potuto
constatare da te in un recente thread, molti che si spacciano per
professionisti e che sono pagati per lavorare in tale settore, hanno
un'esperienza e capacità decisamente inferiore alla tua.
Inoltre, non è il fatto che lavori in ambito informatico, che fa di te un
programmatore. Conosco moltissime persone che si sono riciclate in tale
settore, anche non avendo un'istruzione adeguata.
Credo che sia anche una questione di predisposizione mentale: non tutti ce
l'hanno. Neppure tra quelli che ci lavorano. E spesso capita invece di
trovarla in persone che non ne hanno fatto una professione.
Tra l'altro, la professione dell'informatico è strana: citando uno dei miei
documenti preferiti, "un programmatore viene pagato da qualcuno per fare
qualcosa che farebbe in ogni caso". E' uno degli aspetti più belli di questo
lavoro, il fatto che.. beh, in fondo non è un lavoro. Non come gli altri. E'
anche il tuo hobby. Non c'è una linea che li separa. Quando torni a casa, non
ti getti il lavoro alle spalle. Continui a ricercare, documentarti, provare,
"spippolare", testare... divertirti.
E' uno dei motivi per cui, quando delle volte penso che vorrei mandare tutto a
capra e cavoli e dedicarmi a qualcosa di completamente diverso; sono sempre un
po' restio nel farlo.
Anche se so che, se mai un giorno decidessi in tal senso, alla fine continuerò
a sviluppare. "Come hobby". :)
-- 
~ Tenete la morte lontano dalle strade. Guidate sul marciapiede.

 
magari logorroico sì, ma chi non lo è :)
ced

Ho provato velecemente Ieri sera e sembra che ancora non funzionasse,
ho poco tempo per pubbliacarlo in internet, vi farò sapere,
L'unico problema sempre, che non resta applicato il cambio del layout!!
Grazie cmq. ciao

 a sviluppare. "Come hobby". :)
Io, di professione, suono: capisco perfettamente questo tuo discorso :)
