Estoy tratando de implementar una barra de progreso de carga de la manera HTML5, mediante el uso del nivel 2 de XMLHttpRequest para eventos de progreso.¿Por qué XMLHttpRequest ProgressEvent.lengthComputable podría ser falso?
En todos los ejemplos que se ve, el método consiste en añadir un detector de eventos para el evento progress, así:
req.addEventListener("progress", function(event) {
if (event.lengthComputable) {
var percentComplete = Math.round(event.loaded * 100/event.total);
console.log(percentComplete);
}
}, false);
Tales ejemplos siempre parecen asumir que event.lengthComputable será verdad. Después de todo, ¿el navegador conoce la duración de la solicitud que está enviando, seguramente?
No importa lo que haga, event.lengthComputable es falso. He probado esto en Safari 5.1.7 y Firefox 12, ambos en OSX.
Mi sitio está construido usando Django, y me da el mismo problema en mis dev y producción configuraciones.
El código completo que estoy usando para generar el formulario de carga se muestra a continuación (usando 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;
});
he estado rompiendo mi pelo por horas en esto. Cualquier ayuda apreciada!
me encontré con este problema, también. Parece que FormData() hace que lengthComputable == sea falso. – est