Почему jQuery Ajax так медленно работает в IE7? - PullRequest
12 голосов
/ 25 апреля 2009

У меня проблема с вызовами jQuery AJAX в IE7. Этот простой код прекрасно работает на FF и Opera. Но на IE7 это занимает 3-5 секунд. - это в 20 раз медленнее, чем FF! Загрузка контента - это чистый HTML и встроенный код JavaScript. Нет JS рендеринга. Я даже отключил встроенный код JavaScript. Бу еще медленно.

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

Как преодолеть эту проблему? Любая помощь будет принята с благодарностью.

Ответы [ 4 ]

16 голосов
/ 25 апреля 2009

Как побороть эту проблему? Любая помощь будет принята с благодарностью.

Определите IE7 при загрузке страницы и предоставьте отдельное предложение о том, что пользователи, которые не любят медленную загрузку, должны обновить.

8 голосов
/ 25 апреля 2009

У меня была такая же проблема с медленным движком jscript ie7. Я добавил всплывающее окно статуса для человека. Я обновляю окно статуса, поскольку JS продолжается частями. Псевдокод:

  1. Создайте контейнер состояния, используя вашу библиотеку favit js. Я предпочитаю YUI. Смотрите их контейнер API.
  2. Выполните загрузку данных. - сначала нужно разбить его на куски
  3. Обновить всплывающее окно статуса. (Увеличьте% выполненной загрузки, увеличьте линейный индикатор и т. Д.) Обратите внимание, что на этом этапе экран, вероятно, не изменится, поскольку поток JS все еще работает.
  4. Далее звоните
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.

Суть в том, что пользователь увидит что-то изменяющееся на экране. Заметьте, что шаг уступки с таймаутом 0 занимает довольно много времени, условно говоря. Так что мой код тестирует браузер и выполняет больше работы на блок, если это что-то кроме IE.

Очень важно предоставлять изменяющуюся обратную связь пользователю. В противном случае они думают, что это займет больше времени, чем на самом деле.

НТН,

Ларри

3 голосов
/ 02 июня 2009

Я должен был увидеть реальный код, но столкнулся с аналогичной проблемой, с которой мне пришлось избавиться jQuery.load () . Вместо этого я использовал jQuery.get () с типом данных "html" и написал свой собственный обратный вызов, в который я вставил данные через .innerHTML . При этом я также столкнулся с еще одной ошибкой (это был тег

Результирующий код был примерно таким:

// 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");
   }
} 
3 голосов
/ 25 апреля 2009

Вы действительно мало что можете сделать. Механизм javascript в IE намного медленнее, чем любой другой (на самом деле, это отстой). Вы можете попробовать IE8. Это лучше лучше ... незначительно ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...