Próbuję zaimplementować pasek postępu przesyłania w HTML5, korzystając z obsługi poziomu 2 dla zdarzeń postępu XMLHttpRequest.Dlaczego XMLHttpRequest ProgressEvent.lengthComputable może być fałszem?
W każdym przykładzie widać, metoda jest dodanie detektora zdarzeń dla zdarzenia progress tak:
req.addEventListener("progress", function(event) {
if (event.lengthComputable) {
var percentComplete = Math.round(event.loaded * 100/event.total);
console.log(percentComplete);
}
}, false);
Takie przykłady zdają się zakładać, że event.lengthComputable będzie prawdziwa. Przecież na pewno przeglądarka zna długość wysyłanego zapytania?
Bez względu na to, co robię, event.lengthComputable jest fałszywe. Testowałem to w Safari 5.1.7 i Firefox 12, oba na OSX.
Moja strona jest zbudowana przy użyciu Django, i mam ten sam problem w moich konfiguracjach programistycznych i produkcyjnych.
pełny kod używam do generowania przesłać formularz jest pokazany poniżej (przy użyciu 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;
});
Byłem łzawienie włosy się godzinami na to. Każda pomoc doceniona!
I napotkał ten problem, too. Wydaje się, że FormData() sprawia, że lengthComputable == false. – est