|
|
@@ -0,0 +1,744 @@
|
|
|
+/*! Verify-v0.1.0 MIT License by 大熊*/
|
|
|
+
|
|
|
+
|
|
|
+;(function($, window, document,undefined) {
|
|
|
+
|
|
|
+ //定义Code的构造函数
|
|
|
+ var Code = function(ele, opt) {
|
|
|
+ this.$element = ele,
|
|
|
+ this.defaults = {
|
|
|
+ type : 1,
|
|
|
+ figure : 100, //位数,仅在type=2时生效
|
|
|
+ arith : 0, //算法,支持加减乘,0为随机,仅在type=2时生效
|
|
|
+ width : '200px',
|
|
|
+ height : '60px',
|
|
|
+ fontSize : '30px',
|
|
|
+ codeLength : 6,
|
|
|
+ btnId : 'check-btn',
|
|
|
+ ready : function(){},
|
|
|
+ success : function(){},
|
|
|
+ error : function(){}
|
|
|
+ },
|
|
|
+ this.options = $.extend({}, this.defaults, opt)
|
|
|
+ };
|
|
|
+
|
|
|
+ var _code_chars = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, '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'];
|
|
|
+ var _code_color1 = ['#fffff0', '#f0ffff', '#f0fff0', '#fff0f0'];
|
|
|
+ var _code_color2 = ['#FF0033', '#006699', '#993366', '#FF9900', '#66CC66', '#FF33CC'];
|
|
|
+
|
|
|
+ //定义Code的方法
|
|
|
+ Code.prototype = {
|
|
|
+ init : function() {
|
|
|
+
|
|
|
+ var _this = this;
|
|
|
+
|
|
|
+ this.loadDom();
|
|
|
+ this.setCode();
|
|
|
+
|
|
|
+ this.options.ready();
|
|
|
+
|
|
|
+ this.$element[0].onselectstart = document.body.ondrag = function(){
|
|
|
+ return false;
|
|
|
+ };
|
|
|
+
|
|
|
+ //点击验证码
|
|
|
+ this.$element.find('.verify-code, .verify-change-code').on('click', function() {
|
|
|
+ _this.setCode();
|
|
|
+ });
|
|
|
+
|
|
|
+ //确定的点击事件
|
|
|
+ this.htmlDoms.code_btn.on('click', function() {
|
|
|
+ _this.checkCode();
|
|
|
+ })
|
|
|
+
|
|
|
+ },
|
|
|
+
|
|
|
+ //加载页面
|
|
|
+ loadDom : function() {
|
|
|
+ var panelHtml = '<div class="cerify-code-panel"><div class="verify-code"></div><div class="verify-code-area"><div class="verify-input-area"><input type="text" class="varify-input-code" /></div><div class="verify-change-area"><a class="verify-change-code">换一张</a></div></div></div>';
|
|
|
+ this.$element.append(panelHtml);
|
|
|
+
|
|
|
+ this.htmlDoms = {
|
|
|
+ code_btn : $('#'+this.options.btnId),
|
|
|
+ code : this.$element.find('.verify-code'),
|
|
|
+ code_area : this.$element.find('.verify-code-area'),
|
|
|
+ code_input : this.$element.find('.varify-input-code'),
|
|
|
+ };
|
|
|
+
|
|
|
+ this.htmlDoms.code.css({'width':this.options.width, 'height':this.options.height,'line-height':this.options.height, 'font-size':this.options.fontSize});
|
|
|
+ this.htmlDoms.code_area.css({'width':this.options.width});
|
|
|
+ },
|
|
|
+
|
|
|
+
|
|
|
+ //设置验证码
|
|
|
+ setCode : function() {
|
|
|
+
|
|
|
+ var color1Num = Math.floor(Math.random() * 3);
|
|
|
+ var color2Num = Math.floor(Math.random() * 5);
|
|
|
+
|
|
|
+ this.htmlDoms.code.css({'background-color': _code_color1[color1Num], 'color': _code_color2[color2Num]});
|
|
|
+ this.htmlDoms.code_input.val('');
|
|
|
+
|
|
|
+ var code = '';
|
|
|
+ this.code_chose = '';
|
|
|
+
|
|
|
+ if(this.options.type == 1) { //普通验证码
|
|
|
+ for(var i = 0; i < this.options.codeLength; i++) {
|
|
|
+ var charNum = Math.floor(Math.random() * 52);
|
|
|
+ var tmpStyle = (charNum%2 ==0)? "font-style:italic;margin-right: 10px;":"font-weight:bolder;";
|
|
|
+ tmpStyle += (Math.floor(Math.random() * 2) == 1)? "font-weight:bolder;":"";
|
|
|
+
|
|
|
+ this.code_chose += _code_chars[charNum];
|
|
|
+ code += '<font style="'+tmpStyle+'">'+_code_chars[charNum]+'</font>';
|
|
|
+ }
|
|
|
+ }else { //算法验证码
|
|
|
+
|
|
|
+ var num1 = Math.floor(Math.random() * this.options.figure);
|
|
|
+ var num2 = Math.floor(Math.random() * this.options.figure);
|
|
|
+
|
|
|
+ if(this.options.arith == 0) {
|
|
|
+ var tmparith = Math.floor(Math.random() * 3);
|
|
|
+ }
|
|
|
+
|
|
|
+ switch(tmparith) {
|
|
|
+ case 1 :
|
|
|
+ this.code_chose = parseInt(num1) + parseInt(num2);
|
|
|
+ code = num1 + ' + ' + num2 + ' = ?';
|
|
|
+ break;
|
|
|
+ case 2 :
|
|
|
+ if(parseInt(num1) < parseInt(num2)) {
|
|
|
+ var tmpnum = num1;
|
|
|
+ num1 = num2;
|
|
|
+ num2 = tmpnum;
|
|
|
+ }
|
|
|
+ this.code_chose = parseInt(num1) - parseInt(num2);
|
|
|
+ code = num1 + ' - ' + num2 + ' = ?';
|
|
|
+ break;
|
|
|
+ default :
|
|
|
+ this.code_chose = parseInt(num1) * parseInt(num2);
|
|
|
+ code = num1 + ' × ' + num2 + ' = ?';
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ this.htmlDoms.code.html(code);
|
|
|
+
|
|
|
+ },
|
|
|
+
|
|
|
+ //比对验证码
|
|
|
+ checkCode : function() {
|
|
|
+ if(this.options.type == 1) { //普通验证码
|
|
|
+ var own_input = this.htmlDoms.code_input.val().toUpperCase();
|
|
|
+ this.code_chose = this.code_chose.toUpperCase();
|
|
|
+ }else {
|
|
|
+ var own_input = this.htmlDoms.code_input.val();
|
|
|
+ }
|
|
|
+
|
|
|
+ if(own_input == this.code_chose) {
|
|
|
+ this.options.success();
|
|
|
+ }else {
|
|
|
+ this.options.error();
|
|
|
+ this.setCode();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ };
|
|
|
+
|
|
|
+
|
|
|
+ //定义Slide的构造函数
|
|
|
+ var Slide = function(ele, opt) {
|
|
|
+ this.$element = ele,
|
|
|
+ this.defaults = {
|
|
|
+
|
|
|
+ type : 1,
|
|
|
+ vOffset: 5,
|
|
|
+ vSpace : 5,
|
|
|
+ imgName : ['1.jpg', '2.jpg'],
|
|
|
+ imgSize : {
|
|
|
+ width: '400px',
|
|
|
+ height: '200px',
|
|
|
+ },
|
|
|
+ blockSize : {
|
|
|
+ width: '50px',
|
|
|
+ height: '50px',
|
|
|
+ },
|
|
|
+ barSize : {
|
|
|
+ width : '400px',
|
|
|
+ height : '40px',
|
|
|
+ },
|
|
|
+ ready : function(){},
|
|
|
+ success : function(){},
|
|
|
+ error : function(){}
|
|
|
+
|
|
|
+ },
|
|
|
+ this.options = $.extend({}, this.defaults, opt)
|
|
|
+ };
|
|
|
+
|
|
|
+
|
|
|
+ //定义Slide的方法
|
|
|
+ Slide.prototype = {
|
|
|
+
|
|
|
+ init: function() {
|
|
|
+ var _this = this;
|
|
|
+
|
|
|
+ //加载页面
|
|
|
+ this.loadDom();
|
|
|
+ this.options.ready();
|
|
|
+
|
|
|
+ this.$element[0].onselectstart = document.body.ondrag = function(){
|
|
|
+ return false;
|
|
|
+ };
|
|
|
+
|
|
|
+ //按下
|
|
|
+ this.htmlDoms.move_block.on('touchstart', function(e) {
|
|
|
+ _this.start(e);
|
|
|
+ });
|
|
|
+
|
|
|
+ this.htmlDoms.move_block.on('mousedown', function(e) {
|
|
|
+ _this.start(e);
|
|
|
+ });
|
|
|
+
|
|
|
+ //拖动
|
|
|
+ window.addEventListener("touchmove", function(e) {
|
|
|
+ _this.move(e);
|
|
|
+ });
|
|
|
+ window.addEventListener("mousemove", function(e) {
|
|
|
+ _this.move(e);
|
|
|
+ });
|
|
|
+
|
|
|
+ //鼠标松开
|
|
|
+ window.addEventListener("touchend", function() {
|
|
|
+ _this.end();
|
|
|
+ });
|
|
|
+ window.addEventListener("mouseup", function() {
|
|
|
+ _this.end();
|
|
|
+ });
|
|
|
+
|
|
|
+ //刷新
|
|
|
+ _this.$element.find('.verify-refresh').on('click', function() {
|
|
|
+ _this.refresh();
|
|
|
+ });
|
|
|
+ },
|
|
|
+
|
|
|
+ //初始化加载
|
|
|
+ loadDom : function() {
|
|
|
+ this.img_rand = Math.floor(Math.random() * this.options.imgName.length); //随机的背景图片
|
|
|
+
|
|
|
+ var panelHtml = '';
|
|
|
+ var tmpHtml = '';
|
|
|
+
|
|
|
+ if(this.options.type != 1) { //图片滑动
|
|
|
+ panelHtml += '<div class="verify-img-panel"><div class="verify-refresh"><span class="icon iconfont icon-shuaxin"></span></div><div style="position: relative;z-index: 2;border: 1px solid #fff;background: #fff;" class="verify-gap"></div></div>';
|
|
|
+ tmpHtml = '<div style="position: absolute;text-align: center;z-index: 3;border: 1px solid #fff;" class="verify-sub-block"></div>';
|
|
|
+ }
|
|
|
+
|
|
|
+ panelHtml += '<div class="verify-bar-area"><span class="verify-msg">向右滑动完成验证</span><div class="verify-left-bar"><span class="verify-msg"></span><div class="verify-move-block"><i class="icon iconfont verify-icon icon-jinru"></i>'+tmpHtml+'</div></div></div>';
|
|
|
+ this.$element.append(panelHtml);
|
|
|
+
|
|
|
+ this.htmlDoms = {
|
|
|
+ gap : this.$element.find('.verify-gap'),
|
|
|
+ sub_block : this.$element.find('.verify-sub-block'),
|
|
|
+ img_panel : this.$element.find('.verify-img-panel'),
|
|
|
+ bar_area : this.$element.find('.verify-bar-area'),
|
|
|
+ move_block : this.$element.find('.verify-move-block'),
|
|
|
+ left_bar : this.$element.find('.verify-left-bar'),
|
|
|
+ msg : this.$element.find('.verify-msg'),
|
|
|
+ icon : this.$element.find('.verify-icon'),
|
|
|
+ refresh :this.$element.find('.verify-refresh')
|
|
|
+ };
|
|
|
+
|
|
|
+ this.status = false; //鼠标状态
|
|
|
+ this.setSize = this.resetSize(this); //重新设置宽度高度
|
|
|
+
|
|
|
+ this.htmlDoms.gap.css({'width': this.options.blockSize.width, 'height': this.options.blockSize.height});
|
|
|
+ this.htmlDoms.sub_block.css({'width': this.options.blockSize.width, 'height': this.options.blockSize.height});
|
|
|
+ this.htmlDoms.img_panel.css({'width': this.setSize.img_width, 'height': this.setSize.img_height, 'background': 'url('+this.options.imgName[this.img_rand]+')', 'background-size' : this.setSize.img_width + ' '+ this.setSize.img_height});
|
|
|
+ this.htmlDoms.bar_area.css({'width': this.setSize.bar_width, 'height': this.options.barSize.height, 'line-height':this.options.barSize.height});
|
|
|
+ this.htmlDoms.move_block.css({'width': this.options.barSize.height, 'height': this.options.barSize.height});
|
|
|
+ this.htmlDoms.left_bar.css({'width': this.options.barSize.height, 'height': this.options.barSize.height});
|
|
|
+
|
|
|
+ this.randSet();
|
|
|
+ },
|
|
|
+
|
|
|
+ //鼠标按下
|
|
|
+ start: function(e) {
|
|
|
+ this.htmlDoms.msg.text('');
|
|
|
+ this.htmlDoms.move_block.css('background-color', '#337ab7');
|
|
|
+ this.htmlDoms.left_bar.addClass('verify-left-bar-active');
|
|
|
+ // this.htmlDoms.left_bar.css('border-color', '#337AB7');
|
|
|
+ this.htmlDoms.icon.css('color', '#fff');
|
|
|
+ e.stopPropagation();
|
|
|
+ this.status = true;
|
|
|
+
|
|
|
+ },
|
|
|
+
|
|
|
+ //鼠标移动
|
|
|
+ move: function(e) {
|
|
|
+ if(this.status) {
|
|
|
+ if(!e.touches) { //兼容移动端
|
|
|
+ var x = e.clientX;
|
|
|
+ }else { //兼容PC端
|
|
|
+ var x = e.touches[0].pageX;
|
|
|
+ }
|
|
|
+ var bar_area_left = Slide.prototype.getLeft(this.htmlDoms.bar_area[0]);
|
|
|
+ var move_block_left = x - bar_area_left; //小方块相对于父元素的left值
|
|
|
+
|
|
|
+
|
|
|
+ if(this.options.type != 1) { //图片滑动
|
|
|
+ if(move_block_left >= this.htmlDoms.bar_area[0].offsetWidth - parseInt(parseInt(this.options.blockSize.width)/2) - 2) {
|
|
|
+ move_block_left = this.htmlDoms.bar_area[0].offsetWidth - parseInt(parseInt(this.options.blockSize.width)/2) - 2;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ }else { //普通滑动
|
|
|
+ if(move_block_left >= this.htmlDoms.bar_area[0].offsetWidth - parseInt(parseInt(this.options.barSize.height)/2) + 3) {
|
|
|
+ this.$element.find('.verify-msg:eq(1)').text('松开验证');
|
|
|
+ move_block_left = this.htmlDoms.bar_area[0].offsetWidth - parseInt(parseInt(this.options.barSize.height)/2) + 3;
|
|
|
+ }else {
|
|
|
+ this.$element.find('.verify-msg:eq(1)').text('');
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ if(move_block_left <= 0) {
|
|
|
+ move_block_left = parseInt(parseInt(this.options.blockSize.width)/2);
|
|
|
+ }
|
|
|
+
|
|
|
+ //拖动后小方块的left值
|
|
|
+ this.htmlDoms.move_block.css('left', move_block_left-parseInt(parseInt(this.options.blockSize.width)/2) + "px");
|
|
|
+ this.htmlDoms.left_bar.css('width', move_block_left-parseInt(parseInt(this.options.blockSize.width)/2) + "px");
|
|
|
+ }
|
|
|
+ },
|
|
|
+
|
|
|
+ //鼠标松开
|
|
|
+ end: function() {
|
|
|
+
|
|
|
+ var _this = this;
|
|
|
+
|
|
|
+ //判断是否重合
|
|
|
+ if(this.status) {
|
|
|
+
|
|
|
+ if(this.options.type != 1) { //图片滑动
|
|
|
+
|
|
|
+ var vOffset = parseInt(this.options.vOffset);
|
|
|
+ if(parseInt(this.htmlDoms.gap.css('left')) >= (parseInt(this.htmlDoms.move_block.css('left')) - vOffset) && parseInt(this.htmlDoms.gap.css('left')) <= (parseInt(this.htmlDoms.move_block.css('left')) + vOffset)) {
|
|
|
+ this.htmlDoms.move_block.css('background-color', '#5cb85c');
|
|
|
+ this.htmlDoms.left_bar.addClass('verify-left-bar-success');
|
|
|
+ // this.htmlDoms.left_bar.css({'border-color': '#5cb85c', 'background-color': '#fff'});
|
|
|
+ this.htmlDoms.icon.css('color', '#fff');
|
|
|
+ this.htmlDoms.icon.removeClass('icon-jinru');
|
|
|
+ this.htmlDoms.icon.addClass('icon-dagou');
|
|
|
+ this.htmlDoms.refresh.hide();
|
|
|
+ this.htmlDoms.move_block.unbind('mousedown touchstart');
|
|
|
+ this.options.success();
|
|
|
+ }else{
|
|
|
+ this.htmlDoms.move_block.css('background-color', '#d9534f');
|
|
|
+ this.htmlDoms.left_bar.addClass('verify-left-bar-error');
|
|
|
+ // this.htmlDoms.left_bar.css('border-color', '#d9534f');
|
|
|
+ this.htmlDoms.icon.css('color', '#fff');
|
|
|
+ this.htmlDoms.icon.removeClass('icon-jinru');
|
|
|
+ this.htmlDoms.icon.addClass('icon-guanbi1');
|
|
|
+
|
|
|
+ setTimeout(function () {
|
|
|
+ _this.htmlDoms.move_block.animate({'left':'0px'}, 'fast');
|
|
|
+ _this.htmlDoms.left_bar.animate({'width': '40px'}, 'fast');
|
|
|
+ _this.htmlDoms.left_bar.removeClass('verify-left-bar-active');
|
|
|
+ _this.htmlDoms.left_bar.removeClass('verify-left-bar-success');
|
|
|
+ _this.htmlDoms.left_bar.removeClass('verify-left-bar-error');
|
|
|
+ // _this.htmlDoms.left_bar.css({'border-color': '#ddd'});
|
|
|
+
|
|
|
+ _this.htmlDoms.move_block.css('background-color', '#fff');
|
|
|
+ _this.htmlDoms.icon.css('color', '#000');
|
|
|
+ _this.htmlDoms.icon.removeClass('icon-guanbi1');
|
|
|
+ _this.htmlDoms.icon.addClass('icon-jinru');
|
|
|
+ _this.$element.find('.verify-msg:eq(0)').text('向右滑动完成验证');
|
|
|
+
|
|
|
+ }, 400);
|
|
|
+
|
|
|
+ this.options.error();
|
|
|
+ }
|
|
|
+
|
|
|
+ }else { //普通滑动
|
|
|
+
|
|
|
+ if(parseInt(this.htmlDoms.move_block.css('left')) >= (parseInt(this.setSize.bar_width) - parseInt(this.options.barSize.height) - parseInt(this.options.vOffset))) {
|
|
|
+ this.htmlDoms.move_block.css('background-color', '#5cb85c');
|
|
|
+ this.htmlDoms.left_bar.addClass('verify-left-bar-success');
|
|
|
+ // this.htmlDoms.left_bar.css({'color': '#4cae4c', 'border-color': '#5cb85c', 'background-color': '#fff' });
|
|
|
+ this.htmlDoms.icon.css('color', '#fff');
|
|
|
+ this.htmlDoms.icon.removeClass('icon-jinru');
|
|
|
+ this.htmlDoms.icon.addClass('icon-dagou');
|
|
|
+ this.htmlDoms.refresh.hide();
|
|
|
+ this.htmlDoms.move_block.unbind('mousedown');
|
|
|
+ this.htmlDoms.move_block.unbind('touchstart');
|
|
|
+ this.$element.find('.verify-msg:eq(1)').text('验证成功');
|
|
|
+ this.options.success();
|
|
|
+ }else {
|
|
|
+
|
|
|
+ this.htmlDoms.move_block.css('background-color', '#d9534f');
|
|
|
+ this.htmlDoms.left_bar.addClass('verify-left-bar-error');
|
|
|
+ // this.htmlDoms.left_bar.css('border-color', '#d9534f');
|
|
|
+ this.htmlDoms.icon.css('color', '#fff');
|
|
|
+ this.htmlDoms.icon.removeClass('icon-jinru');
|
|
|
+ this.htmlDoms.icon.addClass('icon-guanbi1');
|
|
|
+
|
|
|
+ setTimeout(function () {
|
|
|
+ _this.htmlDoms.move_block.animate({'left':'0px'}, 'fast');
|
|
|
+ _this.htmlDoms.left_bar.animate({'width': '40px'}, 'fast');
|
|
|
+ _this.htmlDoms.left_bar.removeClass('verify-left-bar-active');
|
|
|
+ _this.htmlDoms.left_bar.removeClass('verify-left-bar-success');
|
|
|
+ _this.htmlDoms.left_bar.removeClass('verify-left-bar-error');
|
|
|
+ // _this.htmlDoms.left_bar.css({'border-color': '#ddd'});
|
|
|
+
|
|
|
+ _this.htmlDoms.move_block.css('background-color', '#fff');
|
|
|
+ _this.htmlDoms.icon.css('color', '#000');
|
|
|
+ _this.htmlDoms.icon.removeClass('icon-guanbi1');
|
|
|
+ _this.htmlDoms.icon.addClass('icon-jinru');
|
|
|
+ _this.$element.find('.verify-msg:eq(0)').text('向右滑动解锁');
|
|
|
+
|
|
|
+ }, 400);
|
|
|
+
|
|
|
+ this.options.error();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ this.status = false;
|
|
|
+ }
|
|
|
+ },
|
|
|
+
|
|
|
+
|
|
|
+ resetSize : function(obj) {
|
|
|
+ var img_width,img_height,bar_width,bar_height; //图片的宽度、高度,移动条的宽度、高度
|
|
|
+ var parentWidth = obj.$element.parent().width() || $(window).width();
|
|
|
+ var parentHeight = obj.$element.parent().height() || $(window).height();
|
|
|
+
|
|
|
+ if(obj.options.imgSize.width.indexOf('%')!= -1){
|
|
|
+ img_width = parseInt(obj.options.imgSize.width)/100 * parentWidth + 'px';
|
|
|
+ }else {
|
|
|
+ img_width = obj.options.imgSize.width;
|
|
|
+ }
|
|
|
+
|
|
|
+ if(obj.options.imgSize.height.indexOf('%')!= -1){
|
|
|
+ img_height = parseInt(obj.options.imgSize.height)/100 * parentHeight + 'px';
|
|
|
+ }else {
|
|
|
+ img_height = obj.options.imgSize.height;
|
|
|
+ }
|
|
|
+
|
|
|
+ if(obj.options.barSize.width.indexOf('%')!= -1){
|
|
|
+ bar_width = parseInt(obj.options.barSize.width)/100 * parentWidth + 'px';
|
|
|
+ }else {
|
|
|
+ bar_width = obj.options.barSize.width;
|
|
|
+ }
|
|
|
+
|
|
|
+ if(obj.options.barSize.height.indexOf('%')!= -1){
|
|
|
+ bar_height = parseInt(obj.options.barSize.height)/100 * parentHeight + 'px';
|
|
|
+ }else {
|
|
|
+ bar_height = obj.options.barSize.height;
|
|
|
+ }
|
|
|
+
|
|
|
+ return {img_width : img_width, img_height : img_height, bar_width : bar_width, bar_height : bar_height};
|
|
|
+ },
|
|
|
+
|
|
|
+ //随机出生点位
|
|
|
+ randSet: function() {
|
|
|
+ var rand1 = Math.floor(Math.random()*9+1);
|
|
|
+ var rand2 = Math.floor(Math.random()*9+1);
|
|
|
+ var top = rand1 * parseInt(this.setSize.img_height)/15 + parseInt(this.setSize.img_height) * 0.1;
|
|
|
+ var left = rand2 * parseInt(this.setSize.img_width)/15 + parseInt(this.setSize.img_width) * 0.1;
|
|
|
+
|
|
|
+ this.$element.find('.verify-img-panel').css('margin-bottom', this.options.vSpace + 'px');
|
|
|
+ this.$element.find('.verify-gap').css({'top': top, 'left': left});
|
|
|
+ this.$element.find('.verify-sub-block').css({'top':'-'+(parseInt(this.setSize.img_height)- top + this.options.vSpace + 1)+'px', 'background-image': 'url('+this.options.imgName[this.img_rand]+')', 'background-size': this.setSize.img_width + ' '+ this.setSize.img_height,'background-position-y': '-'+top+ 'px', 'background-position-x': '-'+left+'px'});
|
|
|
+ },
|
|
|
+
|
|
|
+ //刷新
|
|
|
+ refresh: function() {
|
|
|
+ this.randSet();
|
|
|
+ this.img_rand = Math.floor(Math.random() * this.options.imgName.length); //随机的背景图片
|
|
|
+ this.$element.find('.verify-img-panel').css({'background': 'url('+this.options.imgName[this.img_rand]+')', 'background-size': this.setSize.img_width + ' '+ this.setSize.img_height});
|
|
|
+ this.$element.find('.verify-sub-block').css({'background-image': 'url('+this.options.imgName[this.img_rand]+')', 'background-size': this.setSize.img_width + ' '+ this.setSize.img_height});
|
|
|
+ },
|
|
|
+
|
|
|
+ //获取left值
|
|
|
+ getLeft: function(node) {
|
|
|
+ var left = $(node).offset().left;
|
|
|
+// var nowPos = node.offsetParent;
|
|
|
+//
|
|
|
+// while(nowPos != null) {
|
|
|
+// left += $(nowPos).offset().left;
|
|
|
+// nowPos = nowPos.offsetParent;
|
|
|
+// }
|
|
|
+ return left;
|
|
|
+ }
|
|
|
+ };
|
|
|
+
|
|
|
+
|
|
|
+ //定义Points的构造函数
|
|
|
+ var Points = function(ele, opt) {
|
|
|
+ this.$element = ele,
|
|
|
+ this.defaults = {
|
|
|
+ defaultNum : 4, //默认的文字数量
|
|
|
+ checkNum : 3, //校对的文字数量
|
|
|
+ vSpace : 5, //间隔
|
|
|
+ imgName : ['1.jpg', '2.jpg'],
|
|
|
+ imgSize : {
|
|
|
+ width: '400px',
|
|
|
+ height: '200px',
|
|
|
+ },
|
|
|
+ barSize : {
|
|
|
+ width : '400px',
|
|
|
+ height : '40px',
|
|
|
+ },
|
|
|
+ ready : function(){},
|
|
|
+ success : function(){},
|
|
|
+ error : function(){}
|
|
|
+ },
|
|
|
+ this.options = $.extend({}, this.defaults, opt)
|
|
|
+ };
|
|
|
+
|
|
|
+ //定义Points的方法
|
|
|
+ Points.prototype = {
|
|
|
+ init : function() {
|
|
|
+
|
|
|
+ var _this = this;
|
|
|
+
|
|
|
+ //加载页面
|
|
|
+ _this.loadDom();
|
|
|
+
|
|
|
+ _this.refresh();
|
|
|
+ _this.options.ready();
|
|
|
+
|
|
|
+ this.$element[0].onselectstart = document.body.ondrag = function(){
|
|
|
+ return false;
|
|
|
+ };
|
|
|
+
|
|
|
+ //点击事件比对
|
|
|
+ _this.$element.find('.verify-img-panel canvas').on('click', function(e) {
|
|
|
+
|
|
|
+ _this.checkPosArr.push(_this.getMousePos(this, e));
|
|
|
+
|
|
|
+ if(_this.num == _this.options.checkNum) {
|
|
|
+
|
|
|
+ _this.num = _this.createPoint(_this.getMousePos(this, e));
|
|
|
+ setTimeout(function () {
|
|
|
+ var flag = _this.comparePos(_this.fontPos, _this.checkPosArr);
|
|
|
+
|
|
|
+ if(flag == false) { //验证失败
|
|
|
+
|
|
|
+ _this.options.error();
|
|
|
+ _this.$element.find('.verify-bar-area').css({'color': '#d9534f', 'border-color': '#d9534f'});
|
|
|
+ _this.$element.find('.verify-msg').text('验证失败');
|
|
|
+
|
|
|
+ setTimeout(function () {
|
|
|
+ _this.$element.find('.verify-bar-area').css({'color': '#000','border-color': '#ddd'});
|
|
|
+ _this.refresh();
|
|
|
+ }, 400);
|
|
|
+
|
|
|
+ }else { //验证成功
|
|
|
+ _this.$element.find('.verify-bar-area').css({'color': '#4cae4c', 'border-color': '#5cb85c'});
|
|
|
+ _this.$element.find('.verify-msg').text('验证成功');
|
|
|
+ _this.$element.find('.verify-refresh').hide();
|
|
|
+ _this.$element.find('.verify-img-panel').unbind('click');
|
|
|
+ _this.options.success();
|
|
|
+ }
|
|
|
+ }, 400);
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ if(_this.num < _this.options.checkNum) {
|
|
|
+ _this.num = _this.createPoint(_this.getMousePos(this, e));
|
|
|
+ }
|
|
|
+
|
|
|
+ });
|
|
|
+
|
|
|
+ //刷新
|
|
|
+ _this.$element.find('.verify-refresh').on('click', function() {
|
|
|
+ _this.refresh();
|
|
|
+ });
|
|
|
+
|
|
|
+ },
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ //加载页面
|
|
|
+ loadDom : function() {
|
|
|
+
|
|
|
+ this.fontPos = []; //选中的坐标信息
|
|
|
+ this.checkPosArr = []; //用户点击的坐标
|
|
|
+ this.num = 1; //点击的记数
|
|
|
+ this.img_rand = Math.floor(Math.random() * this.options.imgName.length); //随机的背景图片
|
|
|
+
|
|
|
+ var panelHtml = '';
|
|
|
+ var tmpHtml = '';
|
|
|
+
|
|
|
+ this.setSize = Slide.prototype.resetSize(this); //重新设置宽度高度
|
|
|
+
|
|
|
+ panelHtml += '<div class="verify-img-panel"><div class="verify-refresh" style="z-index:9999"><i class="icon iconfont icon-shuaxin"></i></div><canvas width="'+this.setSize.img_width+'" height="'+this.setSize.img_height+'"></canvas></div><div class="verify-bar-area"><span class="verify-msg"></span></div>';
|
|
|
+
|
|
|
+ this.$element.append(panelHtml);
|
|
|
+
|
|
|
+
|
|
|
+ this.htmlDoms = {
|
|
|
+ img_panel : this.$element.find('.verify-img-panel'),
|
|
|
+ bar_area : this.$element.find('.verify-bar-area'),
|
|
|
+ msg : this.$element.find('.verify-msg'),
|
|
|
+ };
|
|
|
+
|
|
|
+ this.htmlDoms.img_panel.css({'width': this.setSize.img_width, 'height': this.setSize.img_height, 'background-size' : this.setSize.img_width + ' '+ this.setSize.img_height, 'margin-bottom': this.options.vSpace + 'px'});
|
|
|
+ this.htmlDoms.bar_area.css({'width': this.options.barSize.width, 'height': this.options.barSize.height, 'line-height':this.options.barSize.height});
|
|
|
+
|
|
|
+ },
|
|
|
+
|
|
|
+ //绘制合成的图片
|
|
|
+ drawImg : function(obj, img) {
|
|
|
+ //准备canvas环境
|
|
|
+ var canvas = this.$element.find('canvas')[0];
|
|
|
+ //var canvas=document.getElementById("myCanvas");
|
|
|
+ var ctx=canvas.getContext("2d");
|
|
|
+
|
|
|
+ // 绘制图片
|
|
|
+ ctx.drawImage(img,0,0, parseInt(this.setSize.img_width), parseInt(this.setSize.img_height));
|
|
|
+
|
|
|
+ // 绘制水印
|
|
|
+ var fontSizeArr = ['italic small-caps bold 20px microsoft yahei', 'small-caps normal 25px arial', '34px microsoft yahei'];
|
|
|
+ var fontStr = '天地玄黄宇宙洪荒日月盈昃辰宿列张寒来暑往秋收冬藏闰余成岁律吕调阳云腾致雨露结为霜金生丽水玉出昆冈剑号巨阙珠称夜光果珍李柰菜重芥姜海咸河淡鳞潜羽翔龙师火帝鸟官人皇始制文字乃服衣裳推位让国有虞陶唐吊民伐罪周发殷汤坐朝问道垂拱平章爱育黎首臣伏戎羌遐迩体率宾归王'; //不重复的汉字
|
|
|
+
|
|
|
+
|
|
|
+ var fontChars = [];
|
|
|
+
|
|
|
+ var avg = Math.floor(parseInt(this.setSize.img_width)/(parseInt(this.options.defaultNum)+1));
|
|
|
+ var tmp_index = '';
|
|
|
+ var color2Num = Math.floor(Math.random() * 5);
|
|
|
+
|
|
|
+ for(var i = 1; i <= this.options.defaultNum; i++) {
|
|
|
+
|
|
|
+ fontChars[i-1] = this.getChars(fontStr, fontChars);
|
|
|
+
|
|
|
+ tmp_index = Math.floor(Math.random()*3);
|
|
|
+ ctx.font = fontSizeArr[tmp_index];
|
|
|
+ ctx.fillStyle = _code_color2[color2Num];
|
|
|
+
|
|
|
+ if(Math.floor(Math.random() * 2) == 1) {
|
|
|
+ var tmp_y = Math.floor(parseInt(this.setSize.img_height)/2) + tmp_index*20 + 20;
|
|
|
+ }else {
|
|
|
+ var tmp_y = Math.floor(parseInt(this.setSize.img_height)/2) - tmp_index*20;
|
|
|
+ }
|
|
|
+
|
|
|
+ ctx.fillText(fontChars[i-1],avg * i, tmp_y);
|
|
|
+ this.fontPos[i-1] = {'char': fontChars[i-1], 'x': avg * i, 'y': tmp_y};
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ for(var i = 0; i < (this.options.defaultNum-this.options.checkNum); i++) {
|
|
|
+ this.shuffle(this.fontPos).pop();
|
|
|
+ }
|
|
|
+
|
|
|
+ var msgStr = '';
|
|
|
+ for(var i = 0; i < this.fontPos.length; i++) {
|
|
|
+ msgStr += this.fontPos[i].char + ',';
|
|
|
+ }
|
|
|
+
|
|
|
+ this.htmlDoms.msg.text('请顺序点击【' + msgStr.substring(0,msgStr.length-1) + '】');
|
|
|
+
|
|
|
+ return this.fontPos;
|
|
|
+ },
|
|
|
+
|
|
|
+ //获取坐标
|
|
|
+ getMousePos :function(obj, event) {
|
|
|
+ var e = event || window.event;
|
|
|
+ var scrollX = document.documentElement.scrollLeft || document.body.scrollLeft;
|
|
|
+ var scrollY = document.documentElement.scrollTop || document.body.scrollTop;
|
|
|
+ var x = e.clientX - ($(obj).offset().left - $(window).scrollLeft());
|
|
|
+ var y = e.clientY - ($(obj).offset().top - $(window).scrollTop());
|
|
|
+
|
|
|
+ return {'x': x, 'y': y};
|
|
|
+ },
|
|
|
+
|
|
|
+ //递归去重
|
|
|
+ getChars : function(fontStr, fontChars) {
|
|
|
+
|
|
|
+ var tmp_rand = parseInt(Math.floor(Math.random() * fontStr.length));
|
|
|
+ if(tmp_rand > 0) {
|
|
|
+ tmp_rand = tmp_rand - 1;
|
|
|
+ }
|
|
|
+
|
|
|
+ tmp_char = fontStr.charAt(tmp_rand);
|
|
|
+ if($.inArray(tmp_char, fontChars) == -1) {
|
|
|
+ return tmp_char;
|
|
|
+ }else {
|
|
|
+ return Points.prototype.getChars(fontStr, fontChars);
|
|
|
+ }
|
|
|
+ },
|
|
|
+
|
|
|
+ //洗牌数组
|
|
|
+ shuffle : function(arr) {
|
|
|
+ var m = arr.length, i;
|
|
|
+ while (m) {
|
|
|
+ i = (Math.random() * m--) >>> 0;
|
|
|
+ [arr[m], arr[i]] = [arr[i], arr[m]]
|
|
|
+ }
|
|
|
+ return arr;
|
|
|
+ },
|
|
|
+
|
|
|
+ //创建坐标点
|
|
|
+ createPoint : function (pos) {
|
|
|
+ this.htmlDoms.img_panel.append('<div class="point-area" style="background-color:#1abd6c;color:#fff;z-index:9999;width:30px;height:30px;text-align:center;line-height:30px;border-radius: 50%;position:absolute;top:'+parseInt(pos.y-10)+'px;left:'+parseInt(pos.x-10)+'px;">'+this.num+'</div>');
|
|
|
+ return ++this.num;
|
|
|
+ },
|
|
|
+
|
|
|
+ //比对坐标点
|
|
|
+ comparePos : function (fontPos, checkPosArr) {
|
|
|
+
|
|
|
+ var flag = true;
|
|
|
+ for(var i = 0; i < fontPos.length; i++) {
|
|
|
+ if(!(parseInt(checkPosArr[i].x) + 40 > fontPos[i].x && parseInt(checkPosArr[i].x) - 40 < fontPos[i].x && parseInt(checkPosArr[i].y) + 40 > fontPos[i].y && parseInt(checkPosArr[i].y) - 40 < fontPos[i].y)) {
|
|
|
+ flag = false;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return flag;
|
|
|
+ },
|
|
|
+
|
|
|
+ //刷新
|
|
|
+ refresh: function() {
|
|
|
+ var _this = this;
|
|
|
+ this.$element.find('.point-area').remove();
|
|
|
+ this.fontPos = [];
|
|
|
+ this.checkPosArr = [];
|
|
|
+ this.num = 1;
|
|
|
+
|
|
|
+ this.img_rand = Math.floor(Math.random() * this.options.imgName.length); //随机的背景图片
|
|
|
+ var img = new Image();
|
|
|
+ img.src = this.options.imgName[this.img_rand];
|
|
|
+
|
|
|
+
|
|
|
+ // 加载完成开始绘制
|
|
|
+ $(img).on('load', function(e) {
|
|
|
+ this.fontPos = _this.drawImg(_this, this);
|
|
|
+ });
|
|
|
+
|
|
|
+ },
|
|
|
+
|
|
|
+ };
|
|
|
+
|
|
|
+ //在插件中使用codeVerify对象
|
|
|
+ $.fn.codeVerify = function(options, callbacks) {
|
|
|
+ var code = new Code(this, options);
|
|
|
+ code.init();
|
|
|
+ };
|
|
|
+
|
|
|
+ //在插件中使用slideVerify对象
|
|
|
+ $.fn.slideVerify = function(options, callbacks) {
|
|
|
+ var slide = new Slide(this, options);
|
|
|
+ slide.init();
|
|
|
+ };
|
|
|
+
|
|
|
+ //在插件中使用clickVerify对象
|
|
|
+ $.fn.pointsVerify = function(options, callbacks) {
|
|
|
+ var points = new Points(this, options);
|
|
|
+ points.init();
|
|
|
+ };
|
|
|
+
|
|
|
+})(jQuery, window, document);
|