题目:Why is there sometimes a half-second delay between the click and the action?
作者:Raymond Chen
发表日期:2009年4月29日
出处:http://blogs.msdn.com/oldnewthing/archive/2009/04/29/9574643.aspx
翻译:Silence
在用户界面的某些地方,你可能进行了点击要执行某个功能,但是实际上相应的功能半秒钟后才开始执行。为什么会有一个半秒钟的延迟呢?
因为系统在等着查看用户是否在执行一次双击。
有些用户对看到的一切都进行双击操作,而根据那些本应该单击执行的功能,这可能会带来问题,也可能不会。
如果点击启动了一个模态对话框,那么第二次点击大部分情况下是无害的。因为模态对话框是同一线程组中接受那个无意义的第二次单击的窗口。当该线程组下一次处理输入时(当模态对话框准备好接受输入时),第二次的鼠标点击被传递到模态对话框,而且通常点击位置是无意义的,所以没有什么情况发生。还有就是第二次点击也经常点在原来的窗口上,而不是新出现的模态对话框上,而原来的窗口已经被禁用,第二次点击被忽略,所以不会有什么不好的后果。
但是如果点击启动了一个新的进程或打开了一个新的unowned window,那么第二次点击就会引起麻烦。例如你点击了一个启动控制面板的连接,那第二次的点击被传递到启动器(launcher),那么控制面板的窗口出现时将不会获得输入焦点。(控制面板不可能偷到输入焦点,因为用户通过和启动器窗口交互来拒绝焦点的切换。)
一个常用的解决办法是对于那些只需单击执行而出现了上面所示的第二种情况的功能,就让它们等待一次双击所需的时间来检查是否有另一次点击出现。如果第二次点击出现了,说明用户是一个喜欢双击的人,那么在第二次点击的时候才执行相应的操作。如果没有出现第二次点击,说明用户是一个有单击使用习惯的人,那么就等待一个双击时间后执行程序。(过滤偶然双击有一个非正式的名字,叫做去除抖动(debouncing)。)
这样做的结果就是对于那些使用单击执行相应功能人来说,就要在操作执行前等待半秒钟的延迟。