Newsgroup: it.comp.lang.javascript
Titolo: Problema con onmouseover

Salve a tutti. Ho realizzato uno script di aggiornamento delle news con 
un effetto di fade in e fade out. Vorrei però riuscire a bloccare il 
refresh quando l'utente posiziona il mouse sul div. Questo è facile così 
come far riprendere l'effetto all'uscita del mouse. Almeno così credevo.
Se il mouse si ferma sul div per un tempo sufficiente (qualce sec) tutto 
è ok e lo script riprende come prima all'uscita. Se però il mouse passa 
sul div rapidamente allora tutte le temporizzazioni saltano (da 5 sec 
tra una news e la successiva a 1-2 secondi). Non so assolutamente il perchè.
Questo è il mio script:
/* script per le news con effetto fade da bianco (W) a blu (B) */
	var divs = document.getElementsByTagName("div")		/*estrazione degli 
elementi "div"*/
	var links = document.getElementsByTagName("a")		/*estrazione degli 
elementi "link"*/
	var news = new Array()
	var newslink = new Array()
	var delay = 5000		/*tempo di aggiornamento della news*/
	var colordelay = 20		/*tempo di aggiornamento del colore a ogni passaggio*/
	var index = 0
	/* test mouseover */
	var testMouse = false
	var mousedelay = 1000
	var checkTime
	/* colore rgb bianco */
	var hexR = 255
	var hexG = 255
	var hexB = 255
	/* indice per il cambiamento di colore */
	var passaggioColore = 1
	/* impostazione dei colori iniziale e finale */
	var white = "rgb(255,255,255)"
	var blue = "rgb(0,0,140)"
/* funzione richiamata al caricamento della pagina */
function newsHome(){
	/* estrazione degli elementi "div" con classe "news" */
	var j = 0
	for(i=0;i<divs.length;i++){
		news[j] = divs[i];
		j = (divs[i].className=="news") ? j+1 : j;
	};
	/* estrazione degli elementi "link" con classe "news" */
	j=0;
	for(i=0;i<links.length;i++){
		newslink[j] = links[i];
		j = (links[i].className=="news") ? j+1 : j;
	};
	/* assegnamento del colore white a tutti gli elementi */
	for(i=0;i<news.length;i++)
	{	news[i].style.color = white;
		news[i].style.visibility = "hidden";		/* mascheramento cautelativo dei 
div delle news */
	};
	for(i=0;i<newslink.length;i++) newslink[i].style.color = white;
 
	index = news.length-1;
	changeContent();
	/* assegnamento degli eventi onmouse */
}
/* funzione per il cambiamento della news ogni delay */
function changeContent(){
	news[index].style.visibility = "hidden";					/* tutti i div vengono 
mascherati */
	index = (index==news.length-1) ? 0 : (index+1);		/* aggiornamento 
dell'indice della news */
	news[index].style.visibility = "visible";				/* solo il div di 
interesse viene mostrato */
	setTimeout("changeColorWB();",colordelay);			/* colre W->B */
}
/* funzione di cambiamento del colore W->B */
function changeColorWB(){
	if(passaggioColore<20){
		/* aggiornamento rgb */
		hexR -= 12;
		hexG -= 12;
		hexB -= 5;
		/* cambiamento di colore nel div della news di interesse */
		news[index].style.color = "rgb("+hexR+","+hexG+","+hexB+")";
		/* cambiamento colore nei link (tutti) */
		for(i=0;i<newslink.length;i++) newslink[i].style.color = 
"rgb("+hexR+","+hexG+","+hexB+")";
		passaggioColore++;		/* incremento contatore */
		setTimeout("changeColorWB()",colordelay);	/* attesa del tempo 
colordelay prima del passaggio successivo */
	}
	else{	/* terminato l'effetto fade */
		/* aggiornamento del contatore al valore iniziale */
		passaggioColore = 1;
		/* aggiornamento rgb per la prossima transizione B->W */
		hexR = 0;
		hexG = 0;
		hexB = 140;
		/* aggiornamento definitivo colore */
		news[index].style.color = blue;
		for(i=0;i<newslink.length;i++) newslink[i].style.color = blue;
		/* chiamata alla transizione B->W dopo un tempo delay */
		/*setTimeout("changeColorBW();",delay);*/
		setTimeout("waitMouse();",delay);
	}
}
/* funzione di transizione inversa B->W */
function changeColorBW(){
	if(passaggioColore<20){
		hexR += 12;
		hexG += 12;
		hexB += 5;
		news[index].style.color = "rgb("+hexR+","+hexG+","+hexB+")";
		for(i=0;i<newslink.length;i++) newslink[i].style.color = 
"rgb("+hexR+","+hexG+","+hexB+")";
		passaggioColore++;
		setTimeout("changeColorBW()",colordelay);
	}
	else{
		passaggioColore = 1;
		hexR = 255;
		hexG = 255;
		hexB = 255;
		news[index].style.color = white;
		for(i=0;i<newslink.length;i++) newslink[i].style.color = white;
		/* chiamata funzione di cambiamento della news */
		setTimeout("changeContent();",colordelay);
	}
}
/* funzione che attende l'uscita del mouse */
function waitMouse()
{
   if(testMouse)
   {
     ;
   }
   else
   {
     setTimeout("changeColorBW()",500);
   }
}
function mouseOver()
{
   testMouse = true;
}
function mouseOut()
{
   testMouse = false;
   setTimeout("waitMouse()",500);
}
Trovate l'implementazione su 
www.grupposistemiaziendali.it
Spreste dirmi perchè accade tutto ciò?
Grazie per l'aiuto.
Mik

 Questo è il mio script:
[CUT]
setTimeout restituisce un riferimento, perché non usi quello?
a) MyTimeout=setTimeout(...)
b) onmouseover="clearTimeout(MyTimeout)"
c) onmouseout="MyTimeout=setTimeout(...)"
Oppure anziché setTimeout potresti usare setInterval
-- 
"That until there is no longer first class
And second class citizens of any nation
Until the colour of a man's skin
Is of no more significance than the colour of his eyes
Me say war"
B.M.

 
Ho tentato: il risultato non cambia! Impazziscono tutte le 
temporizzazioni anche se le pulisco e le setto nuovamente.
Mah.
Grazie mille
Mik
p.s.: con setInterval dovrei ripulire ogni volta che faccio un fadein o 
un fadeout ed ogni volta che carico una news? I tempi sono molto diversi.

 	setTimeout("changeColorWB(); ", colordelay); 			/* colre W->B */
Prova ad aggiungere questa funzione allo script:
function gfC_timeOut(){
    document.gfC_time?clearTimeout(document.gfC_time):null;
    document.gfC_time=setTimeout(arguments[0], arguments[1]); 	
}
cambia le chiamate al setTimeout in questo modo:
gfC_timeOut("changeColorWB(); ", colordelay);
//setTimeout("changeColorWB(); ", colordelay);
gfC_timeOut("changeColorWB() ", colordelay);
//setTimeout("changeColorWB() ", colordelay);
 
gfC_timeOut("waitMouse(); ", delay);
//setTimeout("waitMouse(); ", delay);
...
...
in questo modo interrompi sempre il timeOut prima di iniziarne un'altro, e
non corri il rischio che si sommino, come invece accade ora.
Dovrebbe funzionare.
-- 
  web || 
www.gfcarlotti.it
    *     (__Vale_the doctor___) *     *    o  *
 mail || text welcome in Reply-To     *     (__46__) *  *   *  _o   * /\_
  pgp || 
www.gfcarlotti.it/pgp/franco.asc
  *    _\_  *     * _< \_ * _>(_)
  net || Hamster/40tude Dialog/K-Meleon/su USB Flash Drive _(_)>(_)_(_)___

 
E` nella pratica la stessa cosa suggeritami precedentemente.
Tuttavia ho tentato anche in questo modo ma il problema persiste.
Io sinceramente non riesco a capire il motivo!
Grazie
Mik

 Mik
Nemmeno io, qui ho fatto una piccola prova:
http://www.gfcarlotti.it/gfC_timeOut.htm
O non ho capito, oppure guarda l'esempio e sappimi dire.


 
Hai ragione. Ora funziona (perň stavolta ho copiato e incollato il tuo 
codice!). Domani con piů calma proverň a capire dove sbagliavo.
Grazie per il prezioso aiuto.
Mik


Non ho resistito e ci ho guardato subito. Era identico a quello che mi 
ero fatto oggi. Avevo anche tentato la stessa cosa ma utilizzando le 
funzioni setTimeout e clearTimeout ad ogni chiamata perň sembrava non 
funzionasse. Poteva essere un problema di cache, magari mi caricava lo 
script da lě. L'alternativa č che mi fossi dimenticato di salvare prima 
di fare la prova!
Scusate per l'insistenza. Ora tutto funziona.
Grazie ancora
Bye
Mik