Я делаю jQuery $ .get в html-файле, а в функции успеха я фильтрую на выделенном блоке и разделяю варианты, отрисовка текста выбранных как абзацы в div, которые я добавляю в свою разметку. Получение и отрисовка выбранных занимает некоторое время (их около 8000), но я ожидал, что div будет отображаться один за другим и позволяя мне работать над ними (я назначаю для них события click и hover с .delegate ...) но они показывают все сразу, а окно браузера заблокировано. Я даже явно задал async: true с $ .ajaxSetup перед $ .get (что не должно быть необходимым, так как оно по умолчанию). Я должен упустить что-то фундаментальное, но понятия не имею, что ... Заранее благодарим за идеи и советы.
ответ
Вы должны загрузить результаты в более мелкие куски. В псевдокоде это будет что-то вроде этого:
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
Так что вы говорите, что это не вызов ajax, а вставка 8000 элементов, которые останавливают браузер? У меня MacBook Pro с 2,8 ГГц Intel Core Duo и 4Gig памяти, поэтому я бы не стал говорить, что это медленный компьютер. Я думал, что вся идея асинхронных вызовов ajax и манипуляции с DOM заключается в том, что _not_ блокирует окно браузера. Я попробую ваше предложение - любые идеи о том, как я мог бы перевести псевдокод на Javascript/jQuery? Спасибо. – zwalex
Да, добавив много элементов DOM сразу на страницу, можно заморозить его на несколько секунд. Асинхронный вызов только предотвращает зависание браузера во время разговора. Фактическая вставка DOM не будет выполняться асинхронно. Я обновлю свой ответ, чтобы превратить псевдокод в настоящий код jQuery. – Behrang
> «Ваш скрипт на стороне сервера должен сделать что-то вроде этого:« У вас проблема: нет сценария на стороне сервера или, по крайней мере, не одного, на которое я мог бы повлиять или измениться на данный момент. Мой единственный интерфейс - это неприятный html. Я предполагаю, что собираюсь сосать всю страницу и затем делать DOM-вставку в куски. Спасибо за советы! – zwalex
У вас есть 8000 элементов в избранных? –
Пожалуйста, покажите код. –
У меня лично нет 8000 элементов/опций в избранном, это именно тот веб-сайт, который я хочу сделать красивее и удобнее (помаду на свиньи, если хотите). У меня [изначально] также есть ~ 8000 элементов, но я хочу поместить в них параметры фильтрации и сортировки. Я не могу изменить код этого сайта - поверьте мне, если бы я мог ... – zwalex