moritz: Javascript und Perl parallel in Frames ausführen lassen

Beitrag lesen

Ok. Ich versuchs nochmal. Wird aber länger...

Also zuerst habe ich ein normales html Formular mit datei-upload (bzw. es sollen 10 sein) feld etc., und zwei iframes.
Per onSubmit "leite" ich das formular zuerst in das 1. frame zu einer seite, auf welcher der javascript/ajax Loader kommt.
Dann führe ich das Formular mit dem zweiten Frame als Ziel aus, um es an das cgi/perl script zu leiten:

  
// formular in frame 1 ausfuehren  
window.setTimeout('window.document.forms[\'multiupload-form\'].submit();', 1);  
// formular veraendern und in frame 2 ausfuehren  
window.setTimeout('window.document.forms[\'multiupload-form\'].target = "perluploader-frame";', 2);  
window.setTimeout('window.document.forms[\'multiupload-form\'].action = "/cgi-bin/wexler_multiupload.pl";', 2);  
window.setTimeout('window.document.forms[\'multiupload-form\'].submit();', 2);  

Das Perl-Script ist im Groben dem Beispiel von Christian Kruse auf SELFHTML entnommen.
Im 1. frame, beim javascript/ajax-loader, wird zuerst ein php-script ausgeführt um per $_FILES['uploaddata']['size']; die Dateigröße der hochzuladenden Datei in ein textfeld zu schreiben um es für javascript verfügbar zu machen.
Dann wird in javascript Intervallen ein ajax code ausgeführt, welcher einer PHP-Datei den Dateinamen übergibt. Diese prüft deren aktuelle größe auf dem Server und gibt sie an das ajax-script zurück.
Die beiden Dateigrößen kann ich jetzt einfach miteinander vergleichen, die neue größe ins Browserfenster schreiben und bei 100% die Intervalle abbrechen, bzw. zur nächsten hochzuladenden Datei übergehen.
Das ganze in versucht-kurzer-codeform:

  
// alle zehn sekunden testen  
var LoaderIntervall = window.setInterval("IntervallFunktion()", 1000);  
function IntervallFunktion () {  
 //alle 10 moeglichen filesize-felder testen  
 if (i<=10) {  
  //die abfrage ob das von php generierte filesize-feld ueberhaupt exitiert lass ich hier mal weg...  
  filesize = document.getElementById('filesize_' + i).value;  
  name = document.getElementById('filename_' + i).value;  
  tempname = document.getElementById('tempname_' + i).value;  
  /*** - Ajax Funktion CheckFilesize ***/  
  function AjaxFunktion (action, get) {  
   var http = null;  
   function AusgabeSchreiben() {  
    if (http.readyState == 4) {  
     var temp_filesize = http.responseText;  
     //neue dateigroesse in div schreiben  
     document.getElementById('xbytesfrom_' + i).innerHTML = temp_filesize;  
     //bei gleicher dateigroesse zur naechsten datei gehen  
     if (temp_filesize >= filesize) { ++i; }  
    }  
   }  
   if (window.XMLHttpRequest) {  
     http = new XMLHttpRequest();  
   } else if (window.ActiveXObject) {  
     http = new ActiveXObject("Microsoft.XMLHTTP");  
   }  
   if (http != null) {  
    //php-datei nach aktueller dateigroesse abfragen  
    http.open("GET", "multiuploader.php?" + action + get, true);  
    http.onreadystatechange = AusgabeSchreiben;  
    http.send(null);  
   }  
  }  
  AjaxFunktion("get_file_size", "&tempname=" + tempname);  
 }  
 //Intervall bei 10 beenden  
 window.clearInterval(LoaderIntervall);  
}  

Sorry, aber kürzer hab ichs nicht hinbekommen...
Unter http://a-simeon.de/multiuploader.php kann das Script gerne ausprobiert werden.

Der Fehler scheint mir aber nicht im javascript/ajax-loader zu liegen, da im 1. frame jegliche html-ausgabe erst erfolgt, wenn das perl-script fertig ist.
Vielleicht ist meine doppelte javascript-ausführung des Formulars mit setTimeout auch falsch... Aber ohne das setTimeout wird es nicht zweimal ausgeführt.

Für Ideen wäre ich sehr dankbar,
Grüße, moritz.