0

だから私は.ajax呼び出しでプログレスバーを動作させる方法を見つけようとしていますが、あまり運がありません. ajaxForm プラグインには、uploadProgress オプションを許可する次のコードが含まれていることは知っていますが、コードの動作方法では、そのプラグインを使用できません。標準の .ajax 呼び出しにアタッチするために、何らかの方法で次のコードを追加する方法はありますか? ロングショット私は知っています!

// XMLHttpRequest Level 2 file uploads (big hat tip to francois2metz)
function fileUploadXhr(a) {
    var formdata = new FormData();

    for (var i=0; i < a.length; i++) {
        formdata.append(a[i].name, a[i].value);
    }

    if (options.extraData) {
        var serializedData = deepSerialize(options.extraData);
        for (i=0; i < serializedData.length; i++)
            if (serializedData[i])
                formdata.append(serializedData[i][0], serializedData[i][1]);
    }

    options.data = null;

    var s = $.extend(true, {}, $.ajaxSettings, options, {
        contentType: false,
        processData: false,
        cache: false,
        type: method || 'POST'
    });

    if (options.uploadProgress) {
        // workaround because jqXHR does not expose upload property
        s.xhr = function() {
            var xhr = jQuery.ajaxSettings.xhr();
            if (xhr.upload) {
                xhr.upload.addEventListener('progress', function(event) {
                    var percent = 0;
                    var position = event.loaded || event.position; /*event.position is deprecated*/
                    var total = event.total;
                    if (event.lengthComputable) {
                        percent = Math.ceil(position / total * 100);
                    }
                    options.uploadProgress(event, position, total, percent);
                }, false);
            }
            return xhr;
        };
    }

    s.data = null;
        var beforeSend = s.beforeSend;
        s.beforeSend = function(xhr, o) {
            o.data = formdata;
            if(beforeSend)
                beforeSend.call(this, xhr, o);
    };
    return $.ajax(s);
}
4

1 に答える 1

0

私はそれを保証しませんが、これを試してください:

xhr.upload.onprogress = function(event) {
                var percent = 0;
                var position = event.loaded || event.position;
                var total = event.total;
                if (event.lengthComputable) {
                    percent = Math.ceil(position / total * 100);
                }
                console.log("Progress: "+percent+"%");   //debug to see if the problem is there
                options.uploadProgress(event, position, total, percent);
            };

投稿されたコードから、問題がonprogressイベント処理にあるのかoptions.uploadProgress、それが何であれ、それが何であるかは推測できません。
コメントに収まらないという理由だけで、これを回答として投稿しました。

于 2013-02-12T19:46:04.263 に答える