vue-scan-code
Version:
a code scanning plug-in for vue
123 lines (117 loc) • 3.88 kB
JavaScript
const eventSimple = require('event-simple')
var _Vue
function Scan () {
this.pointer = ''
this.pointerQueue = []
this.code = ''
this.nextCode = ''
this.lastCode = ''
this.name = 'scan'
this.eventName = 'scancode'
this.codeMinLength = 5
this.wait = 30
this.timer = null
this.handler = {}
this.initScanCode = function (callback, vueExp) {
if (typeof callback === 'function') {
if ((vueExp._uid || vueExp._uid === 0) && !this.handler[this.name + vueExp._uid]) {
var bool = this.pointerQueue.some(function (point) { return point == vueExp._uid })
!bool && this.pointerQueue.push([vueExp._uid])
this.handler[this.name + vueExp._uid] = callback
} else if (this.handler[this.name + vueExp._uid]) {
this.handler[this.name + vueExp._uid] = callback
} else {
console.error('error: ~~~')
}
} else {
console.error('the callback is only function')
}
this.pointer = vueExp._uid
}
this.offScanCode = function (that) {
if (that instanceof _Vue) {
const pointerIndex = this.pointerQueue.findIndex(function (p) { return p == this._uid })
if (pointerIndex > -1) {
this.pointerQueue.splice(pointerIndex, -1)
delete this.handler[this.name + this._uid]
}
this.pointer = ''
} else {
console.error('current Example not a vue example')
}
}
this.bindScanCode = function (that, callback) {
if (that instanceof _Vue) {
if (typeof callback == 'function') {
this.initScanCode(callback, that)
}
} else {
console.error('current Example not a vue example')
}
}
this.outputScanCode = function (code) {
if (this.pointer && this.handler[this.name + this.pointer]) {
this.handler[this.name + this.pointer](code)
}
this.clearCache()
}
this.getPrototypeName = function () {
return '$' + this.name
}
this.clearCache = function () {
this.nextCode = ''
this.lastCode = ''
this.code = ''
}
}
Scan.prototype.init = function (options) {
options && options.scanName && (this.name = options.scanName)
options && options.scanWait && (this.wait = options.scanWait)
options && options.scanCodeMinLength && (this.codeMinLength = options.scanCodeMinLength)
var lastTime, nextTime, lastCode, nextCode
var self = this
window.addEventListener('keypress', function (e) {
nextCode = e.which
nextTime = new Date().getTime()
if (lastCode && lastTime && nextTime - lastTime <= self.wait) {
if (lastCode) {
self.lastCode += String.fromCharCode(lastCode)
} else {
self.lastCode += ''
}
if (nextCode) {
self.nextCode += String.fromCharCode(nextCode)
} else {
self.nextCode += ''
}
eventSimple.emit(self.eventName, self.nextCode, self.lastCode)
} else if (lastCode && lastTime && nextTime - lastTime > 100) {
self.code = ''
}
lastCode = nextCode
lastTime = nextTime
})
eventSimple.on(self.eventName, function (nextCode, lastCode) {
clearTimeout(self.timer)
self.timer = setTimeout(function () {
if (nextCode.length >= self.codeMinLength && lastCode.length >= self.codeMinLength) {
self.code = lastCode + nextCode.slice(lastCode.length - 1)
self.outputScanCode(self.code)
} else {
console.error('current barcode length less than the options scanCodeMinLength')
self.clearCache()
}
}, self.wait)
})
}
export default {
install: function (Vue, options) {
// eslint-disable-next-line no-undef
if (_Vue === Vue) { return }
_Vue = Vue
const sc = new Scan()
window.scan = sc
sc.init(options || {})
Vue.prototype[sc.getPrototypeName()] = sc
}
}