<!--StartFragment -->
双击惹的祸-如何避免后台功能重复执行
典型场景:
点击“保存”后,后台将数据保存到数据库中。经常发现数据保存不正常,或者保存两条,或者将原有数据删除。
经过反复测试,原来是双击惹的祸。
分析:
双击有两种情况,一种是用户点击“保存”按钮是双击鼠标,这是比较常见的情况;另一种是单击保存后,后台
处理较慢,用户着急再次单击。无论哪种情况都会造成后台功能执行两次,后果依据后台处理功能不同而不一样。
解决:
单击后因后台处理较慢再次单击,这种情况比较好避免,前端单击处理事件中设置保存按钮不可用即可。但即便
如此也避免不了双击造成的执行两次后台功能,因为双击会触发两次单击事件(浏览器不同可能处理方式不同,但
IE是这种机制)。因此,解决双击问题的思路是在第一次进入单击事件中尽快设置互斥标志,第二次进入时检查标志
避免重复进入真正的处理代码。办法如下:
需要注意的是,如果逻辑上需要允许用户再次单击保存(比如保存过程中出错了),那么应该找一个时机执行:
setMenuItemEnabled(menu, 'save', true).
这个时机一般应该是后台生理完毕之后,回到前台时执行。
例子中简单地在其它按钮事件中执行:
典型场景:

点击“保存”后,后台将数据保存到数据库中。经常发现数据保存不正常,或者保存两条,或者将原有数据删除。
经过反复测试,原来是双击惹的祸。
分析:
双击有两种情况,一种是用户点击“保存”按钮是双击鼠标,这是比较常见的情况;另一种是单击保存后,后台
处理较慢,用户着急再次单击。无论哪种情况都会造成后台功能执行两次,后果依据后台处理功能不同而不一样。
解决:
单击后因后台处理较慢再次单击,这种情况比较好避免,前端单击处理事件中设置保存按钮不可用即可。但即便
如此也避免不了双击造成的执行两次后台功能,因为双击会触发两次单击事件(浏览器不同可能处理方式不同,但
IE是这种机制)。因此,解决双击问题的思路是在第一次进入单击事件中尽快设置互斥标志,第二次进入时检查标志
避免重复进入真正的处理代码。办法如下:

需要注意的是,如果逻辑上需要允许用户再次单击保存(比如保存过程中出错了),那么应该找一个时机执行:
setMenuItemEnabled(menu, 'save', true).
这个时机一般应该是后台生理完毕之后,回到前台时执行。
例子中简单地在其它按钮事件中执行:
