Maik: Funktion lässt Browserfenster allmählich erlahmen

Hi,

hab einen fertigen Chat als Basis genommen und um ein paar Funktionen, die mit Personendaten arbeiten, erweitert.

Die Funktion update_einleiten() wird per "onload" gestartet.
Um die eingeloggten User anzuzeigen, wird über ein bisschen AJAX das Skript eingeloggt_fuer_userliste_bestaetigen.php aufgerufen, eigentlich gedacht wäre in regelmäßigen Intervallen, willkürlich mal 17.2 Sekunden, doch da liegt nun irgendein Problem vor...:

Mit zunehmender Zeit, zu der sich der Chat im Browserfenster aufhält, kann eine zunehmende insgesamte Verlangsamung bzw. Blockade des jeweiligen Tabs beobachtet werden und außerdem, wenn man z.B. über alert mal "debuggt", dass die Funktion update() viel häufiger aufgerufen wird als alle 17.2 Sekunden ein mal, sondern an sich permanent...? (Da kommt man mit dem Wegklicken nicht mehr nach.)

Hab ich da vielleicht aus Unkenntnis einen rekursiven Aufruf oder was Ähnliches eingeschleußt oder liegts vielleicht an den try-catch-Blöcken bzw. den returns da drinnen, die die Funktion gleich nochmal aufrufen bis in alle Ewigkeit?

(Die Variable "beschaeftigt" sollte momentan keinen Zweck erfüllen, ebenso wenig die return-Werte.)

___________________________________________________________________

function update_einleiten()
       {
           setInterval("update()",17200);
           update();
       }

var http_request1 = false;
      var http_request2 = false;
      var aktuelle_id='';
      var aktuelle_id_alt='';
      var antwort='';
      var werte='';
      var start = 1;
      var beschaeftigt = false;
      var schreibzugriff = false;
      var zaehler = 0;

function update()
       {
        eingeloggt_fuer_userliste_bestaetigen ( );
       }

function eingeloggt_fuer_userliste_bestaetigen()
       {
          http_request2 = false;
          zufallszahl1 = Math.random() * 100000000000;

if (window.XMLHttpRequest)
        { // Mozilla, Safari,...

http_request2 = new XMLHttpRequest();

if ( http_request2.overrideMimeType )
               {
                  http_request2.overrideMimeType('text/html');
               }
          }
          else if (window.ActiveXObject)
             { // IE
                try
                {
                   http_request2 = new ActiveXObject("Msxml2.XMLHTTP");
               }
               catch (e)
               {
                   try
                   {
                       http_request2 = new ActiveXObject("Microsoft.XMLHTTP");
                   }
                   catch (e)
                   {
                    beschaeftigt = false;
                    return false;
                   }
                }
             }

if ( ! http_request2)
          {
             //alert('Cannot create XMLHTTP instance');
             beschaeftigt = false;
             return false;
          }
          zufallszahl2 = Math.random() * 100000000000;

try
          {
             http_request2.onreadystatechange = Werte_ausgeben;
             zufallszahl3 = Math.random() * 100000000000;
             parameter = '?p=' + zaehler++ + '' + zufallszahl1 + '' + zufallszahl2 + '' + zufallszahl3;
            //alert ( parameter );
             url = 'eingeloggt_fuer_userliste_bestaetigen.php';
             http_request2.open('GET', url + parameter, true);
             http_request2.send(null);

}
          catch (e) // ja mei, war halt dann nix, ignorieren und fertig
          {
             beschaeftigt = false;
             return false;
          }

}

function Werte_ausgeben()
       {

try
          {
           //
           //
           //
             if (http_request2.readyState == 4)
             {
                if (http_request2.status == 200)
                {
                   werte = http_request2.responseText;

document.getElementById('userliste').innerHTML = werte;
                }
                /*else
                {
                   alert('Problem bei GET-Anfrage an lesen.php');
                }*/
             }
        }
        catch (e)
        {
           return false;
        }

___________________________________________________________________

Hat jemand eine Idee, warum dieser Code zur allmählichen Blockade des Browserfensters führt?

Gruß Gockerli

  1. Hallo Maik,

    function update_einleiten()
           {
               setInterval("update()",17200);
               update();
           }

    function update()
           {
            eingeloggt_fuer_userliste_bestaetigen ( );
           }

    Hat jemand eine Idee, warum dieser Code zur allmählichen Blockade des Browserfensters führt?

    Ich bevorzuge eigentlich immer die Methode window.setTimeout(), die ich einer globelen Variable zuweise. Am Ende der mit timeout aufgerufenen Funktion rufe ich dieses erneut auf und weise es erneut dieser globalen Variablen zu, nachdem ich es sicherheitshalber auch noch vorher gecleart habe.

    So kann es nicht passieren, dass man unbeabsichtigt immer neue Timeouts oder -schlimmer noch- Intervalle parallel initiiert, die mit der Zeit den Rechner lahmlegen.

    Gruß Gernot