Benjamin Wilfing: sdf asd

Hi,

relativ viele Inputfelder auf einer Seite (>1000), die sich in einer Tabelle befinden, werden per Javascript mit Daten befüllt, die zuvor per XMLHttpRequest geholt werden. Da der Vorgang mitunter recht zeitaufwendig ist (das Füllen, nicht das Holen der Daten), soll der User mit einem Fortschrittsbalken bei Laune gehalten werden.

Das Problem scheint jetzt aber zu sein, dass, während das Script damit beschäftigt ist, die Felder mit document.getElementById().value zu befüllen, die Ausgabe des Balkens im Browser nicht funktioniert, so dass die Ausgabe erst dann auf dem Schirm erscheint, sobald die Funktion komplett gelaufen ist.

Daher meine Frage: Existiert in Javascript so etwas ähnliches wie eine Flush-Funktion? Sobald ich zum Beispiel im nachfolgenden Code einen alert() einfüge, wird der bisher ausgeführte Code im Browser dargestellt. Das allerdings ist leider nicht praktikabel...

Auszug:

  
var lines = data.split('^');  
  
function fillData(data) {  
for (row = 1; row < lines.length; row++) {  
 document.getElementById('progressbar').firstChild.data = document.getElementById('progressbar').firstChild.data + '*';  
 fillLine(lines[row]);  
}  
  
function fillLine(data) {  
  
 var fields = data.split("|");  
  
 for(i = 1; i < fields.length; i++) {  
  
  // Diverse Manipulationen per document.getElementById()  
 }  
}  

Viele Grüße
 Benjamin

--
Der nächste Satz ist gelogen.
Der vorherige Satz ist wahr.
  1. Hi Benjamin,

    *gnah* ...

    Viele Grüße
     Benjamin

    --
    Der nächste Satz ist gelogen.
    Der vorherige Satz ist wahr.
    1. Moin!

      Solange Javascript arbeitet, unterbrechen die Browser das aktualisierte Rendern der Anzeige - aus gutem Grund. Denn das Rendern kostet Rechenzeit, die man lieber in das Javascript investiert. Außerdem ist es unter Umständen nervig, wenn der Benutzer sehen würde, wie sich allmählich die Manipulationen im DOM vor ihm aufbauen.

      Einzige Chance, das Rendern zu forcieren, ist in meinen Augen eine Unterbrechung des Javascripts. Also Beenden der Funktion, und vorher setTimeout mit dem zeitnahen Wiederaufrufen, damit weitergemacht wird.

      Das sorgt insgesamt allerdings dafür, dass mehr Zeit als nötig vergeht, um die Aufgabe zu erledigen. Denn ultrakurze Zeitabstände für setTimeout sind nicht unbedingt ratsam.

      - Sven Rautenberg

      --
      My sssignature, my preciousssss!
      1. Hi Sven,

        Einzige Chance, das Rendern zu forcieren, ist in meinen Augen eine Unterbrechung des Javascripts. Also Beenden der Funktion, und vorher setTimeout mit dem zeitnahen Wiederaufrufen, damit weitergemacht wird.

        super, das klappt. Danke dir!

        Das sorgt insgesamt allerdings dafür, dass mehr Zeit als nötig vergeht, um die Aufgabe zu erledigen. Denn ultrakurze Zeitabstände für setTimeout sind nicht unbedingt ratsam.

        Da setTimeout in meinem Fall sehr viel seltener aufgerufen wird als ein Inputfeld mit Daten gefüllt wird (nämlich genau einmal pro Zeile, wobei in jeder Zeile ca. 31 bis 40 Felder sind, fällt das nicht so ins Gewicht.

        Ich fühle mich trotzdem irgendwie „entmündigt“ – warum gibt es nicht trotzdem zumindest die Möglichkeit, das Rendern an einer gewünschten Stelle mit einem speziellen Befehl zu erzwingen? Das ist ärgerlich, aber wohl nicht zu ändern.

        Viele Grüße
         Benjamin

        --
        Der nächste Satz ist gelogen.
        Der vorherige Satz ist wahr.
  2. Hi,

    zumindest könntest Du die Verarbeitungszeit deutlich erhöhen, wenn Du nicht zigmal unnötig

    document.getElementById('progressbar').firstChild.data = document.getElementById('progressbar').firstChild.data + '*';

    aufrufst, sondern die Referenzen einmal als Variable übergibst.

    freundliche Grüße
    Ingo