pl: XHR und mehrere Progressbars

Beitrag lesen

Eine Closure drumherumbauen und das Zeug dort ablegen.

Nicht drumherum sondern innendrinnen in der Funktion xhr.upload.onprogress = ... brauche ich die id von ganz oben:

function upload(id){
    // vor dem Upload wird das Bild scaliert
    var height = $('#'+id+'height').text();
    var width = $('#'+id+'width').text();
    var img = new Image();
    var bloburl = URL.createObjectURL(FILES[id]);
    img.src = bloburl;
    img.id = id;
    img.width = width;
    img.height = height;
    img.onload = function(e){
            var canvas = document.createElement('canvas');
            canvas.id = e.target.id;
            var ctx = canvas.getContext("2d");
            canvas.width  = e.target.width;
            canvas.height = e.target.height;
            canvas.id = e.target.id;
            ctx.drawImage(e.target, 0, 0, width, height);
            canvas.toBlob(function(blob) {
                if( document.getElementById(canvas.id+'saveas').checked == true ){
                    saveAs(blob, $('#'+canvas.id+'name').text());
                    return;
                }
                $('#'+canvas.id+'state').text('Pending');
                var param = {
                    upload: [1],
                    name: [$('#'+id+'name').text()],
                    descr: [$('#'+id+'descr').text()]
                }
                var xhr = new XMLHttpRequest();
                xhr.open('PUT','%URL%?'+query4request(param));
                xhr.upload.id = canvas.id;
                xhr.id = canvas.id;
                xhr.setRequestHeader('Content-Type','application/body+query');
                xhr.upload.onprogress = function(e) {
                    if (e.lengthComputable) {
                        document.getElementById(e.target.id+'progress').value = (e.loaded / e.total) * 100;
                    }
                };
                xhr.onload = function(e){
                    if(e.target.status != 200){
                        var name = $('#'+id+'name').text();
                        return errmsg(xr("Problem mit Datei '@datei@', Fehler: @msg@", {msg:e.target.response,datei:name}));
                    }
                    $('#'+e.target.id+'state').text('Done');
                    fixname(e.target.id, 'state');
                };
                xhr.send(blob);
            },'image/jpeg', 0.6);

    };
}

Jedesmal wenn upload(id) aufgerufen wird, kann die id eine andere sein. Falls der Aufruf in einer Schleife erfolgt, ist id mit Sicherheit eine Andere als die id deren Upload-Prozess noch läuft. Deswegen reicht mein Code die id über Objekteigenschaften durch bis zum jeweiligen EventHandler.