2010-02-22 59 views
2

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

+0

@Magnus - 我已经重申了你的问题,让更多的人有机会找到它。 – Paolo 2010-02-22 16:28:45

+0

by cells你的意思是你有文本框? – 2010-02-22 17:10:41

回答

1

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

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

不幸的是,我不知道你是怎么做到这一点的ASP.NET,但我已经在类似情况下在Winforms中完成了它。

2

保罗是正确的。调用方法是将前

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()的调用创建一个半秒钟的等待时间:

为此在网络上您会在目前的焦点事件与javascript timing functions setTimeout和clearTimeout结合打电话给你的服务器。如果在该定时器到期之前发生另一个焦点事件,clearTimeout()调用将在另一个启动之前取消当前定时器。正如Paolo所建议的那样,您可以尝试500毫秒的时间长度来找到最适合您情况的值。