KinerCode.js
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的更多相关文章
- Vue.js 和 MVVM 小细节
MVVM 是Model-View-ViewModel 的缩写,它是一种基于前端开发的架构模式,其核心是提供对View 和 ViewModel 的双向数据绑定,这使得ViewModel 的状态改变可以自 ...
- js学习笔记:操作iframe
iframe可以说是比较老得话题了,而且网上也基本上在说少用iframe,其原因大致为:堵塞页面加载.安全问题.兼容性问题.搜索引擎抓取不到等等,不过相对于这些缺点,iframe的优点更牛,跨域请求. ...
- js学习笔记:webpack基础入门(一)
之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...
- JS调用Android、Ios原生控件
在上一篇博客中已经和大家聊了,关于JS与Android.Ios原生控件之间相互通信的详细代码实现,今天我们一起聊一下JS调用Android.Ios通信的相同点和不同点,以便帮助我们在进行混合式开发时, ...
- jquery和Js的区别和基础操作
jqery的语法和js的语法一样,算是把js升级了一下,这两种语法可以一起使用,只不过是用jqery更加方便 一个页面想要使用jqery的话,先要引入一下jqery包,jqery包从网上下一个就可以, ...
- 利用snowfall.jquery.js实现爱心满屏飞
小颖在上一篇一步一步教你用CSS画爱心中已经分享一种画爱心的方法,这次再分享一种方法用css画爱心,并利用snowfall.jquery.js实现爱心满屏飞的效果. 第一步: 利用伪元素before和 ...
- node.js学习(三)简单的node程序&&模块简单使用&&commonJS规范&&深入理解模块原理
一.一个简单的node程序 1.新建一个txt文件 2.修改后缀 修改之后会弹出这个,点击"是" 3.运行test.js 源文件 使用node.js运行之后的. 如果该路径下没有该 ...
- JS正则表达式常用总结
正则表达式的创建 JS正则表达式的创建有两种方式: new RegExp() 和 直接字面量. //使用RegExp对象创建 var regObj = new RegExp("(^\\s+) ...
- 干货分享:让你分分钟学会 JS 闭包
闭包,是 Javascript 比较重要的一个概念,对于初学者来讲,闭包是一个特别抽象的概念,特别是ECMA规范给的定义,如果没有实战经验,很难从定义去理解它.因此,本文不会对闭包的概念进行大篇幅描述 ...
随机推荐
- iOs基础篇(二十二)—— UIPickerView、UIDatePicker控件的使用
一.UIPickerView UIPickerView是一个选择器控件,可以生成单列的选择器,也可生成多列的选择器,而且开发者完全可以自定义选择项的外观,因此用法非常灵活. 1.常用属性 (1)num ...
- [IOS 开发]TableView如何刷新指定的cell 或section
//一个section刷新 NSIndexSet *indexSet=[[NSIndexSet alloc]initWithIndex:]; [tableview reloadSections:ind ...
- <context:component-scan>使用说明
Spring组件扫描<context:component-scan/>使用详解 在xml配置了这个标签后,spring可以自动去扫描base-pack下面或者子包下面的java文件,如果扫 ...
- JavaScript 面向对象(一) —— 基础篇
学好JS的面向对象,能很大程度上提高代码的重用率,像jQuery,easyui等,这篇博客主要从细节上一步步讲JS中如何有效地创建对象,也可以看到常见的创建对象的方式,最后也会附上一些JS面向对象的案 ...
- 如何用fir.im 命令行工具 打包上传
1.注册fir.拿到token 2.安装 fir-cli 使用 Ruby 构建, 无需编译, 只要安装相应 gem 即可. $ ruby -v # > 1.9.3 $ gem install f ...
- 利用jQueryRotate旋转插件开发大转盘抽奖
前言: 公司原来开发大转盘抽奖活动用的是flash 我发现swf文件竟然有6m大,吓尿了! 其实完全可以用js写的,但是自身前端功力有限,且时间紧迫,所以直接用旋转插件就好,兼容各方面都可以保证. 1 ...
- (转)TortoiseSVN客户端重新设置用户名和密码
在第一次使用TortoiseSVN从服务器CheckOut的时候,会要求输入用户名和密码,这时输入框下面有个选项是保存认证信息,如果选了这个选项,那么以后就不用每次都输入一遍用户名密码了. 不过,如果 ...
- 解决MySql无法远程连接
安装完MySql后远程通过Navicat访问时报错: ERROR 1130: Host ***.***.***.*** is not allowed to connect to this MySQL ...
- μC/OS-Ⅲ中的临界段代码
临界段代码(critical sections),也叫临界区(critical region),是指那些必须完整连续运行,不可被打断的代码段.μC/OS-Ⅲ系统中存在大量临界段代码.采用两种方式对临界 ...
- 【Python③】python基本数据类型,变量和常量
基本数据类型 Python中,能直接处理的数据类型有以下几种: 整数 Python可以处理任意大小的整数,包括负整数,程序中的写法和数学上的一样,例如:6,-666,8888…… 计算机使用二进制,所 ...