/ / Warum ist jQuery Ajax auf IE7 so langsam? - jquery, ajax, internet-explorer-7

Warum ist jQuery Ajax im IE7 so langsam? - jquery, ajax, internet-explorer-7

Ich habe ein Problem mit jQuery AJAX-AufrufenIE7. Dieser einfache Code funktioniert gut unter FF und Opera. Aber auf IE7 dauert es 3-5 Sekunden. - das ist 20 mal langsamer als FF! Das Laden von Inhalten ist reiner HTML- und Inline-JavaScript-Code. Kein JS-Rendering. Ich habe sogar den Inline-JavaScript-Code deaktiviert. Bu immer noch langsam.

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

Wie kann dieses Problem behoben werden? Jede Hilfe wäre sehr dankbar.

Antworten:

16 für die Antwort № 1

Wie kann dieses Problem behoben werden? Jede Hilfe wäre sehr dankbar.

Erkennen Sie IE7 beim Laden der Seite und schlagen Sie diskret vor, dass Benutzer, die langsames Laden nicht mögen, ein Upgrade durchführen sollten.


8 für die Antwort № 2

Ich hatte das gleiche Problem mit der langsamen jscript ie7 Engine. Ich habe ein Status-Popup-Fenster für den Menschen hinzugefügt. Ich aktualisiere das Statusfenster, während der JS in Blöcken fortfährt. Pseudocode:

  1. Erstellen Sie einen Statuscontainer mit Ihrer bevorzugten js-Bibliothek. Ich bevorzuge YUI. Siehe ihre Container-API.
  2. Laden Sie einen Teil Ihrer Daten. - Sie müssen es zuerst in Stücke teilen
  3. Aktualisieren Sie das Status-Popup. (Erhöhen Sie den Prozentsatz der abgeschlossenen Ladung, erhöhen Sie eine Balkenanzeige usw.) Beachten Sie, dass sich der Bildschirm zu diesem Zeitpunkt wahrscheinlich nicht ändert, da Ihr JS-Thread noch ausgeführt wird.
  4. Als nächstes anrufen
var t = setTimeout ("next_step (2)", 0); // Woarg von 2 würde bedeuten, den zweiten Schritt zu tun // Dies wird dem Browser nachgeben und die Anzeige wird dann aktualisiert. // Wenn Sie den Wert von "this" in der Funktion beibehalten möchten, tun Sie dies // etwas wie var t = setTimeout ("next_step.call (MyContext, 2)", 0); // mit call den Kontext der Funktion festlegen.

Fazit ist, dass der Benutzer etwas sehen wirdauf dem Bildschirm ändern. Beachten Sie, dass der Schritt des Nachgebens mit einem Timeout von 0 relativ gesehen eine Weile dauert. Mein Code testet also den Browser und erledigt mehr Arbeit pro Block, wenn es sich um etwas anderes als IE handelt.

Es ist sehr wichtig, dem Benutzer ein sich änderndes Feedback zu geben. Ansonsten denken sie, dass es länger dauert als es wirklich ist.

HTH,

Larry


3 für die Antwort № 3

Es gibt wirklich nicht viel, was Sie tun können. Die Javascript-Engine von IE ist viel langsamer als alle anderen (in der Tat ist es scheiße). Sie können IE8 ausprobieren. Es ist besser ... marginal ...


3 für die Antwort № 4

Ich musste den eigentlichen Code sehen, sah mich aber einem ähnlichen Problem gegenüber, das ich loswerden musste jQuery.load (). Stattdessen habe ich verwendet jQuery.get () mit "html" Datentyp und schrieb meinen eigenen Rückruf, wo ich die Daten über injizierte .innerHTML. Dabei bin ich auch auf einen anderen Fehler gestoßen (es war ein <select> -Tag und der IE lässt .innerHTML nicht zu), also habe ich eine hässliche Problemumgehung geschrieben.

Der resultierende Code war ungefähr so:

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