将.ajaxForm函数添加到标准.ajax调用

时间:2013-02-12 19:21:23

标签: ajax ajaxform

所以我正在尝试找到一种方法来获取进度条来处理我的.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);
}

1 个答案:

答案 0 :(得分: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,无论它是什么。
我发布此答案只是因为它不适合评论。