阻止Javascript事件的默认行为

这几天,因为一个项目中的bug而头痛。

这是一个条码扫描程序,为了保证扫描工作的连续性,在页面中利用 Javascript自动捕获keydown事件,因为条码扫描枪在完成一次扫描任务后会触发回车键,所以,在keydown事件中判断是否 keyCode==13,然后触发页面中一个隐藏的按钮,提交此数据保存至服务器。

程序中,为条码输入文本框注册了类似这样的脚本:

if(event.keyCode==13){ document.getElementById('buttonClientID').click(); }

因 为开始时系统并未要求对条码进行校验,所以问题没有暴露,直到后来系统升级,对扫入的条码进行各种合理性判断,才发现有些不太对头。数据似乎进行了两次保 存,但页面看起来只做了一次回滚,所以,第一反应是服务器端的代码问题。但问题怪就怪在这里,提交数据的服务器代码是一个事务,要么成功,要么失败回滚, 但数据却是被成功保存了的,这让我百思不得其解。在花了大量时间对服务器代码进行改造却毫无进展之后,还是把目标放在了客户端,因为通过测试也能确定数据 有被重复提交的迹象。

经过大量的尝试后,终于找到了问题所在,原来,这和浏览器的事件处理模型有关。为了简化,这个 程序被限制在IE下工作。在IE中,响应一个事件的并非只有一个元素,处理的方法是所谓冒泡型事件,也就是从最特定的事件到最不特定的事件目标的顺序进行 触发,也就是按照DOM的层次结构不断地上升到顶端,这个概念被称作事件流。所以,在本程序中,扫描枪触发的回车事件,除了会执行JS指定的动作之外,还 会默认有其它一些元素去响应它,具体会触发哪些动作和页面布局有关。这种情况类似于在填写表单的时候,有些用户(特别是常用Excel的财务人员)会在填 写完一个文本框后习惯性地按下回车以换行,如果,未针对这种情况进行处理的话,很可能会触发提交表单的事件。对于直接键盘输入的程序很容易想到这个问题,扫描枪这种输入设备平时较少用到,晕。

解决的方法很简单,就是在脚本中加上这样一段代码:

event.returnValue=false;

这是在IE下,如果是Mozilla,则要调用preventDefault()方法。

这样,就能够阻止该事件的默认行为,而只去执行指定的动作。

经测试,Bug死了,程序活了。

******

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值