nella mia pagina index ho inserito, come da oggetto, delle animazioni java, due per la precisione.
la pagina si comporta correttamente in tutti i browser, almeno al primo caricamento, compare il logo flash, quando questo finisce richiama la funzione che fà partire il preload, che a sua volta esegue prima il fade-in della barra di preload, a caricamento effettuato c'è il fade-out di quest'ultima e contemporaneamente il fade-in del div contenente i link per accedere al sito in italiano o inglese (con background animato della bandiera "proiettata" sotto che si illumina al passaggio del mouse sui[*] che contiengono i link testuali)
come detto, tutto questo succede al primo caricamento, ma in explorer 6 funziona solo la prima volta, se si prova a ritornare alla pagina o cliccando su un link ad essa relativa, o facendo il refresh, o richiamando l'indirizzo dalla barra degli indirizzi del browser ogni volta si comporta in modo diverso :
-sparisce il background della pagina
-non compare la barra ma compare la percentuale
-compaiono i link con background ma senza animazione
-c'è il background solo al link in italiano ma senza animazione
-compare il logo flash e fade in dei link ma senza alcun background(della pagina e dei[*])
questo grosso modo è il problema più grave, in explorer 7 invece se si refresha la pagina l'animazione dello sfondo dei link non parte più
in firefox si comporta in modo strano se si torna alla pagina usando la funzione history-back del browser, i div dei link sono già visibili e la barra del preload tenta di avanzare oltre il 100% (ma ho risolto parzialmente inserendo un controllo prima dell'inizio del preload, così se trova i[*] visibili la barra non avanza perchè il preload è già completo)
vi posto di seguito i codici rispettivi, se riuscite a capire cosa c'è che non và mi fate un favore enorme perchè non sò più dove sbattere la testa...
__________________________________________________ ___________________________
questo è il codice del preload
codice:
function preFIRE() {if(document.getElementById('ling').style.visibility != "visible")
setTimeout("fade('bar')",1300);
setTimeout("fade('bg')",1300);
setTimeout("fade('loadER')",1300);
setTimeout("fade('percent')",1300);
setTimeout("startLoading()",1750);
}
var pics = new Array(<? ?>);
/////URL DOPO LA FINE DEL DOWNLOAD
var url = "it/index.html";
/////MESSAGGIO POPUP DI CONFERMA NEL BROWSER
var doConfirm = false;
/////SKIP PRELOAD
var canSkip = false;
var imgObjs = new Array(pics.length);
var loaded = 0;
var total = pics.length;
var cPercent = 0;
var barLayer = null;
var percentLayer = null;
var statLayer = null;
var doneMsgLayer = null;
function getLayer(layerID) {
if (document.getElementById)
return document.getElementById(layerID);
else if (document.all)
return document.all[layerID];
else
return null;
}
function startLoading() {
if (document.getElementById || document.all)
{
barLayer = getLayer("bar");
percentLayer = getLayer("percent");
statLayer = getLayer("stat");
doneMsgLayer = getLayer("doneMsg");
loadERLayer = getLayer("loadER");
loadINGLayer = getLayer("loadING");
loadEDmLayer = getLayer("loadEDm");
loadEDpLayer = getLayer("loadEDp");
lingLayer = getLayer("ling");
barLayer = getLayer("bar");
bgLayer = getLayer("bg");
if (canSkip)
doneMsgLayer.innerHTML = "<span></span><a href=\"javascript:done()\"><font face=\"Arial\" color=\"#CCCCCC\" size=\"1\">Skip Pre-Load</font></a>";
for (i=0; i<pics.length; i++)
{
imgObjs[i] = new Image();
imgObjs[i].onload = imgLoaded;
imgObjs[i].onerror = imgFailed;
imgObjs[i].src = pics[i];
}
}
else
{
window.location.replace(url);
}
}
function imgLoaded() {
loaded++;
if (loaded>pics.length)
return
updateBar();
}
function updateBar() {
var percent = Math.round(loaded/total * 100);
if (cPercent != percent)
{
cPercent = percent;
barLayer.style.width = (cPercent*3) +"px";
percentLayer.innerHTML = "<font font-family: Arial, Helvetica, sans-serif;color: #FFFFFF;font-size: 9px;>" +cPercent+ "%</font>";
statLayer.innerHTML = "<font font-family: Arial, Helvetica, sans-serif;color: #FFFFFF;font-size: 9px;>" +loaded+ "/" +total+ "</font>";
}
if (loaded == total)
{
doneMsgLayer.innerHTML = "";
////per entrare nel sito <a href=\"javascript:done()\"><font face=\"Arial\" color=\"#FFFFFF\" size=\"1\"></font></a>
////loadERLayer.style.visibility = 'hidden';
loadINGLayer.style.visibility = 'visible';
///loadEDmLayer.style.visibility = 'visible';
///loadEDpLayer.style.visibility = 'visible';
lingLayer.style.visibility = 'visible';
fade('ling');
fade('bar');
fade('bg');
fade('loadER');
fade('percent');
///////////////REINDIRIZZAMENTO AUTOMATICO///////////setTimeout("done()",1500);
if (doConfirm && confirm("Download terminato, andare all'Home page?"))
done();
}
}
function done() {
parent.window.location.replace(url);
}
function imgFailed() {
alert("The following image failed to load, probably a broken link:\n" +this.src+ "\nPlease contact the webmaster of the site about this. The program will skip this file now.");
loaded++;
updateBar();
}
ho tentato di associare l'animazione del preload (i 4 timeout iniziali) a un div che li contenesse tutti ma misteriosamente non funziona, parte solo in quel modo...
questo è il codice che fà comparire/scomparire gli elementi di cui viene specificato il div(fade),
ciascun elemento ha le seguenti proprietà CSS :
{filter:Alpha(opacity=00);-moz-opacity:0.0;opacity:0.0}
lo script le incrementa gradualmente facendo così apparire gli elementi dal nulla...
codice:
var TimeToFade = 400.0;
function fade(eid){
var element = document.getElementById(eid);
if(element == null)
return;
if(element.FadeState == null){
element.FadeState = -2;
}
if(element.FadeState == 1 || element.FadeState == -1){
element.FadeState = element.FadeState == 1 ? -1 : 1;
element.FadeTimeLeft = TimeToFade - element.FadeTimeLeft;
}else{
element.FadeState = element.FadeState == 2 ? -1 : 1;
element.FadeTimeLeft = TimeToFade;
setTimeout("animateFade(" + new Date().getTime()
+ ",'" + eid + "')", 33);
}
}
function animateFade(lastTick, eid){
var curTick = new Date().getTime();
var elapsedTicks = curTick - lastTick;
var element = document.getElementById(eid);
if(element.FadeTimeLeft <= elapsedTicks){
element.style.opacity = element.FadeState == 1 ? '1' : '0';
element.style.filter = 'alpha(opacity = '
+ (element.FadeState == 1 ? '80' : '0') + ')';
element.FadeState = element.FadeState == 1 ? 2 : -2;
return;
}
element.FadeTimeLeft -= elapsedTicks;
var newOpVal = element.FadeTimeLeft/TimeToFade;
if(element.FadeState == 1)
newOpVal = 1 - newOpVal;
element.style.opacity = newOpVal;
element.style.filter =
'alpha(opacity = ' + (newOpVal*80) + ')';
setTimeout("animateFade(" + curTick
+ ",'" + eid + "')", 33);
};
function toggleDisplay(eid) {
var element = document.getElementById(eid);
if(element == null)
return;
if(document.getElementById(eid).style.display == 'none' ) {
document.getElementById(eid).style.display = 'block';
}else{ setTimeout("setNone('"+eid+"')",TimeToFade);
}
}
function setNone(eid)
{
document.getElementById(eid).style.display = 'none';
}
il seguente invece è il codice per animare il background (ormai lo conoscete benissimo...
)
codice:
if (document.getElementById && document.getElementsByTagName) {
if (window.addEventListener) window.addEventListener('load', initAnims, false);
else if (window.attachEvent) window.attachEvent('onload', initAnims);
}
function initAnims() {
classChange(document.getElementById('ling'),'scriptactive','noscript')
var animElements = document.getElementById('ling').getElementsByTagName('li');
for(var i=0; i<animElements.length; i++) {
animElements[i].bgAnim = {
iPos:[0,0],
pUnit:['%','px'],
cFrame:0,
mFrame: 14,
dPos:[0,-80],
mSec:15
}
animElements[i].onmouseover = backPosAnimF;
animElements[i].onmouseout = backPosAnimR;
}
function backPosAnimF() {
doBackPosAnim(this,this.bgAnim,this.bgAnim.cFrame, this.bgAnim.mFrame);
}
function backPosAnimR() {
doBackPosAnim(this,this.bgAnim,this.bgAnim.cFrame, 0);
}
}
function doBackPosAnim(elem,vrH,startFrm,endFrm) {
if (vrH.intID) window.clearInterval(vrH.intID);
var actStep = 0, steps = Math.abs(endFrm - startFrm)+1;
vrH.intID = window.setInterval(
function() {
vrH.cFrame = easeInOut(startFrm,endFrm,steps,actStep,1);
vrH.cPos = [
vrH.iPos[0]+vrH.cFrame*vrH.dPos[0],
vrH.iPos[1]+vrH.cFrame*vrH.dPos[1]
];
elem.style.backgroundPosition = vrH.cPos[0]+vrH.pUnit[0]+' '+vrH.cPos[1]+vrH.pUnit[1];
actStep++;
if (actStep > steps) window.clearInterval(vrH.intID);
}
,vrH.mSec)
}
function doBackPosChange(elem,vrH,startPos,endPos,steps,intervals,powr) {
if (vrH.intID) window.clearInterval(vrH.intID);
var actStep = 0;
vrH.intID = window.setInterval(
function() {
vrH.cPos = [
easeInOut(startPos[0],endPos[0],steps,actStep,powr),
easeInOut(startPos[1],endPos[1],steps,actStep,powr)
];
elem.style.backgroundPosition = vrH.cPos[0]+vrH.pUnit[0]+' '+vrH.cPos[1]+vrH.pUnit[1];
actStep++;
if (actStep > steps) window.clearInterval(vrH.intID);
}
,intervals)
}
function easeInOut(minValue,maxValue,totalSteps,actualStep,powr) {
totalSteps = Math.max(totalSteps,1)
var delta = maxValue - minValue;
var stepp = minValue+(Math.pow(((1 / totalSteps)*actualStep),powr)*delta);
return Math.ceil(stepp)
}
function classChange(elem,addClass,remClass) {
if (!elem.className) elem.className = '';
var clsnm = elem.className;
if (addClass && !clsnm.match(RegExp("\\b"+addClass+"\\b"))) clsnm = clsnm.replace(/(\S$)/,'$1 ')+addClass;
if (remClass) clsnm = clsnm.replace(RegExp("(\\s*\\b"+remClass+"\\b(\\s*))*","g"),'$2');
elem.className=clsnm;
}
function showError(str) {
if (window.opera) opera.postError('|'+str+'|');
else alert('|'+str+'|');
}