仅执行最后一个调用的函数

时间:2010-02-22 16:23:13

标签: asp.net events asynchronous pagemethods

这是简短的设置。 我有一张大桌子。每当一个单元格获得焦点时,就会完成对服务器的异步调用(使用PageMethods),并返回一些数据并更新页面中的信息框。 我编写的代码可以使用箭头键在单元格之间导航。 当我快速将焦点移动到几个单元格以便到达我想要的单元格时,会出现问题。每次获取焦点都会被执行,因为与服务器的通信大约需要半秒钟,所以它会变得非常烦人并且不是非常用户友好。 理想情况下,我只想执行最后一个焦点事件。但是怎么样?我不知道哪个事件是最后一个,可以吗? 想法,任何人?

2 个答案:

答案 0 :(得分:2)

保罗是对的。

要在网络上执行此操作,您可以将当前的焦点事件与javascript timing functions 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()调用将在另一个计时器启动之前取消当前计时器。正如Paolo建议的那样,您可以尝试使用500毫秒的时间长度来找到最适合您情况的值。

答案 1 :(得分:1)

原则上,您需要一个短时间的计时器,在引发焦点事件时开始倒计时。如果在计时器到期之前发生了另一个事件,那么你重新启动它,如果没有,那么你执行OnFocus逻辑,无论最后一个单元是什么。

诀窍是让它足够短以保持UI感觉响应,但足够长以避免触发多次调用服务器。

不幸的是,我不知道你是如何为ASP.NET做的,但我已经在类似的情况下在Winforms中完成了它。