使用条形码阅读器防止chrome中的打开下载窗口

时间:2012-04-27 15:06:43

标签: javascript barcode-scanner

我的网站(MVC3,C#)和条形码阅读器存在此问题。 在我的形式我有这样的事情:

<ajax form....>

<input type=text />

<div id=list>
</div>

</form>

输入中填充条形码阅读器并自动提交带有ajax的表单,用id = list填充div。 我的问题是,使用chrome和ie,在文本被提交后,下载窗口出现在chrome中,收藏夹窗口出现在ie中。我想这是因为条形码阅读器在文本中加入[CR] [LF]并打开那些窗口。我认为条形码阅读器在某个时刻插入了一个ctrl-j,因为该组合打开了chrome中的下载窗口和ie中的收藏夹,但是使用firefox下载窗口没有打开(也是ctrl-j)。

我不想告诉我的客户配置条形码阅读器以便我的页面正常工作,所以我想在javascript中使用sollution来解决这个问题。

感谢!!!

7 个答案:

答案 0 :(得分:5)

我找到了this链接,但唯一的解决办法是更改扫描仪的默认字符...我不确定我是否可以改变我的方式,就像你一样,我会寻找与浏览器相关的修复..也许是javascript。我会尝试使用javascript来处理这些字符以防止这种情况发生...如果我有任何成功,我会尝试并记得回到这里并告诉你呵呵呵呵

我认为这解决了这个问题......

$(document).ready(function(){
    $("#input").keydown(function(e){
        if(e.which==17 || e.which==74){
            e.preventDefault();
        }else{
            console.log(e.which);
        }
    })
});

lemme知道他的作品是否适合你......确保你也清空了缓存...

答案 1 :(得分:1)

此代码适合我

$(document).ready(function(){
    $("#input").keydown(function(e){
        if(e.which==17 || e.which==74 || e.keyCode == 13){
            e.preventDefault();
        }
    })
});

答案 2 :(得分:0)

我的扫描仪(Intermec SR30)设置为在条形码后应用3个新的行字符。我通过打开Vim,插入,然后扫描条形码找到了这个。然后我把文件写成od -ax:

0000000   3   1   2   2   1   0   9   9   9   4   8   5   2   8  nl  nl
       3133    3232    3031    3939    3439    3538    3832    0a0a
0000020  nl
           000a
0000021

我可以用'nl'来捕捉:

$(document).ready(function(){
    $("#barcode").keypress(function(e){
        console.log('"' + e.keyCode + '"\n');
        if(e.keyCode == 13){
            e.preventDefault();
        }
    })
});

但是下载窗口打开事件(来自键盘的Ctrl + j)在浏览器到达打开页面之前被浏览器弄平。这个问题也困扰着Firefox 30.0。

答案 3 :(得分:0)

批准答案的代码是阻止CTRL和J键。 这将仅阻止CTRL + J

$("#barcode").keypress(function(event){
    if(event.keyCode == 74 && event.ctrlKey){
        event.preventDefault();
    }
});

答案 4 :(得分:0)

以下代码无法使用。因为如果条形码值有&#39; J&#39;在其中的角色,你不会得到正确的结果。我们尝试添加e.ctrlkey控件,但这次只检索条形码的一个字符。通过js解决方案似乎很难。也许最好的选择是更改扫描仪设置。

$(document).ready(function(){
    $("#input").keydown(function(e){
        if(e.which==17 || e.which==74 || e.keyCode == 13){
            e.preventDefault();
        }
    })
});

答案 5 :(得分:0)

这适合我。

<script>
  document.addEventListener('keydown', function(event) {
    if( event.keyCode == 13 || event.keyCode == 17 || event.keyCode == 74 )
      event.preventDefault();
  });
</script>

答案 6 :(得分:-1)

在我们的 angularjs 应用程序中,我们使用以下指令解决了该问题:

(function () {
    "use strict";

    angular
        .module("Xeon.core")
        .directive("xnOnBarcodeKeydown", xnOnBarcodeKeydown);

    var whiteList = [67, 86, 65, 88];

    /** @ngInject */
    function xnOnBarcodeKeydown() {
        return function (scope, element, attrs) {
            element.bind("keydown",
                function (event) {

                    if (event.ctrlKey && whiteList.indexOf(event.which) === -1) {
                        event.stopImmediatePropagation();
                        event.preventDefault();
                        event.stopPropagation();
                        return false;
                    }

                    if (event.which === 13) {
                        scope.$apply(function () {
                            scope.$eval(attrs.xnOnBarcodeKeydown, { 'event': event });
                        });

                        event.preventDefault();
                    }
                });
        };
    }
})();

Template lambdas will be a part of C++20, but your intent was common enough to include in C++14.

角度版本:

import { Directive, EventEmitter, HostListener, Output } from '@angular/core';

@Directive({ selector: '[appXnOnBarcodeKeydown]' })
export class XnOnBarcodeKeydownDirective{

  @Output() onEnter = new EventEmitter();

  private whiteList = [67, 86, 65, 88];

  @HostListener('keydown', ['$event'])
  keyDown(event) {

    if (event.ctrlKey && this.whiteList.indexOf(event.which) === -1) {
      event.stopImmediatePropagation();
      event.preventDefault();
      event.stopPropagation();
      return false;
    }

    if (event.which === 13) {
      this.onEnter.emit(event);
      event.preventDefault();
    }
  }
}

angularjs usage