2012-10-12 192 views
5

Intenté todo lo que pude pensar para al menos llegar a la función de progreso en IE9 pero nada funciona. Todos los demás navegadores entran en la función de progreso y escriben el texto de prueba sin ningún problema. Espero que alguien pueda ayudarme. ¡Gracias!¿Hay un evento de progreso AJAX en IE y cómo usarlo?

 var info = document.getElementById('info'); 
    var xhr; 
     if (window.XMLHttpRequest) { 
      xhr = new XMLHttpRequest(); 
     } 
     else if (window.ActiveXObject) { 
      try { 
       xhr = new ActiveXObject("Msxml2.XMLHTTP"); 
      } 
      catch (e) { 
       try { 
        xhr = new ActiveXObject("Microsoft.XMLHTTP"); 
       } 
       catch (e) {} 
      } 
     } 
     xhr.attachEvent("onprogress", function(e) { 
      info.innerHTML += "loading...<br />"; 
     }); 

     /*xhr.addEventListener("progress", function(e) { 
      info.innerHTML += "loading...<br />"; 
     }, false);*/ 

     xhr.open("GET", "10_MB_File.txt", true); 
     xhr.send(null); 
+0

Lamentablemente no existe el evento 'progress' en el xhr de <= IE9, pero lo detecto con esta condición:' typeof this.ProgressEvent === 'function''. Donde 'this', es' window', el objeto global. – Hydro

Respuesta

2

El evento onprogress es parte de la especificación XMLHttpRequest Nivel 2 ...

... que no está soportada por IE 9 y abajo. No obstante, es decir, 10 se supone que apoyarlo ...

Para obtener más información sobre la que los navegadores son compatibles XHR Nivel 2, echar un vistazo a caniuse.com ...

+0

Gracias. Nunca pensé que IE fuera tan obsoleto ... Sí, en Windows8, IE10 mostró el progreso para mí. – user1154269

+0

¡De nada! sí ... IE es bastante horrible. si estás haciendo AJX entre dominios, ¡ten cuidado! – Hristo

2

IE9 y anteriores no son compatibles con el progreso, por lo que no se puede conseguir que funcione.

var xhr = new XMLHttpRequest(); 
console.log('onprogress' in xhr); 
+1

¿por qué está creando un nuevo objeto de XMLHttpRequest? –

+2

Porque es una demostración funcional con las 2 líneas. – epascarello

0

Se podría utilizar el evento onreadystatechange y mostrar su mensaje. Solo lo sugiero como una solución.

xhr.onreadystatechange=function() { 
    if (xhr.readyState != 4) { 
     // Display a progress message here. 
    } else if (xhr.readyState==4 && xhr.status==200) { 
     // Request is finished, do whatever here. 
    } 
} 
+0

Gracias. En el programa actual, velocímetro de ancho de banda, necesito girar una aguja de velocidad en función de los bytes cargados/segundos pasados, así que ... – user1154269

0

Agregando a la lista de sugerencias, si se utiliza JQuery en su proyecto. Se puede lograr con las funciones a continuación y, por supuesto, debe ser una solicitud JQuery $ .ajax. La ventaja de estas bibliotecas cliente es que tienen objetos creados en base a navegadores. Por ejemplo: JQuery se ocupa de "ActiveXObject (" Msxml2.XMLHTTP ")" o "ActiveXObject (" Microsoft.XMLHTTP ")" basado en el navegador.

//displays progress bar 
$('#info').ajaxStart(function() { 
    $(this).show(); 
}).ajaxStop(function() { 
    $(this).hide(); 
}); 
+0

Sí, en el programa real utilizo jQuery. Pero si IE <= 9 no admite eventos de progreso, creo que ninguna biblioteca puede ayudar aquí. ¿O es posible obtener progreso (bytes cargados) en IE de alguna manera? – user1154269

+0

Si llama a $ .ajax/$. Get/$. Post para operaciones AJAX, la función ajaxStart() que publiqué funciona como evento de progreso para mostrar la barra de progreso. Lo revisé para IE 6 y funciona bien. – Sunny

+0

Sin embargo, solo muestra el contenido estático (imagen/html) como barra de progreso. Si necesita ser un progreso en tiempo real como los bytes cargados, se deben buscar otras alternativas. En algunos de los artículos que leí, una forma es engañar a la interfaz de usuario al mostrar rápidamente el 90% de avance y luego completar el 10% restante después de recibir la respuesta del servidor. – Sunny

Cuestiones relacionadas