2009-04-24 31 views
12

Tengo un problema con las llamadas jQuery AJAX en IE7. Este sencillo código funciona bien en FF y Opera. Pero en IE7 toma 3-5 segundos. - ¡Eso es 20 veces más lento que FF! Cargar contenido es HTML puro y código JavaScript en línea. Sin representación JS. Incluso cambié de código JavaScript en línea. Bu todavía lento.¿Por qué jQuery Ajax es tan lento en IE7?

$('#block').load('some url'); 

Cómo resolver este problema? Cualquier ayuda sería muy apreciada.

+0

¿Cuánto contenido estás cargando? IE es típicamente un poco más lento para algunas cosas, y mucho más lento si hay mucho contenido. – cgp

+0

11KB. ¿Es demasiado para IE7? FF Opera Chrome carga muy rápido. – taras

Respuesta

16

Cómo resolver este problema? Cualquier ayuda sería muy apreciada.

Detecta IE7 en la carga de la página y proporciona una sugerencia discreta para que los usuarios que no les gusta la carga lenta se actualicen.

3

Realmente no hay mucho que pueda hacer. El motor de JavaScript de IE es mucho más lento que cualquiera de los otros (de hecho, apesta). Puedes probar IE8. Es es mejor ... marginalmente ...

+0

En realidad, IE8 es mucho más rápido, y en algunos aspectos, más rápido que FF3, no lo creo. El ejemplo perfecto es StackOverflow. Tengo alrededor de 21 etiquetas de "interés", e IE7 me las dio TAN lentamente ... FF fue mucho mejor. Cuando actualicé a IE8, IE8 grita ahora en stackoverflow. Hasta el punto de que Firefox ES más lento en SO ahora. Por lo tanto, he vuelto a IE en SO. :) – eduncan911

+6

Ahora pruébalo en Safari 4 o Chrome. Tienes razón, sin embargo. FireFox me ha estado decepcionando recientemente (excepto cuando se desarrolla debido a Firebug ... ¿qué haríamos sin esa cosa?). IE8 agregó la barra de herramientas del desarrollador, que carga mucho mejor que, uh, nada ... pero, todavía no es Firebug. Perdón por la ofensa de OT. – KyleFarris

+1

La barra de herramientas del desarrollador ha estado presente desde IE6 – John

8

Tuve el mismo problema con el motor slow jscript ie7. Agregué una ventana emergente de estado para el humano. Actualizo la ventana de estado mientras el JS procede en fragmentos. Pseudocódigo:

  1. Cree un contenedor de estado utilizando su biblioteca favorita js. Yo prefiero YUI Ver su api contenedor.
  2. Cargue parte de su carga de datos. - primero tendrá que dividirlo en trozos
  3. Actualice el estado emergente de estado. (Incremente el% de carga completada, aumente el indicador de una barra, etc.) Tenga en cuenta que la pantalla probablemente no cambie en este punto ya que su hilo JS aún está en funcionamiento.
  4. A continuación, llamar
var t = setTimeout("next_step(2)", 0); 
// Where arg of 2 would mean do the second step 
// This will yield to the browser, and the display will then be updated. 
// If you want to maintain the value of "this" in the function, then do 
// something like 
var t = setTimeout("next_step.call(MyContext, 2)", 0); 
// using call to set the function's context.

El fondo es que el usuario verá algo cambia en la pantalla. Tenga en cuenta que el paso de ceder con un tiempo de espera de 0 lleva bastante tiempo, en términos relativos. Entonces, mi código prueba el navegador y hace más trabajo por fragmento si es distinto de IE.

Es muy importante proporcionar comentarios cambiantes para el usuario. De lo contrario, creen que está tardando más de lo que realmente es.

HTH,

Larry

+0

He tenido este problema muchas veces y he implementado la misma técnica de "pseudo" enhebrado en su respuesta. Muy a menudo tuve que construir un mecanismo de cola. jQuery 1.3 implementó una cola que puede hacer que esto sea mucho más fácil de trabajar con http://docs.jquery.com/Effects/queue –

+0

Excelente sugerencia. SIEMPRE debe haber algún tipo de retroalimentación al hacer llamadas asíncronas o posiblemente algoritmos muy intensivos que pueden tomar más de un segundo (incluso si solo es una animación de 'carga'). Esto va para cualquier navegador/implementación sin embargo. – KyleFarris

3

Tendría que ver el código real, pero enfrentado a un problema similar que tenía que deshacerse de jQuery.load(). En su lugar, utilicé jQuery.get() con el tipo de datos "html" y escribí mi propia devolución de llamada, donde inyecté los datos a través de .innerHTML. Al hacerlo, también presiono otro error (era < y seleccioné la etiqueta >, y IE no permitió .innerHTML), así que escribí una solución fea.

código resultante fue algo como esto:

// Fetch data (GET method allows me to use browser cache) 
$.get(url, get, function(htmlValues, txtStatus){ 
    that.populateSelects(htmlValues, that.selectContainers); 
}, "html"); 


// Create <select> 
var select = $('<span><select disabled="disabled"></select></span>'); 
$("<option>").attr("value", "").text("Loading...").appendTo(select.find("select")); 


// Populate <select> 
that.populateSelects = function(values, selectContainers){ 
    var span, select, tags; 

    for(var i=0, len=selectContainers.length; i<len; i++){ 
     span = selectContainers[i]; 

     if($.browser.msie){ 
     tags = span.innerHTML.match(/^(<select[^>]+>).*(<\/select>)$/i); 
     span.innerHTML = tags[1] + values + tags[2]; 
     select = span.firstChild; 
     }else{ 
     select = span.firstChild; 
     select.innerHTML = values; 
     } 
     $(select).removeAttr("disabled"); 
    } 
} 
+0

Saludos por esto, he logrado reducir un par de segundos el tiempo de carga de mi aplicación al reemplazar $ .load con $ .get + innerHTML. –

Cuestiones relacionadas