我正在从基本的USB信用卡读卡器中获取信用卡信息。一个膨胀的ASCII数据流被发送到文本框,我的js解析为有用位。一切正常。
我的ASP.NET应用程序中有以下大量的jquery,它可以在不同的页面上完美地运行,但在相关页面上有所突破。下面的jquery和我在其他页面上工作的唯一区别是第一行,.unbind()。我添加了这一行,因为这是我能找到让“更改”监听器触发的唯一方法。但它有一个副作用:在更改侦听器触发并且数据流被清除之后,以某种方式发生回发,然后RAW数据流进入我的文本框:txtCreditCardNumber。
重要提示:刷卡器似乎在流的末尾发送了一个CRLF,所以这可能导致回发。但这令人费解,因为即使我手动输入文本框并点击ENTER,也不会发生回发。
刷卡时,其他页面不会自动回发。在这个页面上,没有取消绑定,更改侦听器永远不会被调用,但是使用它,我得到正确的解析/清理,然后是回发,然后是使用来自读卡器的完整原始数据流填充的文本框。 / p>
$("#txtCreditCardNumber").unbind("keypress");
$('#txtCreditCardNumber').bind('change', function(e) {
e.preventDefault();
if (e.which == 46 || e.which == 8)
return; // always ignore the DELETE and BACKSPACE keys
var element = this;
setTimeout(function() {
var ccRawData = $(element).val();
ccNumber = getCCNumberFromRawData(ccRawData);
ccExpYear = getCCExpYearFromRawData(ccRawData);
ccExpMonth = getCCExpMonthFromRawData(ccRawData, false);
ccNameOnCard = getCCNameOnCardFromRawData(ccRawData);
if (ccExpMonth.length == 1)
ccExpMonth = "0" + ccExpMonth;
$('#txtCreditCardNumber').val(ccNumber);
$('#txtCCExpirationDate').val(ccExpMonth + "" + ccExpYear);
//$('#ccEmbeddedName').html(ccNameOnCard);
$("#txtCreditCardNumber").attr('maxlength', '16');
}, 0);
return false;
});
这是ASP.NET文本框:
<asp:TextBox runat="server" ID="txtCreditCardNumber" data-capture="CCAccountNo" CssClass="creditcard" style="width:114px" />
如果我可以阻止回发,我相信整个问题都会得到解决。我已经在做e.preventDefault(),但它没有效果。有什么想法吗?