Normal şartlarda barkod okuyucusundan elde edilen veriler işlenirken barkod bir metin alanına okutulur ve daha sonra da bu alandan elde edilen metin değeri üzerinden işlem yapılır. Ancak bu yöntem karekod içeriğinin ayrıştılmasında yeterli olmamaktadır. Çünkü karekod değişken uzunluktaki verileri ayrıştırmak için FNC1 (ASCII 29) karakteri kullanmaktadır. ASCII 29 karakteri ise görülebilir bir karakter olmadığı için metin alanı tarafından algılanmamaktadır.
Bu durumda yapmamız gereken metin alanın keypress,keydown ve keyup olaylarına(event) başvurmak olacaktır. Bu yöntemde karşımıza iki zorluk çıkmaktadır. Birincisi barkod okuyucuları FNC1 karakterini iletirken farklı davranıyor. İkincisi ise keypress,keydown ve keyup olayları(event) uygulamadan uygulama değişiklikler gösterebiliyor.
Aşağıda bu iki durumu dikkate alan bir javascript kodu sunulmuştur. Kod geliştirilirken tüm tarayıcılarla çalışması esas alınmıştır. (IE,Firefox da denendi). Sizde bu kodu temel alarak karekod ayrıştırma işlemini kendi yazılım geliştirme diline çevirebilirsiniz. Aşağıdaki kod bu işlem için en optimum yöntem olmayabilir. Bu durumda önerilerinizi lüften karekod@karekod.com adresinden paylaşınız.
// You can use this code if you provide a link to www.karekod.com
// Asagidaki kodu www.karekod.com a baglanti sunarak kullanabilirsiniz.
var keypad_alt_0 = false;
var keypad_alt_2 = false;
var keypad_alt_9 = false;
function karekod_keydown(e)
{
var keynum;
if(window.event) // IE
{
keynum = e.keyCode;
}
else if(e.which) // Netscape/Firefox/Opera
{
keynum = e.which;
}
//Some barcode readers sends FNC1 as Function keys
//Bazi barkod okuyuculari FNC1 karakterini Fonksiyon tuslari olarak gönderiyor.
if((112 <= keynum) && (keynum <= 123)){ //F1,F2....F12
keynum = 29 ; //Fnc1 Group Seperator
processCurrentToken(keynum);
return false;
}
//Some barcode readers sends FNC1 as keypad ALT+0, ALT+2,ALT+9 (ASCII 29)
//Bazi barkod okuyuculari FNC1 karakterini alt + keypad 0, keypad 2 ve keypad 9 kombinasyonu olarak gönderiyor.
if(e.altKey){
if(keynum == 18) {//ALT
keypad_alt_0 = false;
keypad_alt_2 = false;
keypad_alt_9 = false;
}
// ALT+0 (45,96)->IE/Firefox 45,48 -> Opera
if((keynum ==45) || (keynum == 96) || (keynum == 48)) {
keypad_alt_0 = true;
}
// ALT+2 (40,98)->IE/Firefox 40,50 -> Opera
if((keynum ==40) || (keynum == 98) || (keynum == 50)) {
keypad_alt_2 = true;
}
// ALT+9 (33,105)->IE/Firefox 33,57 -> Opera
if((keynum ==33) || (keynum == 105) || (keynum == 57)) {
keypad_alt_9 = true;
}
if(keypad_alt_0&& keypad_alt_2&&keypad_alt_9) {
keynum = 29 ; //Fnc1 Group Seperator
processCurrentToken(keynum);
keypad_alt_0 = false;
keypad_alt_2 = false;
keypad_alt_9 = false;
return false;
}
}
}
function karekod_keypress(e)
{
var keynum;
if(window.event) // IE
{
keynum = e.keyCode;
}
else if(e.which) // Netscape/Firefox/Opera
{
keynum = e.which;
}
if(!e.altKey){
processCurrentToken(keynum);
}
}
var currenttoken = '';
var nextConsume = 0;
var consumingGtin = false;
var consumingSerial = false;
var consumingExpDate = false;
var consumingBatch = false;
var consumingAI=true;
var consumingOther = false;
WAIT_FOR_FNC1=10000;
function processCurrentToken(keynum){
if(!keynum) //if keynum is not defined do nothing.
return;
keychar = String.fromCharCode(keynum);
currenttoken += keychar;
//document.testform.token.value = currenttoken;
if(!consumingAI && (nextConsume == 0)) {
consumingGtin = false;
consumingSerial = false;
consumingExpDate = false;
consumingBatch = false
consumingOther = false;
consumingAI = true;
currenttoken = keychar;
}
if(keynum == 29) {//Fnc1
currenttoken = '';
nextConsume = 0;
return
}
if((currenttoken == '01') && consumingAI) { //Gtin
currenttoken = '';
nextConsume = 14;
consumingGtin = true;
consumingAI = false;
return;
}
if((currenttoken == '21') && consumingAI) { //Serial
currenttoken = '';
nextConsume = WAIT_FOR_FNC1; //Wait For Fnc1
consumingSerial = true;
consumingAI = false;
return;
}
if((currenttoken == '10') && consumingAI) { //Batch
currenttoken = '';
nextConsume = WAIT_FOR_FNC1; //Wait For Fnc1
consumingBatch = true;
consumingAI = false;
return;
}
if((currenttoken == '17') && consumingAI) { //ExpDate
currenttoken = '';
nextConsume = 6;
consumingExpDate = true;
consumingAI = false;
return;
}
if(consumingGtin) {
document.testform.gtin.value = currenttoken;
nextConsume--;
}
if(consumingSerial) {
document.testform.serial.value = currenttoken;
nextConsume--;
}
if(consumingBatch) {
document.testform.batch.value = currenttoken;
nextConsume--;
}
if(consumingExpDate) {
document.testform.expdate.value = currenttoken;
nextConsume--;
}
}
function resetConsume(){
consumingGtin = false;
consumingSerial = false;
consumingExpDate = false;
consumingBatch = false
consumingOther = false;
consumingAI = true;
currenttoken = '';
nextConsume = 0;
document.testform.karekod.value = '';
document.testform.gtin.value = '';
document.testform.serial.value = '';
document.testform.batch.value = '';
document.testform.expdate.value = '';
}