Để đây là thao tác đồng bộ, bạn cần bắt đầu quá trình chuyển mới khi thao tác cuối cùng được thực hiện. Gmail, ví dụ, gửi tất cả mọi thứ cùng một lúc, đồng thời. Sự kiện cho tiến trình tải lên tệp AJAX là progress
hoặc onprogress
trên phiên bản XmlHttpRequest
thô.
Vì vậy, sau mỗi $.ajax()
, ở phía máy chủ (mà tôi không biết bạn sẽ sử dụng cái gì), hãy gửi phản hồi JSON để thực thi AJAX trên đầu vào tiếp theo. Một tùy chọn sẽ liên kết phần tử AJAX với từng phần tử, để làm cho mọi thứ trở nên dễ dàng hơn, vì vậy bạn có thể thực hiện, trong success
số $(this).sibling('input').execute_ajax()
.
Something như thế này:
$('input[type="file"]').on('ajax', function(){
var $this = $(this);
$.ajax({
'type':'POST',
'data': (new FormData()).append('file', this.files[0]),
'contentType': false,
'processData': false,
'xhr': function() {
var xhr = $.ajaxSettings.xhr();
if(xhr.upload){
xhr.upload.addEventListener('progress', progressbar, false);
}
return xhr;
},
'success': function(){
$this.siblings('input[type="file"]:eq(0)').trigger('ajax');
$this.remove(); // remove the field so the next call won't resend the same field
}
});
}).trigger('ajax'); // Execute only the first input[multiple] AJAX, we aren't using $.each
Đoạn mã trên sẽ cho nhiều <input type="file">
nhưng không phải cho <input type="file" multiple>
, trong trường hợp đó, nó phải là:
var count = 0;
$('input[type="file"]').on('ajax', function(){
var $this = $(this);
if (typeof this.files[count] === 'undefined') { return false; }
$.ajax({
'type':'POST',
'data': (new FormData()).append('file', this.files[count]),
'contentType': false,
'processData': false,
'xhr': function() {
var xhr = $.ajaxSettings.xhr();
if(xhr.upload){
xhr.upload.addEventListener('progress', progressbar, false);
}
return xhr;
},
'success': function(){
count++;
$this.trigger('ajax');
}
});
}).trigger('ajax'); // Execute only the first input[multiple] AJAX, we aren't using $.each
lưu ý rằng mã này được thiết kế cho các trình duyệt thực sự hiện đại hỗ trợ FormData và XMLHttpRequest2 chỉ, không có hacks cho các trình duyệt cũ – pocesar
Đã tự hỏi tại sao nó trông rất ngon ...;) – Selosindis
Tạo một 'hình thức' mới và thêm tập tin từng người một bằng cách sử dụng '(new FormData()). append ('file', this.files [count])' là những gì tôi đang tìm kiếm, cảm ơn! – Mark