Felix Riesterer: IE hat ein Problem mit folgendem Script...

Beitrag lesen

Lieber Harlekin,

mh, das was im Quellcode ankomm sind 1222 zeilen, eventuell würde das hier den Ramen sprängen

dann poste doch einen Link zu der Seite!

deshalb such ich mal die betroffene Stelle heraus:

Das ist gut. Dann schauen wir uns den Ausschnitt einmal an.

<script type="text/javascript">
<!--
var out = "Und wiedereinmal der Text";

Was sollen die HTML-Kommentare hier? Wir sind doch jetzt im JavaScript-Kontext und nicht mehr im HTML-Kontext. Wenn Du's absolut sauber machen willst, dann schreibe das so:

<script type="text/javascript">//<![CDATA[

var out = "Und wiedereinmal der Text";  
...  
//
~~~`]]></script>`{:.language-html}  
  
Im weiteren Verlauf definierst Du eine Hand voll globale Variablen ("out", "lettercounter", "tmp" und "end"), lässt eine unüberschaubare Quelltextverunreinigung ins Dokument schreiben (Deine document.write()-Anweisung) und definierst dann eine Funktion "characounter". Letztere soll dann alle 55 Millisekunden aufgerufen werden (setInterval(...)).  
  
Warum der IE streikt, könnte ein Timing-Problem sein. Das document.write könnte dafür sorgen, dass der IE den Quelltext erst in echte HTML-Elemente im DOM-Baum umwandeln muss, was bekanntlich im IE einiges an Zeit kostet. Da kann es dann schon sein, dass characounter zu schnell aufgerufen werden soll, sodass er einen Schluckauf bekommt. Vielleicht hilft ja eine zeitverzögerte Zündung? Ich komme gleich darauf zurück.  
  

> var tmp = out.split('');  
> var end = tmp.length;  
  
Die Variable "end" könnte man sich sparen, da "tmp" nie verändert wird, oder sehe ich das falsch?  
  
Schauen wir einmal in die Quelltextverunreinigung:  
  

> document.write('<center><table border="0"  

... (das ist ja höchst gruselig!!)  

> <div id="characounter\_output" [...] align="justify"\></div>  
  
Hoppla! Da steht ein Backslash! Sorgt der vielleicht zusätzlich für Störungen? Besser gleich beseitigen, er ist einfach ein Syntaxfehler.  
  

> function characounter()  
> {  
> 	if( lettercounter < end )  
  
Wie oben bereits angemerkt ist end ebensogut als `tmp.length`{:.language-javascript} notierbar.  
  

> 		document.getElementById("characounter\_output").innerHTML += tmp[lettercounter];  
  
Schön ist das zwar nicht, tut aber seinen Dienst.  
  

> setInterval("characounter()", 55);  
  
So. Hier vermute ich ein Timing-Problem im IE. Erstens kann man diese Zeile kürzer notieren, nämlich "`setInterval(characounter, 55);`{:.language-javascript}", und zweitens soll diese Anweisung ja zeitverzögert erfolgen. Dazu notiert man einfach dieses:  
  
`setTimeout(function () { setInterval(characounter, 55); }, 1000);`{:.language-javascript}  
  

> Im enddefeckt ist es nun wieder das Gleiche, nur ohne backslashes :/  
  
Das war nicht sicher. Im weiteren Verlauf Deines Scripts hätte ja noch etwas enthalten sein können, das diesen Code verändert. Das kann man nicht wissen, wenn man den gesamten Code nicht kennt.  
  

> und wie gesagt der complette quellcode würde den Ramen defenitiv sprengen .\_.  
  
Dafür kann man Links setzen.  
  
Ob meine Lösung Dein Problem behebt, kann ich nicht versprechen. Besseren Überblick bekommst Du aber gleich, wenn Du das <http://de.selfhtml.org/javascript/intro.htm#javascriptdateien@title=JavaScript in eine externe Datei auslagerst>.  
  
Liebe Grüße,  
  
Felix Riesterer.

-- 
ie:% br:> fl:| va:) ls:[ fo:) rl:| n4:? de:> ss:| ch:? js:) mo:} zu:)