html,js实现九宫格解锁bug求大佬给看看

k906559098 2017-03-27 04:05:13
<!DOCTYPE html>
<html>

<head lang="zh-CN">
<meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0" name="viewport" />
<meta charset="UTF-8">
<title>html5实现网页解锁功能(基于iphone6)</title>
<style type="text/css">
html,
body {
margin: 0;
padding: 0;
width: 380px;
height: 600px;
}

#set {
margin-left: 120px;
}

#test {
margin-top: 20px;
margin-left: 120px;
}
</style>
<script type="text/javascript">
/**
* 半径,画布宽度,画布高度,画布x内边距,画布y内边距
*/
var R = 26,
canvasWidth = 400,
canvasHeight = 320,
OffsetX = 30,
OffsetY = 30;
var circleArr = [];
var theSecondResult = [];
var aa = [];
var bb = [];
var n = 1;


function createCirclePoint(diffX, diffY) {
for (var row = 0; row < 3; row++) {
for (var col = 0; col < 3; col++) {
// 计算圆心坐标
var Point = {
X: (OffsetX + col * diffX + (col * 2 + 1) * R),
Y: (OffsetY + row * diffY + (row * 2 + 1) * R)
};
circleArr.push(Point);
}
}
}
window.onload = function() {
var canvas = document.getElementById("lockCanvas");
canvasWidth = document.body.offsetWidth; //网页可见区域宽
canvas.width = canvasWidth;
canvas.height = canvasHeight;
var cxt = canvas.getContext("2d");
/**
* 一行3个~
* OffsetX为canvas x方向内边距
* */
var X = (canvasWidth - 2 * OffsetX - R * 2 * 3) / 2;
var Y = (canvasHeight - 2 * OffsetY - R * 2 * 3) / 2;

createCirclePoint(X, Y);

bindEvent(canvas, cxt);
//CW=2*offsetX+R*2*3+2*X


Draw(cxt, circleArr, [], null);



}

function Draw(cxt, circleArr, pwdArr, touchPoint) {
if (pwdArr.length > 0) {
cxt.beginPath();
for (var i = 0; i < pwdArr.length; i++) {
var pointIndex = pwdArr[i];
cxt.lineTo(circleArr[pointIndex].X, circleArr[pointIndex].Y);
}
cxt.lineWidth = 10;
cxt.strokeStyle = "#627eed";
cxt.stroke();
cxt.closePath();
if (touchPoint != null) {
var lastPointIndex = pwdArr[pwdArr.length - 1];
var lastPoint = circleArr[lastPointIndex];
cxt.beginPath();
cxt.moveTo(lastPoint.X, lastPoint.Y);
cxt.lineTo(touchPoint.X, touchPoint.Y);
cxt.stroke();
cxt.closePath();
}
}
for (var i = 0; i < circleArr.length; i++) {
var Point = circleArr[i];
cxt.fillStyle = "#627eed";
cxt.beginPath();
cxt.arc(Point.X, Point.Y, R, 0, Math.PI * 2, true);
cxt.closePath();
cxt.fill();
cxt.fillStyle = "#ffffff";
cxt.beginPath();
cxt.arc(Point.X, Point.Y, R - 3, 0, Math.PI * 2, true);
cxt.closePath();
cxt.fill();
if (pwdArr.indexOf(i) >= 0) {
cxt.fillStyle = "#627eed";
cxt.beginPath();
cxt.arc(Point.X, Point.Y, R - 16, 0, Math.PI * 2, true);
cxt.closePath();
cxt.fill();
}

}
}

/**
* 计算选中的密码用来保存以及判定
*/
function getSelectPwd(touches, pwdArr) {
for (var i = 0; i < circleArr.length; i++) {
var currentPoint = circleArr[i];
var xdiff = Math.abs(currentPoint.X - touches.pageX);
var ydiff = Math.abs(currentPoint.Y - touches.pageY);
var dir = Math.pow((xdiff * xdiff + ydiff * ydiff), 0.5);
if (dir > R || pwdArr.indexOf(i) >= 0)
continue;
pwdArr.push(i);
return pwdArr;
break;
}
}

/**
* 绑定功能选择以及主要功能
*/
function bindEvent(canvas, cxt) {
var pwdArr = [];
canvas.addEventListener("touchstart", function(e) {
getSelectPwd(e.touches[0], pwdArr);
}, false);
canvas.addEventListener("touchmove", function(e) {
e.preventDefault();
var touches = e.touches[0];
getSelectPwd(touches, pwdArr);
cxt.clearRect(0, 0, canvasWidth, canvasHeight);
Draw(cxt, circleArr, pwdArr, {
X: touches.pageX,
Y: touches.pageY
});
}, false);
canvas.addEventListener("touchend", function(e) {
cxt.clearRect(0, 0, canvasWidth, canvasHeight);
Draw(cxt, circleArr, pwdArr, null);
var theResult = pwdArr.join("->");



// alert("密码结果是:" + theResult);

if (document.getElementById("set").checked === true) { //选择功能为设置密码
if (pwdArr.length < 5) { //判断密码长度
alert("密码过短,请重新输入");
pwdArr = [];
} else {
localStorage.thePassword = theResult;
bb = theResult;
//次数
alert("设置的密码为:" + localStorage.thePassword);
alert("请再次输入密码");

n++;
}
}
secondbindEvent(canvas, cxt);
}, false);
if (document.getElementById("test").checked === true) { //选择功能为验证密码
alert("请测试");
if (pwdArr == localStorage.thePassword) {


}
}
return n;

}

function secondbindEvent(canvas, cxt) {
var pwdArr1 = [];
canvas.addEventListener("touchstart", function(e) {
getSelectPwd(e.touches[0], pwdArr1);
}, false);
canvas.addEventListener("touchmove", function(e) {
e.preventDefault();
var touches = e.touches[0];
getSelectPwd(touches, pwdArr1);
cxt.clearRect(0, 0, canvasWidth, canvasHeight);
Draw(cxt, circleArr, pwdArr1, {
X: touches.pageX,
Y: touches.pageY
});
}, false);
canvas.addEventListener("touchend", function(e) {
cxt.clearRect(0, 0, canvasWidth, canvasHeight);
Draw(cxt, circleArr, pwdArr1, null);
var theResult1 = pwdArr1.join("->");
alert("2222");
aa = theResult1;
localStorage.theSecond = aa;
if (n >= 2) {

if (localStorage.theSecond = bb) {
alert("设置成功!");
n = 0;
} else if (localStorage.theSecond != bb) {
alert("两次输入密码不一致!");
}
}
}, false);


}
</script>
</head>

<body>
<canvas id="lockCanvas"></canvas>
<form action="" method="get">
<label>
<input name="password" id="set" type="radio" value="1" checked="checked" />设 置 密 码</br>
</label>
<label>
<input name="password" id="test" type="radio" value="2" />验 证 密 码</label>
</form>
</body>

</html>


想实现一个九宫格解锁,首先设置输入一次后计算的pwdArr值保存到localstorage用来验证解锁,然后二次输入验证,但是要清空画布,此刻清空画布后又会跳到第一步,因为这些都是绑定在画布事件touchend上的,我就想再次建立一个事件用于获取二次输入值,但是怎么都实现不了,请大神帮我看看,怎么实现将二次输入的值保存然后和第一次输入的值比较保存!万分感谢
...全文
287 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
k906559098 2017-03-27
  • 打赏
  • 举报
回复
自己解决了~谢谢大家
k906559098 2017-03-27
  • 打赏
  • 举报
回复
求大佬啊啊啊比较急啊
k906559098 2017-03-27
  • 打赏
  • 举报
回复
引用 4 楼 Free_Wind22 的回复:
把获取用户输入用一个函数来处理,得到值后用回调函数传出去,再作后续判断
0.0怎么用函数获取啊,我是直接touchend传出来的pwsArr,然后保存在localStroage里面了,现在愁的是没办法进行二次获取, pwdArr=[]之后就会重新执行第一个循环
2017-03-27
  • 打赏
  • 举报
回复
把获取用户输入用一个函数来处理,得到值后用回调函数传出去,再作后续判断
k906559098 2017-03-27
  • 打赏
  • 举报
回复
引用 2 楼 functionsub 的回复:
。。。钻牛角尖了。 没必要加第二个事件,你已经有个n来标示是第几次输入了,在touchend的方法里,你判断下如果是第二次,直接从localStorage里取出值跟pwdArr进行比较不就是了?
主要是现在没法进行第二次输入啊,我也想取出第二次的值~但是会不断循环请再次输入密码
functionsub 2017-03-27
  • 打赏
  • 举报
回复
。。。钻牛角尖了。 没必要加第二个事件,你已经有个n来标示是第几次输入了,在touchend的方法里,你判断下如果是第二次,直接从localStorage里取出值跟pwdArr进行比较不就是了?
k906559098 2017-03-27
  • 打赏
  • 举报
回复
= = 没人么 急急急急急急
内容概要:本文围绕“阶梯碳下考虑P2G-CCS与供需灵活响应的IES优化调度”展开,基于Matlab平台构建综合能源系统(IES)在阶梯式碳交易机制下的优化调度模型。研究深度融合电制气(P2G)与碳捕集、利用与封存(CCS)技术,结合需侧灵活响应机制,旨在提升系统的低碳运行能力与经济性。通过建立多能流耦合的优化模型,协调电力、天然气、热力等多种能源形式的协同调度,有效降低系统碳排放强度,并借助YALIMIP工具包调用解器进行高效解。文档提供了完整的代码实现、模型构建流程与结果分析方法,涵盖从问题建模到仿真实现的全过程,具备较强的可复现性与科研参考价值。; 适合人群:具备电力系统、能源系统或优化建模相关背景的研究生、高校教师及工程技术人员,尤其适合从事综合能源系统、碳减排策略、P2G与CCS技术集成研究的专业人员,需熟练掌握Matlab编程与基本的数学规划知识。; 使用场景及目标:①用于研究阶梯式碳交易政策下综合能源系统的低碳经济调度策略;②支撑P2G-CCS技术与需响应机制在IES中的仿真集成与性能评估;③作为撰写高水平学术论文(如EI/SCI收录)的技术基础与复现资源,推动碳中和背景下能源系统优化方向的创新研究。; 阅读建议:建议结合百度网盘提供的完整代码与资料包,按照模块逐步调试程序,重点理解目标函数的设计逻辑、碳交易成本的建模方式、约束条件的数学表达及解器的配置方法,同时关注多能耦合设备的建模细节,配合公众号“荔枝科研社”获取持续的技术支持与案例拓展。
内容概要:本文系统研究了基于卷积神经网络(CNN)与支持向量机(SVM)融合的CNN-SVM混合模型在数据分类预测中的应用,尤其聚焦于工业故障识别领域。通过Matlab平台实现,该方法首先利用CNN强大的多层次特征提取能力对原始输入数据进行深度特征学习,自动捕获关键局部模式与空间结构信息,随后将提取的高层特征作为输入传递至SVM分类器,借助SVM在高维空间中小样本条件下卓越的分类性能与泛化能力完成最终判别任务。文中详尽阐述了模型的整体架构设计、网络参数配置、训练优化流程及特征迁移机制,充分结合了深度学习在特征表达上的优势与传统机器学习在分类决策上的稳健性。实验部分通过实际故障数据集验证了该混合模型相较于单一CNN或SVM模型在分类准确率、鲁棒性和抗过拟合能力方面的显著提升,证明了其在复杂故障诊断任务中的有效性与先进性; 适合人群:具备一定机器学习与深度学习理论基础,熟悉Matlab编程环境,从事故障诊断、模式识别、智能制造、电力系统监控或工业数据分析等相关领域的研究生、科研人员及工程技术开发者; 使用场景及目标:① 应用于旋转机械、电力设备、航空航天等领域的多类别故障识别与状态监测;② 掌握深度特征提取与传统分类器融合的技术路径,提升小样本、高噪声环境下数据分类的精度与可靠性;③ 为撰写高水平学术论文、开展科研项目或工程实践提供可复现的算法框架与完整代码支持; 阅读建议:读者应深入理解CNN与SVM的协同工作机制,重点分析特征提取层与分类层之间的接口设计,建议动手运行并调试所提供的Matlab代码,尝试在不同数据集上进行迁移实验与参数调优,以全面掌握该混合模型的应用技巧与优化策略。

87,990

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧