Javascript vanuit Flash erg traag in IE8

  • Onderwerp starter Onderwerp starter Cyroq
  • Startdatum Startdatum
Status
Niet open voor verdere reacties.

Cyroq

Gebruiker
Lid geworden
7 apr 2009
Berichten
180
Hallo,

Na al jaren een website online te hebben kom ik erachter dat IE weer 's moeilijk doet. Ik heb een flash menu die via javascript div's op de pagina zichtbaar of onzichtbaar maakt:
Code:
getURL("javascript:showdiv('nameDiv')");
De functie showdiv ziet er vervolgens zo uit:
Code:
function showdiv(pass) { 
var divs = document.getElementById('content').getElementsByTagName('div');
for(div in divs) {
    for(i=0;i<divs.length;i++){     
    if(divs[i].id.match(pass)){//if they are 'see' divs 
        if (document.getElementById) // DOM3 = IE5, NS6 
            divs[i].style.display="block";// show/hide 			}
        else if (document.layers) // Netscape 4 
            document.layers[divs[i]].display = 'block'; 
        else // IE 4 
            document.all.divs[i].display = 'block'; 
        } 
    else { 
        if (document.getElementById) 
            divs[i].style.display="none"; 
        else 
        if (document.layers) // Netscape 4 
            document.divs[i].display = 'none'; 
        else // IE 4 
            document.all.divs[i].display = 'none'; 
            }
	}
}
In Chrome en Firefox werkt dit prima, maar in IE8 is er een vertraging van 2 seconden na het klikken op de link. Kent iemand dit probleem en is er een oplossing voor?
Alvast bedankt!
 
[...] een vertraging van 2 seconden [...]

Zie ook geen timer-functies. Als dit je probleem is ligt het eerder aan het flash->IE8 engine, en niet aan je Javascript. In principe is dit namelijk 'instant'. Dus niet iets wat oplosbaar is :)


Wat misschien een idee is om bovenaan de functie een alert() te gooien, en net voor je call in Flash ook iets van een output te geven. Dan kan je zien waar precies de vertraging zit (mijn geld staat dus op de IE8/flash).



Also, dit is natuurlijk 'onzin':

[js]if (document.getElementById) // DOM3 = IE5, NS6 [/js]

Netscape is al 100 jaar dood. IE5 bestaat ook al jaren niet meer. Checken of er support is voor getElementById is zinloos tegenwoordig, daar kan je gewoon van uitgaan, helemaal als je ook flash gebruikt. Kans is groter dat flash niet werkt dan dat d.gEBY niet bestaat.
 
Laatst bewerkt:
Daar heb je een punt wat betreft Netscape... :P Ik heb even met alert zitten spelen, het lijkt erop dat de vertraging plaatsvindt in de eerste 'for'. Het is wel een flinke loop: divs.length levert 54 op. Maar daar zou een browser toch niet zo'n probleem mee moeten hebben? Misschien is het mogelijk het script anders in elkaar te zetten?
 
Ohja, dat was ik vergeten in m'n post: op regel 2 gebruik je d.gEBY gewoon, en pas op regel 6 check je of 'ie wel bestaat. Dus helemaal raar ;)

Staat m'n geld toch op de verkeerde plek... kan ik nog veranderen? :p


---


Anway: het is zowiezo een rare loop. for(x in y) gebruik je om over de properties van een object te loopen, niet om door een array heen te gaan. Daarnaast loop je voor elke div die er is, nog eens door elke div heen. Volgens mij is dat dan dus 54 * 54, wat dus best veel is. Probeer dit eens:

[js]function showdiv(pass)
{
var i,
divs = document.getElementById('content').getElementsByTagName('div'),
len = divs.length;

for(i = 0; i < len; i++)
{
divs.style.display = divs.id.match(pass) ? 'block' : 'none';
// als het matched zet je de display naar block, anders naar none.
}
}[/js]

stuk makkelijker en netter, no? :)
 
Laatst bewerkt:
Die techniek met ? en : heb ik nooit eerder gebruikt, is meteen een stuk overzichtelijker. Met wat getweak in de andere regels die ik er bij had staan is het helemaal gelukt. Bedank! :)
 
Ja, het is inderdaad een stuk overzichtelijker in dit geval; maar let op, in complexere structuren kan het een stuk beter zijn om het gewoon uit te schrijven! Dit maakt het een stuk overzichtelijker, vooral met diepere if-statements.

Mooi dat het gelukt is!


:thumb:
 
Eh, analyse: in den beginne staat er 1 div open, zeg die met id="div01".
Daarna moet het javascript een willekeurige andere div van de 54 opentrekken, en de eerste moet dicht.
De rest is al dicht, en ze hebben allemaal keurig een id.
Als dit gebeurd is, moet het js een willekeurige andere div kunnen openen, en de openstaande verstoppen. Enz. - ad infinitum.

Is er dan niet helemaal geen loopje langs de 53 toch al gesloten div's nodig, om die nog eens dicht te doen?
Alleen de ene openstaande moet dicht, en die is makkelijk traceerbaar:
[JS]var oldpass="div01";
function showdiv(pass) {
document.getElementById(oldpass).style.display="none";
document.getElementById(pass).style.display="block";
oldpass=pass;
}[/JS]
Scheelt weer een wandeling, toch? :)

Tenzij het in een var stoppen cq. opvragen van de oude waarde langer duurt dan de hele wandeling, maar dat hoop ik niet.

Met vriendelijke groet,
CSShunter
_________
PS: het moet wel in bovenstaande volgorde, anders kan een al openstaande div niet onmiddellijk heropend worden, als iemand dat zou willen.
PS-2: "d.gEBY" = "document.getElementByYourself" ? ;)
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan