使用HTML Element模拟数字(验证码)
作者:翅膀的初衷 来源:本站原创 发布时间:2014-08-12 查看数:47536
有一次在某网站注册的时候,很惊奇的发现它的验证码不是我们常见的动态图片,而是通过HTML Element摸拟出来的。
于是在某天无聊的时候,自己也用JS来模拟来实现了一下。
因为考虑简单,这里只实现了纯数字展示,没有考虑字母。而数字的实现可以参考常用的一些显示屏,比如以前的那种电子表,只需要3x5个格子就可以完美展现0-9个数字。为了方便操作,我们可以把0-9的各个显示情况定义一个多维数组,比如0是:
[
[1, 1, 1],
[1, 0, 1],
[1, 0, 1],
[1, 0, 1],
[1, 1, 1]
]
然后我们再按照这个数组的情况,0填充白色元素,1填充黑色元素即可。
我们来看看具体的代码:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>无标题页</title>
<script src="http://www.jiniannet.com/resources/Script/JQuery.js"></script>
</head>
<body>
<script type="text/javascript">
$(function () {
createCode("2431", 5)
})
$("td").click(function () {
$(this).addClass("black");
});
function createCode(code, size) {
var html = '<table><tr>';
for (var i = 0; i < code.length; i++) {
html += '<td width=' + (size * 4) + '>';
html += createElement(code.charAt(i), size);
html += '</td>'
}
html += '</tr></table>';
var div = document.createElement('div');
div.innerHTML = html;
document.body.appendChild(div);
}
function createElement(n, size) {
var node = __list[parseInt(n)];
var html = '<table style="border:none; border-collapse:collapse; empty-cells:show;"><tr><td></td><td></td><td></td><td></td></tr>';
for (var i = 0; i < node.length; i++) {
html += '<tr>';
for (var j = 0; j < node[i].length; j++) {
if (node[i][j]) {
html += '<td style="background-color:#000;"></td>';
} else {
html += '<td></td>';
}
}
html += '<td></td></tr>';
}
html += '<tr><td></td><td></td><td></td><td></td></tr></table>';
var r = document.createElement("div");
r.innerHTML = html;
var list = r.getElementsByTagName("td");
for (var i = 0; i < list.length; i++) {
list[i].style.width = size + "px";
list[i].style.height = size + "px";
list[i].style.border = "solid 1px #fff";
}
return r.innerHTML;
}
var __list = [
[
[1, 1, 1],
[1, 0, 1],
[1, 0, 1],
[1, 0, 1],
[1, 1, 1]
],
[
[0, 1, 0],
[1, 1, 0],
[0, 1, 0],
[0, 1, 0],
[1, 1, 1]
],
[
[1, 1, 1],
[0, 0, 1],
[1, 1, 1],
[1, 0, 0],
[1, 1, 1]
],
[
[1, 1, 1],
[0, 0, 1],
[1, 1, 1],
[0, 0, 1],
[1, 1, 1]
],
[
[1, 0, 1],
[1, 0, 1],
[1, 1, 1],
[0, 0, 1],
[0, 0, 1]
],
[
[1, 1, 1],
[1, 0, 0],
[1, 1, 1],
[0, 0, 1],
[1, 1, 1]
],
[
[1, 1, 1],
[1, 0, 0],
[1, 1, 1],
[1, 0, 1],
[1, 1, 1]
],
[
[1, 1, 1],
[0, 0, 1],
[0, 0, 1],
[0, 0, 1],
[0, 0, 1]
],
[
[1, 1, 1],
[1, 0, 1],
[1, 1, 1],
[1, 0, 1],
[1, 1, 1]
],
[
[1, 1, 1],
[1, 0, 1],
[1, 1, 1],
[0, 0, 1],
[1, 1, 1]
]
]
</script>
</body>
</html>
把以上内容复制下来,保存为一个HTML文件,双击运行,就可以看到如下结果:
看起来效果是不是不错,我们调用createCode("2431", 5)方法就可以模拟出结果来,第一个参数是显示的数字,第二个是显示大小。
在这里提醒大家的是,这些代码是不能真正用于验证码的,如果想用于真正的验证码, 必须将生成元素这一步交给后台语言去做,而且黑色格子不能全部为纯黑色,必须在某一个范围内变动最佳,而且元素最好不要用TD,因为TD太有规律了,很好用JS识别。