JavaScript 掃描槍應用(一)
com.js為主要的代碼實作,test.html檔案為測試的頁面,其中包括了com.js檔案中方法的調用。以下為測試成功代碼:
com.js
//com.js
function initMSComm(){
document.write("");
document.write(" ");
document.write(" ");
document.write("");
document.write("");
document.write("");
document.write("");
document.write("");
document.write("");
document.write(" ");
document.write("");
document.write("");
document.write("");
document.write("");
document.write("");
document.write("");
document.write("");
document.write("");
document.write("");
if(MSComm1.PortOpen==false){
try{
MSComm1.PortOpen=true;
}catch(ex){
alert("com1端口打開失敗:"+ex.message);
}
}
}
var mscomm_scan_value = "";
// 序列槽響應事件
function MSComm1_OnComm(callBackFunction){
switch(MSComm1.CommEvent){
case 2: //接收事件
if(mscomm_scan_value == "") {
mscomm_scan_value = MSComm1.Input;
// 定時讀取緩存資訊
setTimeout("getMSCommScanValue("+callBackFunction+")",300);
}
break;
default: alert("Event Raised!"+MSComm1.CommEvent);
}
}
function getMSCommScanValue(callBackFunction){
// 讀取緩存中剩餘的資訊
while(MSComm1.InBufferSize > 0) {
mscomm_scan_value += MSComm1.Input;
}
// 執行頁面傳遞過來的函數
callBackFunction(mscomm_scan_value);
// 清空目前讀取資訊
mscomm_scan_value = ""
}
test.html
JavaScript序列槽測試
// MSComm1控件每遇到 OnComm 事件就調用 MSComm1_OnComm()函數
MSComm1_OnComm(mscommCallBack)
function mscommCallBack(scanValue) {
var ewtm = document.getElementById("ewtm");
ewtm.value = scanValue;
}
initMSComm();
二維條碼:
得出以上結果經過幾次失敗嘗試,嘗試内容如下:
1. 将test.html檔案中的
// MSComm1控件每遇到 OnComm 事件就調用 MSComm1_OnComm()函數
MSComm1_OnComm(mscommCallBack)
段代碼調整為:
window.onload = function() {
MSComm1.OnComm = MSComm1_OnComm;//采用其他方式取代閉包的實作過程
}
2. 在頁面head的JavaScript代碼中調用initMSComm方法,将Object标簽對象添加到頁面的一個div中,頁面提示加載ActiveX控件,但是無法綁定OnComm事件響應。
3. 當MSComm1.CommEvent為7時表示接收結束,可是隻能接收到狀态為2的情況,是以無法采用狀态為7時的響應事件。
4. 當initMSComm方法調用時,且MSComm1.CommEvent為2的情況下,判斷MSComm1.inBufferCount為0時進行事件響應,可能是緩沖等多種原因(具體不太清楚),會導緻inBufferCount出現多吃0的情況,是以沒有辦法使用,最終采用首次執行,定時擷取的方式完成緩存内容的讀取操作。
我的目的是通過一次方法調用,能夠實作對象的加載,響應事件的綁定,以及接收結束執行響應事件操作。由于我對JavaScript不夠熟練,是以沒能夠達到預期的目的,如果有更好的解決辦法,希望大家能夠給我留言。