Остановка выполнения функции
Добрый день!
На странице пользователя 2 ссылки перемещения по картотеке "Назад" и "Вперед". Нажатие на ссылку генерирует запрос к серверу и получает в формате json табличные данные. JQuery рисует таблицу. Меня интересует ситуация когда пользователь несколько раз быстро нажимает ссылки. Сейчас скрипт последовательно начнет прорисовку всех страниц (выглядит это довольно неприглядно), а нужно чтобы все предыдущие запросы были сброшены и выполнился только последний. Возможно ли такое? Вот функция для ссылки "Назад":
jQuery('#prev')
.bind('click', (function(event){
jQuery('#page_table').hide('normal');
jQuery.post('/bib/list/prev', function(data) {
var str = "<table class='list'>";
jQuery.each(data,function(index,rec){ str += "<tr><td>"+rec.name+"</td></tr>" });
str += "</table></div>";
jQuery('#page_table').html(str);
jQuery('#page_navi').show('normal');
}
);
})
);
|
Флаг поставь. Пришел ответ на второй запрос и он(2-й запр.) проверяет - действительно ли текущий - 2-й? Если третий например - то ничего не делать.
|
Цитата:
- Событие щелчка по ссылке изменяет поле номера страницы и запускает функцию построения таблицы generate_page(number) - В generate_page(number) проверяется заказанный номер страницы с текущим и запускается обработка. Проверку добавил в двух местах, но это не помогает. По времени зависона видно что все обработки запускаются, единственный положительный эффект то что таблицы не мелькают. Не совсем то что хотелось ...
jQuery('#prev')
.bind('click', (function(event){
jQuery('#page_table').hide('normal');
var number = parseInt(jQuery('#number_page').attr('value')) - 1;
jQuery('#number_page').attr('value', number);
generate_page(number);
})
);
jQuery('#next')
.bind('click', (function(event){
jQuery('#page_table').hide('normal');
var number = parseInt(jQuery('#number_page').attr('value')) + 1;
jQuery('#number_page').attr('value', number);
generate_page(number);
})
);
function generate_page(n) {
if (parseInt(jQuery('#number_page').attr('value')) == n) {
jQuery.post('/bib/list/'+n, function(data) {
if (parseInt(jQuery('#number_page').attr('value')) == n) {
var str = "<table class='list'>";
jQuery.each(data,function(index,rec){
str += "<tr><td>"+rec.name+"</td></tr>"
});
str += "</table>";
jQuery('#page_table').html(str);
jQuery('#page_table').show('normal');
}
});
}
} // END function generate_page(n)
|
Я имел ввиду следующее:
var flag = o; // глобальная переменная - вне функций
jQuery('#prev')
.bind('click', (function(event){
var flag2 = parseInt(Math.random()*10000) // уникальная характеристика щелчка
flag = flag2; // устанавливаем
jQuery.post('/bib/list/prev', function(data) {
if (flag != flag2) return;
jQuery('#page_table').hide('normal'); // тут наверное этой строке находиться ???
var str = "<table class='list'>";
jQuery.each(data,function(index,rec){ str += "<tr><td>"+rec.name+"</td></tr>" });
str += "</table></div>";
jQuery('#page_table').html(str);
jQuery('#page_navi').show('normal');
}
);
})
);
|
Тоже самое. Получается все запросы уходят на сервер, на это и тратится основное время. Тут надо как-то стек сообразить и через интервал его анализировать. Пойду кумекать ...
|
а может задержку поставить?? Не сразу отсылать запрос на сервер а по истечении некоего интервала после последнего клика?
|
Цитата:
|
Сбрасывайте таймер ожидания клика каждый раз когда пользователь нажимает на ссылку?
var timer; timer = setTimeout(foo(),400); А при клике делать clearTimeout(timer); timer = setTimeout(foo(),400); ? |
Ну и советики у вас. А вроде не первый день Хотя месяц всего, можно пока :) timer = setTimeout(foo,400); |
Пардон )) Женюсь исправлюсь)) Не знал сбросится ли таймер и подстраховался)
|
| Часовой пояс GMT +3, время: 07:05. |