怎样区分条码枪输入后触发的回车与键盘回车

时间:2021-12-26 00:35:39

今天在做条码枪扫描商品条码来选择商品时,发现有一个矛盾:条码枪其实是模拟键盘事件的:先模拟敲击键盘,输入它所扫描到的条码,在输入完毕后,再模拟敲击键盘的回车事件。而为了提高功能的易用性,页面本身就有一个监听,当用户按回车时,默认是触发表单的提交事件的,这样就有个冲突,当条码枪扫描条码后,即会触发录入商品信息的操作,之后又会触发表单的提交操作,而这,是我不希望看到的。在条码枪的时候,我不希望触发表单的提交动作。

在经过一些思考与尝试后,用以下的办法解决了,这里先说一下思路,代码稍后整理一下再贴上来:在扫描枪扫描一个条码后,触发的事件中,条码文本框本身的回车事件是会先触发的,继而再到页面的回车事件触发。最初的想法是在文本框的回车事件响应方法中中止整个页面的事件监听,不过试过多个方法,发现无效,所以只有想一些HACK出来解决了。嘿嘿。我是这样做的,有意见或建议者,希望能不吝指点:原先的程序中,在用户通过条码枪录入一个条码后,触发AJAX请求,去服务器取这个条码的商品回来,然后生成一个record加入到商品列表的GridPanel中,然后再清空条码框的值,重新获取焦点,准备下一次的扫描。当鼠标焦点在条码输入框的时候,它的值一定是空的,而当它失去焦点时,我们可以人为让它的值为空,再当页面的回车触发时,我们就可以通过条码输入框的值是否为空也判断本次回车空间是由条码枪触发还是由用户按键盘触发了。我的具体做法是这样,为条码输入框添加三个事件的监听,分别是:focus,specialKey,blur,在focus的时候,清空它的值,在specialKey的时候,取商品详细资料,加入到GridPanel后再清空值,在blur时,设置值为"条码枪录入",这样,在页面的回车监听时,就心中有数了。先判断条码录入框的值是否为空,如果为空,就直接return了,如果非空的话,证明当前回车不是由条码枪触发的,可以尝试进行表单的提交操作,这样就OK啦。