这就是简而言之的设置。我有一张大桌子。每次单元格获得焦点时,都会完成对服务器的异步调用(使用PageMethods),并返回一些数据并更新页面中的infobox。我已经编写了代码,可以使用箭头keyes在单元格之间导航。当我在几个单元格中快速移动焦点以到达我想要的单元格时,问题就出现了。每次get-focus都会被执行,由于与服务器的通信需要大约半秒,这就变得相当恼人,而且对用户也不是很友好。理想情况下,我只想执行最后一个焦点事件。但是怎么做呢?我不知道哪个项目是最后一个项目,是吗?有谁有想法吗?
发布于 2010-02-23 00:55:05
保罗说得很对。
要在web上执行此操作,您需要将当前的焦点事件与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建议的那样,您可以尝试500ms的时间长度,以找到最适合您的情况的值。
发布于 2010-02-23 00:33:55
原则上,您需要一个短时间的计时器,它在焦点事件被引发时开始倒计时。如果在计时器超时之前发生另一个事件,则重新启动它,如果没有,则执行最后一个单元的OnFocus逻辑。
诀窍是使它足够短,以保持UI的响应性,但足够长,以避免触发对服务器的多个调用。
对你来说不幸的是,我不知道你如何在ASP.NET中做到这一点,但我已经在Winforms中为类似的情况做到了这一点。
https://stackoverflow.com/questions/2312305
复制相似问题