Остановка выполнения функции
Добрый день!
На странице пользователя 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, время: 20:40. |