baeckerman83: Browser stürtzt bei Script ab wieso?

Hi!
Ich fange grade mit JS an und habe ein problem. Mein Script arbeitet im FF einwandfrei. Wenn ich die Seite im IE7 aufrufe stürzt diese nach kürzester Zeit ab. Laut TaskManager läuft der Ram voll.
An welcher Stelle im Script kann ich den Cache oder sowas leeren?

var anfrage = null;  
  
function erzeugeAnfrage() {  
try {  
anfrage = new XMLHttpRequest();  
} catch (versuchmicrosoft) {  
   try {  
  anfrage = new ActiveXObject("Msxml2.XMLHTTP");  
    } catch (anderesmicrosoft) {  
     try {  
     anfrage = new ActiveXObject("Microsoft.XMLHTTP");  
        } catch (fehlschlag) {  
        anfrage = null;  
        }  
}  
}  
if (anfrage == null)  
alert ("Fehler beim Erstellen des Anfrage Objekts!");  
}  
  
function getVerkaufteBoards(){  
erzeugeAnfrage();  
var url = "../statistik2.php";  
anfrage.open("GET", url, true);  
anfrage.onreadystatechange = updateSeite;  
anfrage.send(null);  
}  
  
function updateSeite() {  
if (anfrage.readyState==4){  
var neueSumme = anfrage.responseText;  
var Ort_1 = neueSumme.indexOf(';',0);  
var Leitung_1 = neueSumme.substring(0,Ort_1);  
  
var Ort_2 = neueSumme.indexOf(';',Ort_1+1);  
var Leitung_2 = neueSumme.substring(Ort_1+1,Ort_2);  
  
var Ort_3 = neueSumme.indexOf(';',Ort_2+1);  
var Leitung_3 = neueSumme.substring(Ort_2+1);  
  
var Leitung_1_El = document.getElementById("leitung_1");  
var Ort_1_El = document.getElementById("ort_1");  
replaceText(Leitung_1_El, Leitung_1);  
replaceText(Ort_1_El, Ort_1);  
  
var Leitung_2_El = document.getElementById("leitung_2");  
var Ort_2_El = document.getElementById("ort_2");  
replaceText(Leitung_2_El, Leitung_2);  
replaceText(Ort_2_El, Ort_2);  
  
var Leitung_3_El = document.getElementById("leitung_3");  
var Ort_3_El = document.getElementById("ort_3");  
replaceText(Leitung_3_El, Leitung_3);  
replaceText(Ort_3_El, Ort_3);  
abwarten();  
}  
}  
  
function abwarten() {  
warteinterval = setInterval("getVerkaufteBoards();", 5000);  
  
}  
  1. Hallo,

    Ich fange grade mit JS an

    und schon solche Skripts? das ist doch bestimmt aus den Tiefen des Netzes hervorgeholt ;)

    var Ort_1 = neueSumme.indexOf(';',0);
    [...]
    replaceText(Ort_3_El, Ort_3);

    Ich bewundere es immer wieder, wie man in ein Forum seinen ganzen Quelltext posten kann, der __überhaupt__ nichts mit dem Problem zu tun hat. Naja, wenn der RAM vollläut, hätte es theoretisch auch hier sein können, aber sowas probiert man ja mit auskommentieren erst mal aus.

    warteinterval = setInterval("getVerkaufteBoards();", 5000);

    Wo ist das definiert?

    mfg, Flo

    --
    Developers are dying. Computers are getting trash. CEO's become forgetten. The only remaining things are ideas, lies and crises. So if you want to be immortal, first think, than stop it and go to microsoft and become later a manager at Lehman Brothers...
    sh:) fo:| ch:? rl:( br:^ n4:| ie:{ mo:| va:} de:> zu:} fl:{ ss:) ls:< js:|
    *Zu dem de:> Ich benutze wegen IE im moment noch tabellen, weil dieser display:table noch nicht versteht. Ich werde aber, wenn IE 6 & IE 7 < 10% mein neues CSS-Layout einspielen...
    1. Hallo,

      Ich fange grade mit JS an
      und schon solche Skripts? das ist doch bestimmt aus den Tiefen des Netzes hervorgeholt ;)
      var Ort_1 = neueSumme.indexOf(';',0);
      [...]
      replaceText(Ort_3_El, Ort_3);
      Ich bewundere es immer wieder, wie man in ein Forum seinen ganzen Quelltext posten kann, der __überhaupt__ nichts mit dem Problem zu tun hat. Naja, wenn der RAM vollläut, hätte es theoretisch auch hier sein können, aber sowas probiert man ja mit auskommentieren erst mal aus.
      warteinterval = setInterval("getVerkaufteBoards();", 5000);
      Wo ist das definiert?

      mfg, Flo

      Ich habe mit dem Buch Ajax von Kopf bis Fuss angefangen. außer den Reload habe ich alles aus dem Buch.
      Ja stimmt ich hätte das unnötige weg lassen können. Das es an dem Intervall liegt habe ich mir ja schon gedacht.
      Wusste nicht das ich Timeouts verwenden muss. Werde mir das nochmal anschauen.

      1. Hallo,

        außer den Reload habe ich alles aus dem Buch.

        Die sind einfach: window.location.reload(true);

        mfg, Flo

        --
        Developers are dying. Computers are getting trash. CEO's become forgetten. The only remaining things are ideas, lies and crises. So if you want to be immortal, first think, than stop it and go to microsoft and become later a manager at Lehman Brothers...
        sh:) fo:| ch:? rl:( br:^ n4:| ie:{ mo:| va:} de:> zu:} fl:{ ss:) ls:< js:|
        *Zu dem de:> Ich benutze wegen IE im moment noch tabellen, weil dieser display:table noch nicht versteht. Ich werde aber, wenn IE 6 & IE 7 < 10% mein neues CSS-Layout einspielen...
      2. Wusste nicht das ich Timeouts verwenden muss.

        Musst du nicht. Du kannst auch Intervalle richtig verwenden, anstatt falsch. ;)

        Mathias

      3. Hi,

        Ich habe mit dem Buch Ajax von Kopf bis Fuss angefangen. außer den Reload habe ich alles aus dem Buch.

        Wobei der Code selbst durchaus suboptimal ist (bei JS-Büchern ist prinzipiell ein gesundes Mißtrauen in deren Qualität angebracht): Umständlich, Doppelcode und nicht genutzte Funktionalität (von mangelnder Abwärtskompatiblität gar nicht erst zu reden). Welches Buch war das denn?

        Bei der Erzeugung eines Standard XHR-Objekts ist der (mögl. zu vermeidende) try...catch generell überflüssig (stattdessen: einfacher Test auf window.XMLHttpRequest). Außerdem ist der MS-Teil doppelt so groß wie nötig und zudem verbesserungsfähig (vorheriger, einfacher Test auf windows.ActiveXObject ist sinnvoll, und anschließend *ein* try...catch auf ausschließlich Microsoft.XMLHTTP - damit erspart man dann auch Non-XHR- & Non-ActiveX-Browsern dieses Gesummse komplett, und bei ActiveX-Browsern kann man dann zusätzlich darauf reagieren, wenn XHR prinzipiell möglich, aber (temporär?!) deaktiviert ist.

        Gruß, Cybaer

        --
        Man muß viel gelernt haben, um über das, was man nicht weiß, fragen zu können.
        (Jean-Jacques Rousseau, Philosoph u. Schriftsteller)
        1. Welches Buch war das denn?

          Nachtrag: Und auch sonst ist der Stil (Funktionen arbeiten nicht mit Parametern sondern mit globalen Objekten) nicht gerade nachahmenswert.

          Gruß, Cybaer

          --
          Man muß viel gelernt haben, um über das, was man nicht weiß, fragen zu können.
          (Jean-Jacques Rousseau, Philosoph u. Schriftsteller)
  2. An welcher Stelle im Script kann ich den Cache oder sowas leeren?

    Du solltest nicht bei jeder Anfrage ein neues XMLHttpRequest-Objekt erzeugen. Du kannst sie wiederverwenden, indem du deine erzeugeAnfrage-Funktion prüfen lässt, ob die Variable window.anfrage schon existiert. Wenn ja, dann brauchst du kein neues Objekt erzeugen.

    Darüber hinaus solltest du getVerkaufteBoards nicht mit einem Intervall, sondern mit einem Timeout aufrufen, und zwar am Ende von updateSeite.

    function abwarten() {
    warteinterval = setInterval("getVerkaufteBoards();", 5000);
    }

    Den Unterschied zwischen Timeouts und Intervallen hast du anscheinend noch nicht verstanden, und da liegt der schwerwiegendste Fehler. Ein Intervall führt die angegebene Funktion nicht einmal nach Vergehen der Zeit aus (das macht ein Timeout), sondern regelmäßig alle 5 Sekunden, bis man ihn anhält. Du erzeugst nicht einen Intervall, sondern immer neue Intervalle. Diese potenzieren sich, damit potenzieren sich auch die XMLHttpRequest-Objekte und die HTTP-Anfragen. Klar, dass du damit den Rechner abschießt.

    Mathias

  3. An welcher Stelle im Script kann ich den Cache oder sowas leeren?

    Der IE hat einige Probleme mit speicherlecks (google sagt 3 Millionen), daher ist es immer schwierig auf sowas zu antworten.

    Aber was mir auffällt.

    » var anfrage = null;  
    
    >   
    > function erzeugeAnfrage() {  
    > }  
    >   
    > function getVerkaufteBoards(){  
    > erzeugeAnfrage();  
    
    

    Du erstellst bei jedem Aufruf ein neues anfrage Objekt, ohne darauf zu warten, ob auf die vorherige Anfrage eine Antwort kam. Besser wäre es, wie Mathias schon sagte, nur einmal das Objekt zu erzeugen, was relativ leicht in der erzeugeAnfrage() Funktion gemacht werden kann:
    if(anfrage) return;

    Aber um sicher zu gehen, dass eine Anfrage schon fertig ist, solltest du einen Flag setzten und wenn dieser gesetzt ist abort() aufrufen.

    Du kannst diesen an das anfrage Objekt hängen, ich hab das mal in deinen code eingebaut:

      
    var anfrage = null;  
      
    function erzeugeAnfrage() {  
    if(anfrage) return;  
    try {  
    anfrage = new XMLHttpRequest();  
    } catch (versuchmicrosoft) {  
       try {  
      anfrage = new ActiveXObject("Msxml2.XMLHTTP");  
        } catch (anderesmicrosoft) {  
         try {  
         anfrage = new ActiveXObject("Microsoft.XMLHTTP");  
            } catch (fehlschlag) {  
            anfrage = null;  
            }  
    }  
    }  
    if (anfrage == null)  
    alert ("Fehler beim Erstellen des Anfrage Objekts!");  
    }  
      
    function getVerkaufteBoards(){  
    erzeugeAnfrage();  
    var url = "../statistik2.php";  
    if(anfrage.idle) { anfrage.abort(); anfrage.idle = false;}  
    anfrage.open("GET", url, true);  
    anfrage.onreadystatechange = updateSeite;  
    anfrage.send(null);  
    anfrage.idle = true;  
    }  
      
    function updateSeite() {  
    if (anfrage.readyState==4){  
    anfrage.idle = false;  
    ...  
    
    

    Struppi.

    1. Vielen Dank werde das mal ausprobieren.