1 /*验证码*/
function KinerCode(options) {
this.opt = this.extend(true, this.options, options);
this.opt.chars = (this.opt.chars && this.opt.chars.length == 0) ? this.options.chars : this.opt.chars;
//背景图优先级最高,用户指定背景颜色优先级次之,随机背景颜色优先级最低
this.opt.bg = (this.opt.bgImg && this.opt.bgImg.length != 0) ? "url('" + this.opt.bgImg + "')" : this.options.bgColor;
//当验证码是算术题形式时,先计算出算式的结果并保存与answer数组中
if(this.opt.question){
this.answer = [];
for(var i=0;i<this.opt.chars.length;i++){
this.answer.push(eval(this.opt.chars[i]));
}
}
//插件初始化
this.init();
//绑定事件
this.bind();
} /*初始化,创建验证码元素*/
KinerCode.prototype.init = function () {
var self = this;
if(!this.body){
this.body = document.createElement('div');
}else{
this.body.innerHTML = '';
}
//当用户选择禁止复制验证码中文字时执行,禁用验证码区域及验证码输入框的复制、选中、右键菜单等操作
if (!self.copy) {
doProhibit();
}
//创建验证码
this.myCode = this.createCode();
//console.log(this.myCode);
//创建验证码项元素并添加进其盒子中
var len = this.myCode.arrCode.length;
for (var i = 0; i < len; i++) {
var item = this.createCodeEle(this.myCode.arrCode[i]);
this.body.appendChild(item);
}
//为验证码盒子设置样式
this.body.style.background = this.opt.randomBg ? this.toRGB().background : this.opt.bg;
this.body.style.backgroundPosition = 'center';
this.body.style.backgroundSize = 'cover';
this.body.style.overflow = 'hidden';
this.body.style.width = '100%';
this.body.style.height = '100%';
this.body.style.lineHeight = '100%';
this.body.style.cursor = 'pointer';
//alert(this.createCode().strCode);
//禁止复制
function doProhibit() {
if (window.Event)
document.captureEvents(Event.MOUSEUP);
function nocontextmenu() {
event.cancelBubble = true;
event.returnvalue = false;
return false;
}
function norightclick(e) {
if (window.Event) {
if (e.which == 2 || e.which == 3)
return false;
}
else if (event.button == 2 || event.button == 3) {
event.cancelBubble = true
event.returnvalue = false;
return false;
}
}
function select() {
return false;
}
self.body.oncontextmenu = nocontextmenu;
self.body.onmousedown = norightclick;
self.body.onselectionstart = select;
self.body.oncopy = function () {
return false;
};
self.body.oncut = function () {
return false;
};
self.opt.inputArea.style.imeMode = 'disabled';
self.opt.inputArea.onpaste = function () {
return false;
};
self.opt.inputArea.oncontextmenu = nocontextmenu;
self.opt.inputArea.onmousedown = norightclick;
self.opt.inputArea.onselectionstart = select;
setSelectable(self.body, false);
}
this.opt.codeArea.appendChild(this.body);
// 参数 obj: 要禁止选中文本的元素的jquery对象
// 参数 enabled: true, 可选中; false, 不可选中
function setSelectable(obj, enabled) {
if (enabled) {
obj.removeAttribute("unselectable");
obj.removeAttribute("onselectstart");
obj.style["-moz-user-select"] = '';
obj.style["-webkit-user-select"] = "";
} else {
obj.setAttribute("unselectable", "on");
obj.setAttribute("onselectstart", "return false;");
obj.style["-moz-user-select"] = 'none';
obj.style["-webkit-user-select"] = "none";
}
}
}; /* 刷新验证码操作 */
KinerCode.prototype.refresh = function () {
this.init();
}; /*绑定事件*/
KinerCode.prototype.bind = function () {
var self = this;
//刷新验证码
if (self.opt.click2refresh) {
self.bindHandler(self.body,'click',function(){
self.refresh();
});
}
/* 绑定验证回调函数*/
self.bindHandler(self.opt.inputArea,self.opt.validateEven,function(){
self.opt.validateFn.call(self,self.validate(),self.myCode);
if(self.opt.false2refresh && !self.validate()){
self.refresh();
self.opt.inputArea.focus();
self.opt.inputArea.select();
}
});
}; /* 绑定事件方法*/
KinerCode.prototype.bindHandler = function(elem, type, handler) {
if (window.addEventListener) {// 标准浏览器
elem.addEventListener(type, handler, false);
} else if (window.attachEvent) {// IE浏览器
elem.attachEvent("on" + type, handler);
}
}; /*验证输入是否正确 */
KinerCode.prototype.validate = function(){
if(!this.opt.question)
return this.myCode.strCode.toLowerCase().trim()==this.opt.inputArea.value.toLowerCase().trim();
else
return parseFloat(this.myCode.answer) === parseFloat(this.opt.inputArea.value.trim());
}; /*根据传进来的验证码项创建元素*/
KinerCode.prototype.createCodeEle = function (code) {
var item = document.createElement('span');
item.innerHTML = code;
item.style.color = this.toRGB().color;
item.style.textAlign = 'center';
item.style.height = '100%';
item.style.lineHeight = this.opt.codeArea.offsetHeight + 'px';
//item.style.margin = '0 2%';
if(!this.opt.question){
item.style.width = 90 / this.opt.len + '%';
}else{
item.style.width = '100%';
}
item.style.padding = '0 1%';
item.style.fontSize = '1.5em';
item.style.display = 'inline-block';
return item;
}; /*产生随机颜色的函数,可以产生随机的背景色和前景色(也就是字体的颜色)*/
KinerCode.prototype.toRGB = function () {
var str = "", str2 = "";
var num = [], strs2 = [], strs = [];
var i = 0;
for (i = 0; i < 3; i++) {
num.push(parseInt(Math.random() * 255));
}
for (i = 0; i < num.length; i++) {
strs.push(num[i].toString(16));
strs2.push((255 - num[i]).toString(16))
}
for (i = 0; i < strs.length; i++) {
str += strs[i];
str2 += strs2[i];
}
var rgb = {
background: '#' + str,
color: '#' + str2
};
return rgb;
}; /*根据验证码类型及长度创建验证码*/
KinerCode.prototype.createCode = function () {
var str = "";
var codes = [];
var char;
var self = this;
var answer = '';
if(this.opt.question){
var c = parseInt(Math.random() * self.opt.chars.length);
char = self.opt.chars[c];
str = char;
answer = this.answer[c];
codes.push(char);
}else{
for (var i = 0; i < self.opt.len; i++) {
var c = parseInt(Math.random() * self.opt.chars.length);
char = self.opt.chars[c];
str += char;
codes.push(char);
}
}
return this.myCode = {
strCode: str,
arrCode: codes,
answer : answer
};
}; /* 默认选项 */
KinerCode.prototype.options = {
len: 4,//需要产生的验证码长度
chars: [
1, 2, 3, 4, 5, 6, 7, 8, 9, 0,
'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'
],//指定产生验证码的词典,若不给或数组长度为0则试用默认字典
copy: false,//是否允许复制产生的验证码
//bgColor: "#222222",//背景颜色[与背景图任选其一设置]
bgImg: "",
randomBg: true,//若选true则采用随机背景颜色,此时设置的bgImg和bgColor将失效
inputArea: "",//输入验证码的input对象绑定【 HTMLInputElement 】
codeArea: "",//验证码放置的区域【 HTMLDivElement 】
click2refresh: true,//是否点击验证码刷新验证码
validateEven : "",//触发验证的方法名,如click,blur等
validateFn : function(result,strCode){}
}; /* 扩展对象方法*/
KinerCode.prototype.extend = function (flag, destination, source) {
if (flag) {
var obj = {};
for (var property in destination) {
obj[property] = destination[property];
}
for (var property in source) {
obj[property] = source[property];
}
return obj;
} else {
for (var property in source)
destination[property] = source[property];
return destination;
}
};

KinerCode.js的更多相关文章

  1. Vue.js 和 MVVM 小细节

    MVVM 是Model-View-ViewModel 的缩写,它是一种基于前端开发的架构模式,其核心是提供对View 和 ViewModel 的双向数据绑定,这使得ViewModel 的状态改变可以自 ...

  2. js学习笔记:操作iframe

    iframe可以说是比较老得话题了,而且网上也基本上在说少用iframe,其原因大致为:堵塞页面加载.安全问题.兼容性问题.搜索引擎抓取不到等等,不过相对于这些缺点,iframe的优点更牛,跨域请求. ...

  3. js学习笔记:webpack基础入门(一)

    之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...

  4. JS调用Android、Ios原生控件

    在上一篇博客中已经和大家聊了,关于JS与Android.Ios原生控件之间相互通信的详细代码实现,今天我们一起聊一下JS调用Android.Ios通信的相同点和不同点,以便帮助我们在进行混合式开发时, ...

  5. jquery和Js的区别和基础操作

    jqery的语法和js的语法一样,算是把js升级了一下,这两种语法可以一起使用,只不过是用jqery更加方便 一个页面想要使用jqery的话,先要引入一下jqery包,jqery包从网上下一个就可以, ...

  6. 利用snowfall.jquery.js实现爱心满屏飞

    小颖在上一篇一步一步教你用CSS画爱心中已经分享一种画爱心的方法,这次再分享一种方法用css画爱心,并利用snowfall.jquery.js实现爱心满屏飞的效果. 第一步: 利用伪元素before和 ...

  7. node.js学习(三)简单的node程序&&模块简单使用&&commonJS规范&&深入理解模块原理

    一.一个简单的node程序 1.新建一个txt文件 2.修改后缀 修改之后会弹出这个,点击"是" 3.运行test.js 源文件 使用node.js运行之后的. 如果该路径下没有该 ...

  8. JS正则表达式常用总结

    正则表达式的创建 JS正则表达式的创建有两种方式: new RegExp() 和 直接字面量. //使用RegExp对象创建 var regObj = new RegExp("(^\\s+) ...

  9. 干货分享:让你分分钟学会 JS 闭包

    闭包,是 Javascript 比较重要的一个概念,对于初学者来讲,闭包是一个特别抽象的概念,特别是ECMA规范给的定义,如果没有实战经验,很难从定义去理解它.因此,本文不会对闭包的概念进行大篇幅描述 ...

随机推荐

  1. JavaScript基础之DOM修改样式

    1.获取或设置元素的内容:3个属性:   1. innerHTML: 获取或设置元素开始标签到结束标签之间的所有HTML代码原文.      何时使用:只要获得完整的html代码原文时      优化 ...

  2. node.js+socket.io安装

    最近做安卓遇到一个网络包的bug,服务端使用node做的,通讯用socket.io,但是服务端没法调试,没办法,还是自己搭建一个服务器端吧,索性买了阿里云的ecs测试,之前也配置过node+socke ...

  3. Python之路,Day9, 进程、线程、协程篇

    本节内容 操作系统发展史介绍 进程.与线程区别 python GIL全局解释器锁 线程 语法 join 线程锁之Lock\Rlock\信号量 将线程变为守护进程 Event事件 queue队列 生产者 ...

  4. Intel Code Challenge Final Round (Div. 1 + Div. 2, Combined) E. Goods transportation (非官方贪心解法)

    题目链接:http://codeforces.com/contest/724/problem/E 题目大意: 有n个城市,每个城市有pi件商品,最多能出售si件商品,对于任意一队城市i,j,其中i&l ...

  5. 深入理解JQuery插件开发

    如果你看到这篇文章,我确信你毫无疑问会认为jQuery是一个使用简便的库.jQuery可能使用起来很简单,但是它仍然有一些奇怪的地方,对它基本功能和概念不熟悉的人可能会难以掌握.但是不用担心,我下面已 ...

  6. android 取消edittext焦点

    页面中如果有EditText会默认获取焦点,如果进入页面时不想让其获取到焦点可以按如下步骤: 1.在布局的最外层添加属性: android:focusable="true" and ...

  7. js图片拖放原理(很简单,不是框架,入门基础)

    <html> <meta> <script src='jquery-1.8.3.min.js'></script> <script> /* ...

  8. OpenLDAP安装

    参考: http://54im.com/openldap/centos-6-yum-install-openldap-phpldapadmin-tls-%E5%8F%8C%E4%B8%BB%E9%85 ...

  9. christian louboutin ballerinas outlet

    www.heelschuhe.de, Wie auch immer, Schneiden auf den Punkt; David und Connie in Vancouver: Wir hoffe ...

  10. char* 和char[]的区别

    以下内容均来自互联网,系笔者汇总并总结. 1. 问题介绍 问题引入:在实习过程中发现了一个以前一直默认的错误,同样char *c = "abc"和char c[]="ab ...