Выполнение только последней вызванной функции - PullRequest
2 голосов
/ 22 февраля 2010

Это настройка вкратце. У меня большой стол. Каждый раз, когда ячейка фокусируется, выполняется асинхронный вызов к серверу (с PageMethods), и некоторые данные возвращаются и обновляют информационный блок на странице. Я написал код, который позволяет перемещаться между ячейками с помощью клавиш со стрелками. Проблема возникает, когда я быстро переключаю фокусировку на несколько ячеек, чтобы добраться до нужной ячейки. Каждый get-focus выполняется, и поскольку общение с сервером занимает около полсекунды, оно становится довольно раздражающим и не очень удобным для пользователя. В идеале я хотел бы выполнить только последнее фокусное событие. Но как? Я не могу знать, какое событие является последним, я могу? Идеи, кто-нибудь?

Ответы [ 2 ]

2 голосов
/ 22 февраля 2010

Паоло прямо на.

Чтобы сделать это в Интернете, вы должны объединить текущее событие Focus с функциями синхронизации JavaScript setTimeout и clearTimeout:

var timer; // timer variable in scope for other functions

var onFocus = function() {
  clearTimeout(timer);
  timer = setTimeout("makePageMethodCall()", 500);
}

var makePageMethodCall = function() {
  // make ajax call to your PageMethod function
}

Вызов setTimeout () создает время ожидания в полсекунды, прежде чем вызывать метод, который вызовет ваш сервер. Если другое событие фокуса происходит до истечения этого таймера, вызов clearTimeout () отменит текущий таймер до запуска другого. Как рекомендует Паоло, вы можете поэкспериментировать с продолжительностью 500 мс, чтобы найти значение, наиболее подходящее для вашей ситуации.

1 голос
/ 22 февраля 2010

В принципе вам нужен таймер на короткий период, который начинает обратный отсчет при возникновении события фокуса. Если до истечения таймера происходит другое событие, вы перезапускаете его, если нет, то выполняете логику OnFocus для любой последней ячейки.

Хитрость заключается в том, чтобы сделать его достаточно коротким, чтобы пользовательский интерфейс чувствовал себя отзывчивым, но достаточно длинным, чтобы избежать запуска нескольких вызовов на сервер.

К сожалению для вас, я не знаю, как вы это сделаете для ASP.NET, но я сделал это в Winforms для подобных ситуаций.

...