Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 19.09.2010, 14:19
Новичок на форуме
Отправить личное сообщение для Woody Посмотреть профиль Найти все сообщения от Woody
 
Регистрация: 04.08.2010
Сообщений: 6

Остановка выполнения функции
Добрый день!

На странице пользователя 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 (permalink)  
Старый 19.09.2010, 14:38
Аватар для micscr
Профессор
Отправить личное сообщение для micscr Посмотреть профиль Найти все сообщения от micscr
 
Регистрация: 10.09.2009
Сообщений: 1,566

Флаг поставь. Пришел ответ на второй запрос и он(2-й запр.) проверяет - действительно ли текущий - 2-й? Если третий например - то ничего не делать.
Ответить с цитированием
  #3 (permalink)  
Старый 19.09.2010, 16:57
Новичок на форуме
Отправить личное сообщение для Woody Посмотреть профиль Найти все сообщения от Woody
 
Регистрация: 04.08.2010
Сообщений: 6

Сообщение от micscr Посмотреть сообщение
Флаг поставь. Пришел ответ на второй запрос и он(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)
Ответить с цитированием
  #4 (permalink)  
Старый 19.09.2010, 17:12
Аватар для micscr
Профессор
Отправить личное сообщение для micscr Посмотреть профиль Найти все сообщения от micscr
 
Регистрация: 10.09.2009
Сообщений: 1,566

Я имел ввиду следующее:
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');
      }
    );
  })
);
Ответить с цитированием
  #5 (permalink)  
Старый 19.09.2010, 18:14
Новичок на форуме
Отправить личное сообщение для Woody Посмотреть профиль Найти все сообщения от Woody
 
Регистрация: 04.08.2010
Сообщений: 6

Тоже самое. Получается все запросы уходят на сервер, на это и тратится основное время. Тут надо как-то стек сообразить и через интервал его анализировать. Пойду кумекать ...
Ответить с цитированием
  #6 (permalink)  
Старый 20.09.2010, 18:03
Новичок
Отправить личное сообщение для inGray Посмотреть профиль Найти все сообщения от inGray
 
Регистрация: 03.08.2010
Сообщений: 230

а может задержку поставить?? Не сразу отсылать запрос на сервер а по истечении некоего интервала после последнего клика?
__________________
Не хочешь, чтобы тебя послали? Не спрашивай куда идти.
Ответить с цитированием
  #7 (permalink)  
Старый 21.09.2010, 11:40
Новичок на форуме
Отправить личное сообщение для Woody Посмотреть профиль Найти все сообщения от Woody
 
Регистрация: 04.08.2010
Сообщений: 6

Сообщение от inGray Посмотреть сообщение
а может задержку поставить?? Не сразу отсылать запрос на сервер а по истечении некоего интервала после последнего клика?
Вариант с задержкой работает, только он мне не нравится. Пришлось эту самую задержку подбирать, например если поставить 400мс, то страницы "листаются", на 600мс получается то что нужно. Что будет в реальных интернет условиях незнаю. Хочется большей четкости, но за неимением лучшего пока этот вариант буду использовать.
Ответить с цитированием
  #8 (permalink)  
Старый 21.09.2010, 11:50
Новичок
Отправить личное сообщение для inGray Посмотреть профиль Найти все сообщения от inGray
 
Регистрация: 03.08.2010
Сообщений: 230

Сбрасывайте таймер ожидания клика каждый раз когда пользователь нажимает на ссылку?
var timer;

timer = setTimeout(foo(),400);

А при клике делать
clearTimeout(timer);
timer = setTimeout(foo(),400);
?
__________________
Не хочешь, чтобы тебя послали? Не спрашивай куда идти.
Ответить с цитированием
  #9 (permalink)  
Старый 21.09.2010, 12:03
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177


Ну и советики у вас. А вроде не первый день замужем на форуме.

Хотя месяц всего, можно пока

timer = setTimeout(foo,400);
Ответить с цитированием
  #10 (permalink)  
Старый 21.09.2010, 14:33
Новичок
Отправить личное сообщение для inGray Посмотреть профиль Найти все сообщения от inGray
 
Регистрация: 03.08.2010
Сообщений: 230

Пардон )) Женюсь исправлюсь)) Не знал сбросится ли таймер и подстраховался)
__________________
Не хочешь, чтобы тебя послали? Не спрашивай куда идти.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Переменная как значение функции. Jurasmi Общие вопросы Javascript 7 22.04.2010 12:45
Условие выполнения функции TAILER Events/DOM/Window 2 28.02.2010 23:26
Остановка выполнения скрипта parzh-junior Элементы интерфейса 0 12.12.2009 13:58
Подскажите, как работает простой код (замыкание функции)? Dotod Общие вопросы Javascript 5 02.12.2009 04:03
Как дождаться полного выполнения функции? San4ezy Events/DOM/Window 13 15.11.2009 19:41