(function(){ window.H5lock = function(obj){ this.chooseType = Number(PublicLib.getCookieInfo('chooseType')) || obj.chooseType; this.linwidth = obj.linwidth this.successcolor = obj.successcolor this.successbgcolor = obj.successbgcolor this.wariningcolor = obj.wariningcolor this.wariningbgcolor = obj.wariningbgcolor this.initcolor = obj.initcolor this.inr = obj.inr this.outr = obj.outr this.initr = obj.initr this.isinput = obj.isinput this.range = obj.range }; H5lock.prototype.drawCle = function(x, y,) { // 初始化解锁密码面板 this.drawStatusPoint(this.successcolor) this.ctx.fillStyle = this.initcolor; this.ctx.beginPath(); this.ctx.arc(x, y, this.initr * window.devicePixelRatio, 0, Math.PI * 2, true); this.ctx.closePath(); this.ctx.fill(); } H5lock.prototype.drawPoint = function(color,colorout) { // 初始化外环 for (var i = 0 ; i < this.lastPoint.length ; i++) { this.ctx.fillStyle = colorout; this.ctx.beginPath(); this.ctx.arc(this.lastPoint[i].x, this.lastPoint[i].y, this.outr * window.devicePixelRatio, 0, Math.PI * 2, false); this.ctx.closePath(); this.ctx.fill(); this.ctx.fillStyle = color; this.ctx.beginPath(); this.ctx.arc(this.lastPoint[i].x, this.lastPoint[i].y, this.inr * window.devicePixelRatio, 0, Math.PI * 2, true); this.ctx.closePath(); this.ctx.fill(); } } H5lock.prototype.drawStatusPoint = function(type) { // 初始化状态线条 for (var i = 0 ; i < this.lastPoint.length ; i++) { this.ctx.strokeStyle = type; this.ctx.beginPath(); this.ctx.closePath(); // 这是内环外边框 // this.ctx.arc(this.lastPoint[i].x - 10, this.lastPoint[i].y, 0, Math.PI * 2, true); // this.ctx.stroke(); } } H5lock.prototype.drawLine = function(po,color) {// 解锁轨迹 this.ctx.beginPath(); this.ctx.lineWidth = this.linwidth * window.devicePixelRatio; this.ctx.strokeStyle = color this.ctx.moveTo(this.lastPoint[0].x, this.lastPoint[0].y); for (var i = 1 ; i < this.lastPoint.length ; i++) { this.ctx.lineTo(this.lastPoint[i].x, this.lastPoint[i].y); } this.ctx.lineTo(po.x, po.y); this.ctx.stroke(); this.ctx.closePath(); } H5lock.prototype.createCircle = function() {// 创建解锁点的坐标,根据canvas的大小来平均分配半径 var n = this.chooseType; var count = 0; this.r = this.ctx.canvas.width / (2 + 7.5 * n);// 公式计算 var r = this.r; for (var i = 0 ; i < n ; i++) { for (var j = 0 ; j < n ; j++) { count++; var obj = { x: j * 8 * r + 4 * r, y: i * 8 * r + 4 * r, index: count }; this.arr.push(obj); this.restPoint.push(obj); } } this.ctx.clearRect(0, 0, this.ctx.canvas.width, this.ctx.canvas.height); for (var i = 0 ; i < this.arr.length ; i++) { this.drawCle(this.arr[i].x, this.arr[i].y); } //return arr; } H5lock.prototype.getPosition = function(e) {// 获取touch点相对于canvas的坐标 var rect = e.currentTarget.getBoundingClientRect(); var po = { x: (e.touches[0].clientX - rect.left) * window.devicePixelRatio, y: (e.touches[0].clientY - rect.top) * window.devicePixelRatio }; return po; } H5lock.prototype.update = function(po) {// 核心变换方法在touchmove时候调用 this.ctx.clearRect(0, 0, this.ctx.canvas.width, this.ctx.canvas.height); for (var i = 0 ; i < this.arr.length ; i++) { // 每帧先把面板画出来 this.drawCle(this.arr[i].x, this.arr[i].y); } this.drawPoint(this.successcolor,this.successbgcolor);// 每帧画轨迹 this.drawLine(po ,this.successcolor);// 每帧画圆心 console.log(window.devicePixelRatio) for (var i = 0 ; i < this.restPoint.length ; i++) { if (Math.abs(po.x - this.restPoint[i].x) < this.range * window.devicePixelRatio && Math.abs(po.y - this.restPoint[i].y) < this.range * window.devicePixelRatio) { this.lastPoint.push(this.restPoint[i]); this.restPoint.splice(i, 1); break; } } } H5lock.prototype.checkPass = function(psw1, psw2) {// 检测密码 var p1 = '', p2 = ''; for (var i = 0 ; i < psw1.length ; i++) { p1 += psw1[i].index + psw1[i].index; } for (var i = 0 ; i < psw2.length ; i++) { p2 += psw2[i].index + psw2[i].index; } return p1 === p2; } H5lock.prototype.storePass = function(psw) {// touchend结束之后对密码和状态的处理 const password = [] psw.forEach(item=>{ password.push(item.index) }) console.log(password) if (this.pswObj.step == 1) { if (this.checkPass(this.pswObj.fpassword, psw)) { this.ctx.clearRect(0, 0, this.ctx.canvas.width, this.ctx.canvas.height); for (var i = 0 ; i < this.arr.length ; i++) { // 每帧先把面板画出来 this.drawCle(this.arr[i].x, this.arr[i].y); } this.drawPoint(this.successcolor,this.successbgcolor) this.drawLine( this.lastPoint,this.successcolor);// 每帧画圆心 this.pswObj.step = 2; this.pswObj.spassword = psw; document.getElementById('title').innerHTML = '密码设置成功'; // 跳转至主页面 if(this.isinput) { setTimeout(() => { document.getElementById('inputpassword').click() }, 500); } else { // NEXTTODO setTimeout(() => { document.getElementById('comeback').click() }, 500); } PublicLib.putCookieInfo('passwordxx', JSON.stringify(this.pswObj.spassword)); PublicLib.putCookieInfo('chooseType', this.chooseType); PublicLib.putCookieInfo('step', 2); } else { this.ctx.clearRect(0, 0, this.ctx.canvas.width, this.ctx.canvas.height); for (var i = 0 ; i < this.arr.length ; i++) { // 每帧先把面板画出来 this.drawCle(this.arr[i].x, this.arr[i].y); } document.getElementById('title').innerHTML = '两次不一致,重新输入'; // this.drawStatusPoint('#FF574D'); this.drawPoint(this.wariningcolor,this.wariningbgcolor) this.drawLine( this.lastPoint,this.wariningcolor);// 每帧画圆心 delete this.pswObj.step; } } else if (this.pswObj.step == 2) { if (this.checkPass(this.pswObj.spassword, psw)) { this.ctx.clearRect(0, 0, this.ctx.canvas.width, this.ctx.canvas.height); for (var i = 0 ; i < this.arr.length ; i++) { // 每帧先把面板画出来 this.drawCle(this.arr[i].x, this.arr[i].y); } this.drawPoint(this.successcolor,this.successbgcolor) this.drawLine( this.lastPoint,this.successcolor);// 每帧画圆心 document.getElementById('title').innerHTML = '解锁成功'; setTimeout(() => { document.getElementById('goon').click() }, 500); } else { this.ctx.clearRect(0, 0, this.ctx.canvas.width, this.ctx.canvas.height); for (var i = 0 ; i < this.arr.length ; i++) { // 每帧先把面板画出来 this.drawCle(this.arr[i].x, this.arr[i].y); } this.drawPoint(this.wariningcolor,this.wariningbgcolor) this.drawLine( this.lastPoint,this.wariningcolor);// 每帧画圆心 document.getElementById('title').innerHTML = '解锁失败,请重新尝试'; } } else { this.ctx.clearRect(0, 0, this.ctx.canvas.width, this.ctx.canvas.height); for (var i = 0 ; i < this.arr.length ; i++) { // 每帧先把面板画出来 this.drawCle(this.arr[i].x, this.arr[i].y); } if(psw.length < 4) { this.drawPoint(this.wariningcolor,this.wariningbgcolor) this.drawLine( this.lastPoint,this.wariningcolor);// 每帧画圆心 document.getElementById('title').innerHTML = '密码长度不够,请重新输入'; return; } this.drawPoint(this.successcolor,this.successbgcolor) this.drawLine( this.lastPoint,this.successcolor);// 每帧画圆心 this.pswObj.step = 1; this.pswObj.fpassword = psw; document.getElementById('title').innerHTML = '再次输入'; } } H5lock.prototype.makeState = function() { } H5lock.prototype.setChooseType = function(type){ chooseType = type; init(); } H5lock.prototype.updatePassword = function(){ PublicLib.putCookieInfo('passwordxx',''); PublicLib.putCookieInfo('chooseType',''); PublicLib.putCookieInfo('step',''); this.pswObj = {}; document.getElementById('title').innerHTML = '为了保护您的隐私,请设置登录手势密码吧!'; this.reset(); } H5lock.prototype.initDom = function(){ var wrap = document.createElement('div'); if(PublicLib.getCookieInfo('step') === '2') { var str = '