Tôi đang cố gắng triển khai thanh tiến trình tải lên theo cách HTML5, bằng cách sử dụng hỗ trợ cấp 2 XMLHttpRequest cho các sự kiện tiến trình.Tại sao XMLHttpRequest ProgressEvent.lengthComputable có thể sai?
Trong mỗi ví dụ bạn thấy, phương pháp này là thêm một người biết lắng nghe sự kiện cho sự kiện tiến bộ như vậy: ví dụ
req.addEventListener("progress", function(event) {
if (event.lengthComputable) {
var percentComplete = Math.round(event.loaded * 100/event.total);
console.log(percentComplete);
}
}, false);
như vậy dường như luôn cho rằng event.lengthComputable sẽ thành sự thật. Sau khi tất cả, trình duyệt biết chiều dài của yêu cầu nó gửi, chắc chắn?
Không có vấn đề gì tôi làm, event.lengthComputable là sai. Tôi đã thử nghiệm điều này trong Safari 5.1.7 và Firefox 12, cả trên OSX.
Trang web của tôi được xây dựng bằng cách sử dụng Django và tôi gặp vấn đề tương tự trên thiết lập sản xuất và phát triển của mình.
Mã đầy đủ Tôi đang sử dụng để tạo ra các hình thức upload được hiển thị bên dưới (sử dụng jQuery):
form.submit(function() {
// Compile the data.
var data = form.serializeArray();
data.splice(0, 0, {
name: "file",
value: form.find("#id_file").get(0).files[0]
});
// Create the form data.
var fd = new FormData();
$.each(data, function(_, item) {
fd.append(item.name, item.value);
});
// Submit the data.
var req = new XMLHttpRequest();
req.addEventListener("progress", function(event) {
if (event.lengthComputable) {
var percentComplete = Math.round(event.loaded * 100/event.total);
console.log(percentComplete);
}
}, false);
req.addEventListener("load", function(event) {
if (req.status == 200) {
var data = $.parseJSON(event.target.responseText);
if (data.success) {
console.log("It worked!")
} else {
console.log("It failed!")
}
} else {
console.log("It went really wrong!")
}
}, false);
req.addEventListener("error", function() {
console.log("It went really really wrong!")
}, false);
req.open("POST", "/my-bar/media/add/");
req.setRequestHeader("X-Requested-With", "XMLHttpRequest");
req.send(fd);
// Don't really submit!
return false;
});
Tôi đã xé tóc của tôi ra hàng giờ đồng hồ về vấn đề này. Bất kỳ trợ giúp nào được đánh giá cao!
tôi gặp phải vấn đề này, quá. Dường như FormData() làm cho lengthComputable == false. – est