我的网站(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来解决这个问题。
感谢!!!
答案 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();
}
}
}