S.Sofovic: Für JScript Kenner: Probleme mit Aktualisierung der HTML Seite

Es gibt eine merkwürdige Erscheinung in MSIE 6, die mir große Probleme macht:
Der Code dazu:

<html>
   <head></head>
   <body>
      <form id="formular">
         <p onclick="fuelle();"><u>hier klicken, um die Zahlen von 1 bis 10 anzuzeigen</u></p>
         <p><input id="formname" type="text" size="6" maxlength="6"></p>
      </form>
   </body>

<script>
      function fuelle() {
         for (u=0;u<=10;u++) {
            wert = "Nr " + u
            document.forms.formular.formname.value=wert

// nun ein bisschen warten:
            for (v=0;v<=60000;v++) var uz=" "+v
         }
      }
   </script>
</html>

Ich erwarte, daß ich im Formularfeld die Ausgabe "Nr 0" sehe, anschließend "Nr 1" und so weiter bis "Nr 10". Stattdessen passiert die ganze Zeit nichts, und der MSIE zeigt nur am Ende der Funktion das Endergebnis dh. "Nr 10". Dies zeigt, daß der MSIE seine Ausgaben nicht aktualisiert, bevor er mit der Funktionsabarbeitung ganz fertig ist. Die Eigenschaft updateInterval hat auch nicht geholfen. Könnte ein JSctipt Kenner sich das ganze anschauen und versuchen eine Lösung zu finden? Ich wäre dafür sehr dankbar. Wichtig: es dürfen keine Außenaktionen dazwischen erfolgen, z.B. Mausklicks. Es muß wie im Beispiel alles "von alleine" gehen. Außerdem darf nicht die ganze Seite neu geladen werden.

mfg,
Samir

  1. Es gibt eine merkwürdige Erscheinung in MSIE 6, die mir große Probleme macht:
    Der Code dazu:

    <html>
       <head></head>
       <body>
          <form id="formular">
             <p onclick="fuelle();"><u>hier klicken, um die Zahlen von 1 bis 10 anzuzeigen</u></p>

    Schon mal vom a-Element gehört?

    <p><input id="formname" type="text" size="6" maxlength="6"></p>
          </form>
       </body>

    <script>
          function fuelle() {
             for (u=0;u<=10;u++) {
                wert = "Nr " + u
                document.forms.formular.formname.value=wert

    // nun ein bisschen warten:
                for (v=0;v<=60000;v++) var uz=" "+v
             }
          }
       </script>
    </html>

    Ich erwarte, daß ich im Formularfeld die Ausgabe "Nr 0" sehe, anschließend "Nr 1" und so weiter bis "Nr 10". Stattdessen passiert die ganze Zeit nichts, und der MSIE zeigt nur am Ende der Funktion das Endergebnis dh. "Nr 10". Dies zeigt, daß der MSIE seine Ausgaben nicht aktualisiert, bevor er mit der Funktionsabarbeitung ganz fertig ist. Die Eigenschaft updateInterval hat auch nicht geholfen. Könnte ein JSctipt Kenner sich das ganze anschauen und versuchen eine Lösung zu finden? Ich wäre dafür sehr dankbar. Wichtig: es dürfen keine Außenaktionen dazwischen erfolgen, z.B. Mausklicks. Es muß wie im Beispiel alles "von alleine" gehen. Außerdem darf nicht die ganze Seite neu geladen werden.

    Also auf meiner Kiste läuft das ganze in weniger als einer halben Sekunde ab. (hab davor und danach einen alert platziert.

    Selbst wenn das langsamer ablaufen sollte auf Deinem Rechner: der Browser ist mit der "Warteschleife" vollauf beschäftigt, hat also gar keine Zeit, das input-Feld neu zu zeichnen.

    Beschäftige Dich mit window.setTimeout und Konsorten.

    Andreas

    1. Es gibt eine merkwürdige Erscheinung in MSIE 6, die mir große Probleme macht:
      Der Code dazu:

      <html>
         <head></head>
         <body>
            <form id="formular">
               <p onclick="fuelle();"><u>hier klicken, um die Zahlen von 1 bis 10 anzuzeigen</u></p>
      Schon mal vom a-Element gehört?

      <p><input id="formname" type="text" size="6" maxlength="6"></p>
            </form>
         </body>

      <script>
            function fuelle() {
               for (u=0;u<=10;u++) {
                  wert = "Nr " + u
                  document.forms.formular.formname.value=wert

      // nun ein bisschen warten:
                  for (v=0;v<=60000;v++) var uz=" "+v
               }
            }
         </script>
      </html>

      Ich erwarte, daß ich im Formularfeld die Ausgabe "Nr 0" sehe, anschließend "Nr 1" und so weiter bis "Nr 10". Stattdessen passiert die ganze Zeit nichts, und der MSIE zeigt nur am Ende der Funktion das Endergebnis dh. "Nr 10". Dies zeigt, daß der MSIE seine Ausgaben nicht aktualisiert, bevor er mit der Funktionsabarbeitung ganz fertig ist. Die Eigenschaft updateInterval hat auch nicht geholfen. Könnte ein JSctipt Kenner sich das ganze anschauen und versuchen eine Lösung zu finden? Ich wäre dafür sehr dankbar. Wichtig: es dürfen keine Außenaktionen dazwischen erfolgen, z.B. Mausklicks. Es muß wie im Beispiel alles "von alleine" gehen. Außerdem darf nicht die ganze Seite neu geladen werden.

      Also auf meiner Kiste läuft das ganze in weniger als einer halben Sekunde ab. (hab davor und danach einen alert platziert.

      Selbst wenn das langsamer ablaufen sollte auf Deinem Rechner: der Browser ist mit der "Warteschleife" vollauf beschäftigt, hat also gar keine Zeit, das input-Feld neu zu zeichnen.

      Beschäftige Dich mit window.setTimeout und Konsorten.

      Andreas

      Hi Andreas,
      Wenn man einen Alert an der entsprechenden Stelle plaziert, dann läuft es selbstverständlich, da das Dokument den Fokus erhält. Hierbei geht es nicht um die Zeit (ich habe absichtich längere Zeiten gewählt, damir das Ganze verfolgt werden kann). Du sagst "der Browser ist mit der "Warteschleife" vollauf beschäftigt,
      hat also gar keine Zeit, das input-Feld neu zu zeichnen." Er müßte eigentlich ZUERST das Feld zeichnen und erst dann in die Schleife laufen. Mit window.setTimeout() habe ich auch versucht, aber es ist das Gleiche. Das Problem ist offenbar der prinzipiellen Natur: Der IE zeichnet seine Dokumentelemente nur einmal am Ende der Funktion, unabhängig davon ob er sehr beschäftigt ist oder nicht. Auf jeden Fall danke für Deine Antwort.

      1. Hi Samir,

        Es gibt eine merkwürdige Erscheinung in MSIE 6, die mir große Probleme macht:

        ich kann Deine Beobachtung für andere M$IE (5.0 und 4.0) bestätigen.

        Wenn man einen Alert an der entsprechenden Stelle plaziert, dann
        läuft es selbstverständlich, da das Dokument den Fokus erhält.

        Ich habe auch erst mal ein "alert" eingebaut. Als ich danach mit einem
        anderen M$IE testen wollte, hatte ich den "alert" noch drin, mußte
        also zehnmal die Box bestätigen.
        Statt dessen habe ich einfach die Return-Taste festgehalten. Das
        Ergebnis dabei war, daß nach dem Schließen der Alert-Box nicht etwa
        neun weitere Alert-Boxen gezeichnet und sofort wieder geschlossen
        wurden, sondern daß der Tastatur-Event offenbar Vorrang hatte und
        Windows (ich halte die Fensterclipping-Routine für den "Schuldigen")
        die entsprechenden Ereignisse "wegoptimiert" hat.
        Das nächste, was auf dem Bildschirm sichtbar war, das war wie bei Dir
        die "10" - trotz "alert"s, die in diesem Falle eben auch nicht den
        Fokus bekamen.

        Das Problem ist offenbar der prinzipiellen Natur: Der IE zeichnet
        seine Dokumentelemente nur einmal am Ende der Funktion, unabhängig
        davon ob er sehr beschäftigt ist oder nicht.

        Ich würde sogar vermuten: Windows bricht das Zeichnen eines Dialog-
        Elements ab, wenn es mit dem Clippen noch nicht fertig ist, aber
        auf demselben Platz innerhalb des Bildschirms bereits ein neues
        Objekt dargestellt werden soll. Das wäre eine Optimierung, die in
        vielen Fällen für eine flüssigere Darstellung sorgen würde - nur
        in Deinem Fall nicht für das gewünschte Ergebnis.

        Viele Grüße
              Michael

        P.S: Sehr schöne Problembeschreibung, danke - hat selbst mich als
             JScript-Ahnungslosen angesprochen.