langsamer netscape browser
Marcel Stör
- javascript
hallo zusammen
untenstehender code stellt ein js spiel im sinne von hangman dar. beim testen habe ich festgestellt, dass netscape extrem lange braucht um den code abzuarbeiten und das resultat darzustellen. auch bem IE verschwindet das bild kurz, doch der navigator braucht doch einige sekunden. wo liegt hier der haken und wie kann ich das umgehen? ich bin froh um intelligente hinweise.
gruss
marcel
function getCookie (name)
{
var dcookie = document.cookie;
var cname = name + "=";
var clen = dcookie.length;
var cbegin = 0;
while (cbegin < clen)
{
var vbegin = cbegin + cname.length;
if (dcookie.substring(cbegin, vbegin) == cname)
{
var vend = dcookie.indexOf (";", vbegin);
if (vend == -1) vend = clen;
return unescape(dcookie.substring(vbegin, vend));
}
cbegin = dcookie.indexOf(" ", cbegin) + 1;
if (cbegin == 0) break;
}
return null;
}
function setCookie (name, value, expires)
{
if (!expires) expires = new Date();
document.cookie = name + "=" + escape (value) + "; expires=" + expires.toGMTString() + "; path=/";
}
function delCookie (name)
{
var expireNow = new Date();
document.cookie = name + "=" + "; expires=Thu, 01-Jan-70 00:00:01 GMT" + "; path=/";
}
//==============================================================================
// Global Variables
var Alphabet = new initAlphaArray()
var NumOfWords = 10;
var SaveData = "";
var ImageNum = "";
var LettersSelected = "";
var RandomWord = "";
var DisplayWord = "";
var position = 0;
var word = new WordList();
var expdate = new Date();
var RandomNumber = (expdate.getSeconds())%NumOfWords;
function initAlphaArray()
{
this.length = 29
this[0] = "A"
this[1] = "B"
this[2] = "C"
this[3] = "D"
this[4] = "E"
this[5] = "F"
this[6] = "G"
this[7] = "H"
this[8] = "I"
this[9] = "J"
this[10] = "K"
this[11] = "L"
this[12] = "M"
this[13] = "N"
this[14] = "O"
this[15] = "P"
this[16] = "Q"
this[17] = "R"
this[18] = "S"
this[19] = "T"
this[20] = "U"
this[21] = "V"
this[22] = "W"
this[23] = "X"
this[24] = "Y"
this[25] = "Z"
this[26] = "Ä"
this[27] = "Ö"
this[28] = "Ü"
}
function WordList()
{
this.length = NumOfWords; // allocate array space
this[0] = "HUMORVOLL";
this[1] = "EHRGEIZIG";
this[2] = "AUSDAUERND";
this[3] = "PFLICHTBEWUSST";
this[4] = "TEAMORIENTIERT";
this[5] = "BEGEISTERUNGSFÄHIG";
this[6] = "SCHNELL";
this[7] = "PFLEGELEICHT";
this[8] = "EHRLICH";
this[9] = "WILLENSSTARK";
}
function availableLetters(i)
{
if (LettersSelected.charAt(i)==Alphabet[i])
document.write('<TD ALIGN=CENTER VALIGN=CENTER WIDTH=20 HEIGHT=12>' +
'<B><A HREF="javascript:LoadNextPage('+i+',''+Alphabet[i]+
'')">'+Alphabet[i]+'</A></B></TD>');
else
document.write('<TD ALIGN=CENTER VALIGN=CENTER WIDTH=20 HEIGHT=12> </TD>');
}
function LoadNextPage(selected,letter)
{
if (RandomWord.indexOf(letter) == -1)
{
if (ImageNum == "A") ImageNum = "B";
else if (ImageNum =="B") ImageNum = "C";
else if (ImageNum =="C") ImageNum = "D";
else if (ImageNum =="D") ImageNum = "E";
else if (ImageNum =="E") ImageNum = "F";
else if (ImageNum =="F") ImageNum = "G";
else if (ImageNum =="G") ImageNum = "H";
else if (ImageNum =="H") ImageNum = "I";
else if (ImageNum =="I") ImageNum = "J";
else ImageNum = "A";
}
var j=0;
var HoldLettersSelected = LettersSelected;
LettersSelected = "";
if (selected == 0)
{
for (j=1; j<=28; j++)
{
LettersSelected += HoldLettersSelected.charAt(j);
}
LettersSelected = "^" + LettersSelected;
}
else if (selected == 28)
{
for (j=0; j<=27; j++)
{
LettersSelected += HoldLettersSelected.charAt(j);
}
LettersSelected += "^";
}
else
{
for (j=0; j<selected; j++)
{
LettersSelected += HoldLettersSelected.charAt(j);
}
LettersSelected += "^";
for (j=selected+1; j<=28; j++)
{
LettersSelected += HoldLettersSelected.charAt(j);
}
}
SaveData = ImageNum + LettersSelected + RandomWord + "*";
setCookie("_HangMan", SaveData, expdate);
history.go(0);
}
// Main Code
// Set cookie to expire in 10 days
//
// 1000 milliseconds (milliseconds per second)
// * 60 milliseconds (seconds per minute)
// * 60 milliseconds (minutes per hour)
// * 24 milliseconds (hours per day)
// * 10 milliseconds (days)
// -----------------
// = 10 days
//
expdate.setTime (expdate.getTime() + (1000*60*60*24*10));
// Cookie does not exist processing
if(getCookie("_HangMan") == null)
{
ImageNum = "A";
LettersSelected = "ABCDEFGHIJKLMNOPQRSTUVWXYZÄÖÜ";
RandomWord = word[RandomNumber];
SaveData = ImageNum + LettersSelected + RandomWord + "*";
setCookie("_HangMan", SaveData, expdate);
}
// Cookie exists processing
else
{
SaveData = getCookie("_HangMan");
ImageNum = SaveData.charAt(0);
for (position=1; position<=29; position++)
{
LettersSelected += SaveData.charAt(position);
}
for (position=30; position<SaveData.indexOf("*"); position++)
{
RandomWord += SaveData.charAt(position);
}
}
// Calculate how the word the user is guessing should be displayed
DisplayWord = "";
for (i=0; i<RandomWord.length; i++)
{
if (RandomWord.charAt(i) == ' ')
{
DisplayWord += " ";
}
else
{
MatchFound = false;
for (j=0; j<=28; j++)
{
if ((LettersSelected.charAt(j) == "^") && (RandomWord.charAt(i) == Alphabet[j]))
{
DisplayWord += RandomWord.charAt(i);
MatchFound = true;
}
}
if (!MatchFound) DisplayWord += "-";
}
}
// Draw Screen
document.write('<TITLE>Marcel Stoer, game</TITLE>');
document.write('<BODY');
document.write('<BR>');
document.write('<div align="center"><center>');
document.write('<table border="0" width="">');
document.write('<tr>');
document.write('<td valign="top" align="center" width="375">');
if (ImageNum == "J")
{
document.write('<h1>Verloren!</h1><BR><h2>Antwort: "' + RandomWord + '"</h2>');
}
else if (RandomWord == DisplayWord)
{
document.write('<h1>Gewonnen!</h1>');
}
else
{
document.write('<BR><strong>Wählen Sie aus folgenden Buchstaben:</strong>');
document.write('<TABLE>');
document.write('<TR>');
for (i=0; i<14; i++) availableLetters(i);
document.write('</TR>');
document.write('<TR>');
for (i=14; i<29; i++) availableLetters(i);
document.write('</TR>');
document.write('</TABLE>');
}
document.write('<BR>');
document.write('<BR>');
document.write('<TT>');
document.write(DisplayWord);
document.write('</TT>');
document.write('<FORM>');
document.write('<INPUT TYPE="button" VALUE="Neu beginnen"'+
'ONCLICK="delCookie('_HangMan');history.go(0);">');
document.write('<INPUT TYPE="button" VALUE="Spiel verlassen"'+
'ONCLICK="delCookie('_HangMan');history.go(-1);">');
document.write('</FORM>');
document.write('</CENTER>');
document.write('</td>')
document.write('<td valign="top" align="center" width="375"><IMG HEIGHT=280 WIDTH=306 ALT="Marcel Stoers Charakter"'+
'SRC="images/hangman/hangman'+ImageNum+'.gif" ></td>');
document.write('</tr>');
document.write('</table>');
document.write('</center></div>');
// -->
beim testen habe ich festgestellt, dass netscape extrem lange braucht um den code abzuarbeiten und das resultat darzustellen. wo liegt hier der haken und wie kann ich das umgehen? ich bin froh um intelligente hinweise.
Performanceanalyse ist eines der komplexesten Probleme überhaupt in der Programmierung.
Dein Code ist zu umfangreich, als daß sich das bisher jemand angetan hätte.
Ich würde Dir empfehlen, an bestimmten Stellen Zwischenausgaben vorzunehmen (z. B. alert()-Boxen), um erst einmal einzuschachteln, ob das Performance-Problem am Layout durch den Browser liegt (was nach Deinen Angaben wahrscheinlich ist - dann müßte man den generierten HTML-Code bzw. die Generierungsmethode mittels document.write() optimieren) oder ob in Deinem Routinen ineffiziente Vergleiche, Zeichenkettensuchen etc. vorliegen.
Je kleiner Du den kritischen Abschnitt einschachteln kannst und je klarer wird, ob ein Browser-, HTML-, JavaScript- oder algorithmisches Problem vorliegt, desto eher wirst Du Hilfe erhalten.