Barcode Scanner Emulator
เครื่องสแกนใช้ได้ใน Notepad แต่ใช้ไม่ได้ใน POS
นี่เป็นปัญหาบาร์โค้ดที่ถูกรายงานบ่อยที่สุดอย่างหนึ่ง และแทบจะหมายความเสมอว่าเครื่องสแกนและการเชื่อมต่อใช้ได้ บั๊กอยู่ที่วิธีที่แอปจัดการอินพุตแป้นพิมพ์
ปัญหา
การสแกนลงในโปรแกรมแก้ไขข้อความธรรมดาให้ค่าที่ถูกทุกครั้ง แต่การสแกนลงในระบบ POS เว็บแอป หรือเครื่องมือภายในไม่ให้อะไร ให้เพียงบางส่วน หรือพฤติกรรมผิด
สาเหตุที่เป็นไปได้
- ช่องเป้าหมายไม่มีโฟกัสแป้นพิมพ์ตอนสแกน หรือโฟกัสอยู่ที่องค์ประกอบที่ไม่ใช่ช่องป้อนข้อมูล
- ตัวจัดการ
keydownเรียกpreventDefault()ในแบบที่บล็อกการป้อนอักขระ - แอปพึ่งเหตุการณ์
pasteหรือinputซึ่งการกดแป้นของเครื่องสแกนไม่ได้กระตุ้นตามที่คุณคาด - มาสก์อินพุตหรือนิพจน์ปกติสำหรับตรวจสอบปฏิเสธอักขระที่ถูกต้องในข้อมูลที่สแกน
- ส่วนต่อท้าย ENTER/TAB กระตุ้นการกระทำที่ไม่ตั้งใจ (ส่งฟอร์มก่อนเวลา ปิดหน้าต่างโมดัล นำทางออก)
- การสแกนเร็วกว่าตัวจัดการอินพุตที่มี debounce หรือ throttle จะลงทะเบียนการกดแป้นทุกครั้งได้ทัน
ขั้นตอนวินิจฉัย
- เปิด ตัวทดสอบเหตุการณ์แป้นพิมพ์ ในเบราว์เซอร์เดียวกันแล้วสแกนบาร์โค้ด หากทุกอักขระถูกบันทึกถูกต้องที่นี่ เบราว์เซอร์และระบบปฏิบัติการรับเหตุการณ์ได้ดี บั๊กจึงอยู่ที่การจัดการเหตุการณ์ของแอป
- ตรวจว่าช่องป้อนข้อมูลมีโฟกัสทันทีก่อนสแกนในเวิร์กโฟลว์จริงหรือไม่ (ไม่ใช่แค่ตอนคุณคลิกเองระหว่างทดสอบ)
- เปิดคอนโซล DevTools ของเบราว์เซอร์แล้วหาข้อผิดพลาด JavaScript ที่ถูกโยนระหว่างสแกน ข้อผิดพลาดกลางตัวจัดการอาจหยุดประมวลผลการกดแป้นถัดไปอย่างเงียบ ๆ
- ถอดมาสก์อินพุต การตรวจสอบ หรือตรรกะ debounce ชั่วคราวแล้วทดสอบใหม่เพื่อแยกชั้นที่ทิ้งอินพุต
- ตรวจว่าแอปฟัง
keypress(เลิกใช้แล้วและไม่น่าเชื่อถือกับบางแป้น) แทนkeydown/keyupหรือไม่
วิธีแก้
- ให้ช่องเป้าหมายได้รับโฟกัสจากโปรแกรมทุกครั้งที่เวิร์กโฟลว์คาดว่าจะมีการสแกน (เช่น ทันทีหลังเพิ่มรายการ)
- แทนที่ตัวฟัง
keypressด้วยkeydown/keyupเพราะkeypressเลิกใช้แล้วและจัดการบางแป้นไม่สม่ำเสมอ - ตรวจการเรียก
preventDefault()ในตัวจัดการแป้นพิมพ์ว่าไม่บล็อกแป้นอักขระที่ถูกต้อง - ผ่อนมาสก์และการตรวจสอบให้รับช่วงอักขระเต็มที่สัญลักษณ์บาร์โค้ดของคุณสร้างได้ แล้วตรวจสอบค่าที่ประกอบแล้วแทนการกดแป้นทีละครั้ง
- จับคู่ส่วนต่อท้ายของเครื่องสแกนกับที่ฟอร์มคาดไว้ (ดู ส่วนต่อท้าย ENTER และ TAB)