使用jQuery監(jiān)聽掃碼槍輸入并禁止手動輸入的實(shí)現(xiàn)方法(推薦)
基于jQuery的掃碼槍監(jiān)聽。如果只是想實(shí)現(xiàn)監(jiān)聽獲取條碼掃碼信息,可以直接拿來使用,如果有更多的條碼判斷處理邏輯需要自己擴(kuò)展。
一、功能需求
使用掃碼槍掃描條碼,在一個web頁面監(jiān)聽獲取掃碼槍的數(shù)據(jù),并禁止用戶進(jìn)行手動的輸入操作。
開始的想法非常簡單,因?yàn)閽叽a槍就是模擬鍵盤的輸入,當(dāng)他用usb接口插入電腦的時候,就變成了一個外接的輸入設(shè)備,用js監(jiān)聽就可以了。但是如何判斷用戶是否為手動輸入就需要做一些處理了。
二、主要問題
1.如何判斷是否手動輸入
2.如何判斷一個條碼輸入完成
三、解決方案
手動輸入的解決辦法就是:對比一個鍵從按下到抬起的時間間隔,以及兩次按鍵的時間間隔。
因?yàn)閽叽a槍的輸入速度非常的快,我測試的掃碼槍輸入的間隔大概在15-60毫秒,然后手動輸入的100-200之間,除非刻意的想突破限制進(jìn)行快速的輸入。這個間隔值可以控制的很小,前提不要快過掃碼搶的速度。
輸入完成的判斷:可以對輸入框變化做一個監(jiān)聽,如果達(dá)到我們想要的位數(shù),則提交服務(wù)器端進(jìn)行處理;第二種是基于掃碼槍,因?yàn)槲沂褂玫膾叽a槍可以配置掃碼成功最后附加一個回車。所以根據(jù)回車的keycode就可以判斷為輸入已經(jīng)結(jié)束,然后獲取輸入框的value,再進(jìn)行后續(xù)的處理(提交服務(wù)器等)。
四、代碼
時間間隔的判斷,依賴于jQuery的三個事件:keydown,keypress,keyup;即鍵開始按下,已經(jīng)按下,彈起這三個狀態(tài),keydown,就是在按鍵剛剛被按下,但鍵值還沒有寫入文本框,keypress已經(jīng)按下并且值已經(jīng)輸入到文本框,keyup就是彈起了。
需要做判斷的就是按鍵從按下到抬起的時間間隔,與兩次keydown的時間間隔。
主要的手動輸入判斷代碼。
var barcode = {
listenerObj: null,
oneKeyTime : '', /* 一次按鍵時間間隔 */
twoKeyTime : '', /* 兩次按鍵時間間隔 */
keyDownTime: '', /* 鍵按下的時間 */
barcodeLen : 8 , /* 條形碼長度 */
spanTime : 70, /* 一次按鍵按下到釋放的時間間隔 */
on_key_down : function (){
var that = this;
this.listenerObj.keydown(function(e){
if(e.which !== 13 && !(that.in_range(e.which))){
$(that.listenerObj).val('');
return ;
}
var d = new Date();
var curTime = parseInt(d.getTime());
if(that.keyDownTime !== '' && that.keyDownTime !== NaN){
that.twoKeyTime = curTime - that.keyDownTime;
}
that.keyDownTime = curTime;
});
},
on_key_up : function(){
var that = this;
this.listenerObj.keyup(function(e){
var d = new Date();
var keyUpTime = d.getTime();
that.oneKeyTime = parseInt(keyUpTime) - parseInt(that.keyDownTime);
var isHand = that.checkHandInput();
if(isHand && that.in_range(e.which)){
layer.msg('禁止手動輸入');
$(that.listenerObj).val("");
}
})
},
on_key_press : function(){
var that = this;
this.listenerObj.keypress(function(e){
if(e.which == 13 && that.check_barcode()){
that.createListEl();
}
});
},
checkHandInput : function(){
if((this.oneKeyTime > this.spanTime) || this.twoKeyTime > this.spanTime){
return true;
}else{
return false;
}
},
}
將代碼整理了一下,放到了Github。
我的js代碼中的提示用到了layer.js,所以如果使用按照index.html中的示例,引入相關(guān)的js:
<input id="barCode" value="" type="text" placeholder="stay focus" style="" name="">
$("#barCode").startListen({
barcodeLen : 10,
letter : true,
number : true,
show : function(code){
layer.msg(code);
}
});
這里可配置的參數(shù):包括條碼的長度,是否包含英文字母,是否包含數(shù)字。以及一個show回調(diào)方法,這個方法會在掃碼成功,條碼合法的情況下被調(diào)用,返回條碼的值,以便做自定義的操作,如上傳服務(wù)器等。
代碼中對頁面的輸入框做了stay focus,所以頁面有其他的輸入需求無法實(shí)現(xiàn),可以除去keepFocusInput的調(diào)用。
以上所述是小編給大家介紹的使用jQuery監(jiān)聽掃碼槍輸入并禁止手動輸入的實(shí)現(xiàn)方法(推薦),希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
相關(guān)文章
jQuery實(shí)現(xiàn)漸變彈出層和彈出菜單的方法
這篇文章主要介紹了jQuery實(shí)現(xiàn)漸變彈出層和彈出菜單的方法,涉及jQuery漸變效果及css顯示的實(shí)現(xiàn)技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-02-02
得到j(luò)Query detach()后節(jié)點(diǎn)中的某個值實(shí)現(xiàn)代碼
需要jQuery -detach 后的dom 結(jié)構(gòu)或某個值,如何獲取到呢?一直困惑著我們,不過本文將為大家解開疑惑,感興趣的朋友可以了解下,或許本文對你有所幫助2013-02-02
JQuery的Ajax中Post方法傳遞中文出現(xiàn)亂碼的解決方法
這篇文章主要介紹了JQuery的Ajax中Post方法傳遞中文出現(xiàn)亂碼的解決方法,較為深入的分析了Ajax的post方法出現(xiàn)亂碼的原因,以及具體的解決方法,需要的朋友可以參考下2014-10-10
jquery實(shí)現(xiàn)平滑的二級下拉菜單效果
這篇文章主要介紹了jquery實(shí)現(xiàn)平滑的二級下拉菜單效果,可實(shí)現(xiàn)鼠標(biāo)滑過彈出二級下拉菜單,涉及jquery鼠標(biāo)hover事件及fadeIn與fadeOut事件操作頁面元素隱藏及顯示的實(shí)現(xiàn)技巧,需要的朋友可以參考下2015-08-08
JQuery中attr屬性和jQuery.data()學(xué)習(xí)筆記【必看】
下面小編就為大家?guī)硪黄狫Query中attr屬性和jQuery.data()學(xué)習(xí)筆記【必看】。小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考,一起跟隨小編過來看看吧2016-05-05

