2010-08-14 1 views
3

Я делаю jQuery $ .get в html-файле, а в функции успеха я фильтрую на выделенном блоке и разделяю варианты, отрисовка текста выбранных как абзацы в div, которые я добавляю в свою разметку. Получение и отрисовка выбранных занимает некоторое время (их около 8000), но я ожидал, что div будет отображаться один за другим и позволяя мне работать над ними (я назначаю для них события click и hover с .delegate ...) но они показывают все сразу, а окно браузера заблокировано. Я даже явно задал async: true с $ .ajaxSetup перед $ .get (что не должно быть необходимым, так как оно по умолчанию). Я должен упустить что-то фундаментальное, но понятия не имею, что ... Заранее благодарим за идеи и советы.

+4

У вас есть 8000 элементов в избранных? –

+0

Пожалуйста, покажите код. –

+1

У меня лично нет 8000 элементов/опций в избранном, это именно тот веб-сайт, который я хочу сделать красивее и удобнее (помаду на свиньи, если хотите). У меня [изначально] также есть ~ 8000 элементов, но я хочу поместить в них параметры фильтрации и сортировки. Я не могу изменить код этого сайта - поверьте мне, если бы я мог ... – zwalex

ответ

3

Вы должны загрузить результаты в более мелкие куски. В псевдокоде это будет что-то вроде этого:

loadDataUsingAjax(url, index) { 
    load the first index to index + 250 items async using an ajax call; 
    if there are still more items 
    a few mili seconds later call loadDataUsingAjax(url, index + 500); 
} 

loadDataUsingAjax(url, 0); 

В противном случае большинство браузеров, особенно на медленных компьютерах, замерзнет в течение нескольких секунд, в то время как они пытаются обновить DOM.

UPDATE: Actual JQuery код

var CHUNK_SIZE = 500; 
var DELAY = 100; 

function loadDataUsingAjax(ajaxUrl, index) { 
    $.ajax({ 
    url: ajaxUrl, 
    data: {startIndex: index, chunkSize: CHUNK_SIZE}, 
    dataType: 'json', 
    success: function(response) { 
     // response is in JSON format 
     // convert it into HTML and add it to the appropriate location in the page 
     // response.hasMoreResults indicates whether there are more items in the result set 
     if (response.hasMoreResults) { 
     setTimeout(function() { 
      loadDataUsingAjax(ajaxUrl, index + CHUNK_SIZE); 
     }, DELAY); 
     } 
    } 
    }); 
} 
loadDataUsingAjax("yourUrl", 0); 

Ваш сервер скрипт должен делать что-то вроде этого:

startIndex = get the value of the startIndex request parameter; 
chunkSize = get the value of the chunkSize request parameter; 
// MySQL query 
select ... from ... where ... limit startIndex, startIndex + chunkSize; 
create a json result from the MySQL result set; 
select count(...) from ... where ...; 
if count(...) is > startIndex + chunkSize then set hasMoreElements = true 
+0

Так что вы говорите, что это не вызов ajax, а вставка 8000 элементов, которые останавливают браузер? У меня MacBook Pro с 2,8 ГГц Intel Core Duo и 4Gig памяти, поэтому я бы не стал говорить, что это медленный компьютер. Я думал, что вся идея асинхронных вызовов ajax и манипуляции с DOM заключается в том, что _not_ блокирует окно браузера. Я попробую ваше предложение - любые идеи о том, как я мог бы перевести псевдокод на Javascript/jQuery? Спасибо. – zwalex

+0

Да, добавив много элементов DOM сразу на страницу, можно заморозить его на несколько секунд. Асинхронный вызов только предотвращает зависание браузера во время разговора. Фактическая вставка DOM не будет выполняться асинхронно. Я обновлю свой ответ, чтобы превратить псевдокод в настоящий код jQuery. – Behrang

+0

> «Ваш скрипт на стороне сервера должен сделать что-то вроде этого:« У вас проблема: нет сценария на стороне сервера или, по крайней мере, не одного, на которое я мог бы повлиять или измениться на данный момент. Мой единственный интерфейс - это неприятный html. Я предполагаю, что собираюсь сосать всю страницу и затем делать DOM-вставку в куски. Спасибо за советы! – zwalex

 Смежные вопросы

  • Нет связанных вопросов^_^