2

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

4

2 回答 2

2

保罗是正确的。

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

于 2010-02-22T16:55:04.503 回答
1

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

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

不幸的是,我不知道如何为 ASP.NET 执行此操作,但我已经在 Winforms 中针对类似情况进行了此操作。

于 2010-02-22T16:33:54.740 回答