/ / Pourquoi jQuery Ajax est-il si lent sur IE7? - jquery, ajax, internet-explorer-7

Pourquoi jQuery Ajax est-il si lent sur IE7? - jquery, ajax, internet-explorer-7

J'ai un problème avec les appels jQuery AJAX surIE7. Ce code simple fonctionne très bien sur FF et Opera. Mais sur IE7, cela prend 3-5 secondes. - c'est "20 fois plus lent que FF! Le chargement du contenu est pur HTML et code JavaScript en ligne. Pas de rendu JS. J'ai même désactivé le code JavaScript en ligne. Bu toujours lent.

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

Comment surmonter ce problème ? Toute aide serait grandement appréciée.

Réponses:

16 pour la réponse № 1

Comment surmonter ce problème ? Toute aide serait très appréciée.

Détectez IE7 au chargement de la page et proposez discrètement aux utilisateurs qui n'aiment pas le chargement lent de mettre à niveau.


8 pour la réponse № 2

J'ai eu le même problème avec le moteur ie7 jscript lent. J'ai ajouté une fenêtre contextuelle d'état pour l'humain. Je mets à jour la fenêtre d'état au fur et à mesure que le JS se déroule en morceaux. Pseudo code:

  1. Créez un conteneur d'état à l'aide de votre bibliothèque js favorit. Je préfère YUI. Voir leur api conteneur.
  2. Faites une partie de votre chargement de données. - vous devrez d'abord le diviser en morceaux
  3. Mettez à jour la fenêtre d'état. (Augmentez le% de chargement terminé, augmentez un indicateur de barre, etc.) Notez que l'écran ne changera probablement pas à ce stade car votre thread JS est toujours en cours d'exécution.
  4. Ensuite, appelez
var t = setTimeout ("next_step (2)", 0); // Oùarg de 2 signifierait faire la deuxième étape // Cela donnera au navigateur, et l'affichage sera alors mis à jour. // Si vous souhaitez conserver la valeur de "this" dans la fonction, faites // quelque chose comme var t = setTimeout ("next_step.call (MyContext, 2)", 0); // utilise l'appel pour définir le contexte de la fonction.

L'essentiel est que l'utilisateur verra quelque chosechanger à l'écran. Notez que l'étape de céder avec un timeout de 0 prend un certain temps, relativement parlant. Donc mon code teste le navigateur et fait plus de travail par morceau si c'est autre chose que IE.

Il est très important de fournir des commentaires changeants à l'utilisateur. Sinon, ils pensent que cela prend plus de temps qu'il ne l'est réellement.

HTH,

Larry


3 pour la réponse № 3

Il n'y a vraiment pas grand-chose que vous puissiez faire. Le moteur javascript d'IE est bien plus lent que les autres (en fait, c'est nul). Vous pouvez essayer IE8. Il est mieux ... marginalement ...


3 pour la réponse № 4

Je "devrais voir le code réel mais face à un problème similaire dont je devais me débarrasser jQuery.load (). Au lieu de cela, j'ai utilisé jQuery.get () avec le type de données "html" et écrit mon propre rappel, où j'ai injecté les données via .innerHTML. Ce faisant, j'ai également rencontré un autre bogue (c'était une balise <select> et IE n'autorisera pas .innerHTML dessus), j'ai donc écrit une solution de contournement laide.

Le code résultant était quelque chose comme ceci:

// 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");
}
}