verify.js 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745
  1. /*! Verify-v0.1.0 MIT License by 大熊*/
  2. ;(function($, window, document,undefined) {
  3. //定义Code的构造函数
  4. var Code = function(ele, opt) {
  5. this.$element = ele,
  6. this.defaults = {
  7. type : 1,
  8. figure : 100, //位数,仅在type=2时生效
  9. arith : 0, //算法,支持加减乘,0为随机,仅在type=2时生效
  10. width : '200px',
  11. height : '60px',
  12. fontSize : '30px',
  13. codeLength : 6,
  14. btnId : 'check-btn',
  15. ready : function(){},
  16. success : function(){},
  17. error : function(){}
  18. },
  19. this.options = $.extend({}, this.defaults, opt)
  20. };
  21. 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'];
  22. var _code_color1 = ['#fffff0', '#f0ffff', '#f0fff0', '#fff0f0'];
  23. var _code_color2 = ['#FF0033', '#006699', '#993366', '#FF9900', '#66CC66', '#FF33CC'];
  24. //定义Code的方法
  25. Code.prototype = {
  26. init : function() {
  27. var _this = this;
  28. this.loadDom();
  29. this.setCode();
  30. this.options.ready();
  31. this.$element[0].onselectstart = document.body.ondrag = function(){
  32. return false;
  33. };
  34. //点击验证码
  35. this.$element.find('.verify-code, .verify-change-code').on('click', function() {
  36. _this.setCode();
  37. });
  38. //确定的点击事件
  39. this.htmlDoms.code_btn.on('click', function() {
  40. _this.checkCode();
  41. })
  42. },
  43. //加载页面
  44. loadDom : function() {
  45. 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>';
  46. this.$element.append(panelHtml);
  47. this.htmlDoms = {
  48. code_btn : $('#'+this.options.btnId),
  49. code : this.$element.find('.verify-code'),
  50. code_area : this.$element.find('.verify-code-area'),
  51. code_input : this.$element.find('.varify-input-code'),
  52. };
  53. this.htmlDoms.code.css({'width':this.options.width, 'height':this.options.height,'line-height':this.options.height, 'font-size':this.options.fontSize});
  54. this.htmlDoms.code_area.css({'width':this.options.width});
  55. },
  56. //设置验证码
  57. setCode : function() {
  58. var color1Num = Math.floor(Math.random() * 3);
  59. var color2Num = Math.floor(Math.random() * 5);
  60. this.htmlDoms.code.css({'background-color': _code_color1[color1Num], 'color': _code_color2[color2Num]});
  61. this.htmlDoms.code_input.val('');
  62. var code = '';
  63. this.code_chose = '';
  64. if(this.options.type == 1) { //普通验证码
  65. for(var i = 0; i < this.options.codeLength; i++) {
  66. var charNum = Math.floor(Math.random() * 52);
  67. var tmpStyle = (charNum%2 ==0)? "font-style:italic;margin-right: 10px;":"font-weight:bolder;";
  68. tmpStyle += (Math.floor(Math.random() * 2) == 1)? "font-weight:bolder;":"";
  69. this.code_chose += _code_chars[charNum];
  70. code += '<font style="'+tmpStyle+'">'+_code_chars[charNum]+'</font>';
  71. }
  72. }else { //算法验证码
  73. var num1 = Math.floor(Math.random() * this.options.figure);
  74. var num2 = Math.floor(Math.random() * this.options.figure);
  75. if(this.options.arith == 0) {
  76. var tmparith = Math.floor(Math.random() * 3);
  77. }
  78. switch(tmparith) {
  79. case 1 :
  80. this.code_chose = parseInt(num1) + parseInt(num2);
  81. code = num1 + ' + ' + num2 + ' = ?';
  82. break;
  83. case 2 :
  84. if(parseInt(num1) < parseInt(num2)) {
  85. var tmpnum = num1;
  86. num1 = num2;
  87. num2 = tmpnum;
  88. }
  89. this.code_chose = parseInt(num1) - parseInt(num2);
  90. code = num1 + ' - ' + num2 + ' = ?';
  91. break;
  92. default :
  93. this.code_chose = parseInt(num1) * parseInt(num2);
  94. code = num1 + ' × ' + num2 + ' = ?';
  95. break;
  96. }
  97. }
  98. this.htmlDoms.code.html(code);
  99. },
  100. //比对验证码
  101. checkCode : function() {
  102. if(this.options.type == 1) { //普通验证码
  103. var own_input = this.htmlDoms.code_input.val().toUpperCase();
  104. this.code_chose = this.code_chose.toUpperCase();
  105. }else {
  106. var own_input = this.htmlDoms.code_input.val();
  107. }
  108. if(own_input == this.code_chose) {
  109. this.options.success();
  110. }else {
  111. this.options.error();
  112. this.setCode();
  113. }
  114. }
  115. };
  116. //定义Slide的构造函数
  117. var Slide = function(ele, opt) {
  118. this.$element = ele,
  119. this.defaults = {
  120. type : 1,
  121. vOffset: 5,
  122. vSpace : 5,
  123. imgName : ['1.jpg', '2.jpg'],
  124. imgSize : {
  125. width: '400px',
  126. height: '200px',
  127. },
  128. blockSize : {
  129. width: '50px',
  130. height: '50px',
  131. },
  132. barSize : {
  133. width : '400px',
  134. height : '40px',
  135. },
  136. ready : function(){},
  137. success : function(){},
  138. error : function(){}
  139. },
  140. this.options = $.extend({}, this.defaults, opt)
  141. };
  142. //定义Slide的方法
  143. Slide.prototype = {
  144. init: function() {
  145. var _this = this;
  146. //加载页面
  147. this.loadDom();
  148. this.options.ready();
  149. this.$element[0].onselectstart = document.body.ondrag = function(){
  150. return false;
  151. };
  152. //按下
  153. this.htmlDoms.move_block.on('touchstart', function(e) {
  154. _this.start(e);
  155. });
  156. this.htmlDoms.move_block.on('mousedown', function(e) {
  157. _this.start(e);
  158. });
  159. //拖动
  160. window.addEventListener("touchmove", function(e) {
  161. _this.move(e);
  162. });
  163. window.addEventListener("mousemove", function(e) {
  164. _this.move(e);
  165. });
  166. //鼠标松开
  167. window.addEventListener("touchend", function() {
  168. _this.end();
  169. });
  170. window.addEventListener("mouseup", function() {
  171. _this.end();
  172. });
  173. //刷新
  174. _this.$element.find('.verify-refresh').on('click', function() {
  175. _this.refresh();
  176. });
  177. },
  178. //初始化加载
  179. loadDom : function() {
  180. this.img_rand = Math.floor(Math.random() * this.options.imgName.length); //随机的背景图片
  181. var panelHtml = '';
  182. var tmpHtml = '';
  183. if(this.options.type != 1) { //图片滑动
  184. 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>';
  185. tmpHtml = '<div style="position: absolute;text-align: center;z-index: 3;border: 1px solid #fff;" class="verify-sub-block"></div>';
  186. }
  187. 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>';
  188. this.$element.append(panelHtml);
  189. this.htmlDoms = {
  190. gap : this.$element.find('.verify-gap'),
  191. sub_block : this.$element.find('.verify-sub-block'),
  192. img_panel : this.$element.find('.verify-img-panel'),
  193. bar_area : this.$element.find('.verify-bar-area'),
  194. move_block : this.$element.find('.verify-move-block'),
  195. left_bar : this.$element.find('.verify-left-bar'),
  196. msg : this.$element.find('.verify-msg'),
  197. icon : this.$element.find('.verify-icon'),
  198. refresh :this.$element.find('.verify-refresh')
  199. };
  200. this.status = false; //鼠标状态
  201. this.setSize = this.resetSize(this); //重新设置宽度高度
  202. this.htmlDoms.gap.css({'width': this.options.blockSize.width, 'height': this.options.blockSize.height});
  203. this.htmlDoms.sub_block.css({'width': this.options.blockSize.width, 'height': this.options.blockSize.height});
  204. 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});
  205. this.htmlDoms.bar_area.css({'width': this.setSize.bar_width, 'height': this.options.barSize.height, 'line-height':this.options.barSize.height});
  206. this.htmlDoms.move_block.css({'width': this.options.barSize.height, 'height': this.options.barSize.height});
  207. this.htmlDoms.left_bar.css({'width': this.options.barSize.height, 'height': this.options.barSize.height});
  208. this.randSet();
  209. },
  210. //鼠标按下
  211. start: function(e) {
  212. this.htmlDoms.msg.text('');
  213. this.htmlDoms.move_block.css('background-color', '#337ab7');
  214. this.htmlDoms.left_bar.addClass('verify-left-bar-active');
  215. // this.htmlDoms.left_bar.css('border-color', '#337AB7');
  216. this.htmlDoms.icon.css('color', '#fff');
  217. e.stopPropagation();
  218. this.status = true;
  219. },
  220. //鼠标移动
  221. move: function(e) {
  222. if(this.status) {
  223. if(!e.touches) { //兼容移动端
  224. var x = e.clientX;
  225. }else { //兼容PC端
  226. var x = e.touches[0].pageX;
  227. }
  228. var bar_area_left = Slide.prototype.getLeft(this.htmlDoms.bar_area[0]);
  229. var move_block_left = x - bar_area_left; //小方块相对于父元素的left值
  230. if(this.options.type != 1) { //图片滑动
  231. if(move_block_left >= this.htmlDoms.bar_area[0].offsetWidth - parseInt(parseInt(this.options.blockSize.width)/2) - 2) {
  232. move_block_left = this.htmlDoms.bar_area[0].offsetWidth - parseInt(parseInt(this.options.blockSize.width)/2) - 2;
  233. }
  234. }else { //普通滑动
  235. if(move_block_left >= this.htmlDoms.bar_area[0].offsetWidth - parseInt(parseInt(this.options.barSize.height)/2) + 3) {
  236. this.$element.find('.verify-msg:eq(1)').text('松开验证');
  237. move_block_left = this.htmlDoms.bar_area[0].offsetWidth - parseInt(parseInt(this.options.barSize.height)/2) + 3;
  238. }else {
  239. this.$element.find('.verify-msg:eq(1)').text('');
  240. }
  241. }
  242. if(move_block_left <= 0) {
  243. move_block_left = parseInt(parseInt(this.options.blockSize.width)/2);
  244. }
  245. //拖动后小方块的left值
  246. this.htmlDoms.move_block.css('left', move_block_left-parseInt(parseInt(this.options.blockSize.width)/2) + "px");
  247. this.htmlDoms.left_bar.css('width', move_block_left-parseInt(parseInt(this.options.blockSize.width)/2) + "px");
  248. }
  249. },
  250. //鼠标松开
  251. end: function() {
  252. var _this = this;
  253. //判断是否重合
  254. if(this.status) {
  255. if(this.options.type != 1) { //图片滑动
  256. var vOffset = parseInt(this.options.vOffset);
  257. 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)) {
  258. this.htmlDoms.move_block.css('background-color', '#5cb85c');
  259. this.htmlDoms.left_bar.addClass('verify-left-bar-success');
  260. // this.htmlDoms.left_bar.css({'border-color': '#5cb85c', 'background-color': '#fff'});
  261. this.htmlDoms.icon.css('color', '#fff');
  262. this.htmlDoms.icon.removeClass('icon-jinru');
  263. this.htmlDoms.icon.addClass('icon-dagou');
  264. this.htmlDoms.refresh.hide();
  265. this.htmlDoms.move_block.unbind('mousedown touchstart');
  266. this.options.success();
  267. }else{
  268. this.htmlDoms.move_block.css('background-color', '#d9534f');
  269. this.htmlDoms.left_bar.addClass('verify-left-bar-error');
  270. // this.htmlDoms.left_bar.css('border-color', '#d9534f');
  271. this.htmlDoms.icon.css('color', '#fff');
  272. this.htmlDoms.icon.removeClass('icon-jinru');
  273. this.htmlDoms.icon.addClass('icon-guanbi1');
  274. setTimeout(function () {
  275. _this.htmlDoms.move_block.animate({'left':'0px'}, 'fast');
  276. _this.htmlDoms.left_bar.animate({'width': '40px'}, 'fast');
  277. _this.htmlDoms.left_bar.removeClass('verify-left-bar-active');
  278. _this.htmlDoms.left_bar.removeClass('verify-left-bar-success');
  279. _this.htmlDoms.left_bar.removeClass('verify-left-bar-error');
  280. // _this.htmlDoms.left_bar.css({'border-color': '#ddd'});
  281. _this.htmlDoms.move_block.css('background-color', '#fff');
  282. _this.htmlDoms.icon.css('color', '#000');
  283. _this.htmlDoms.icon.removeClass('icon-guanbi1');
  284. _this.htmlDoms.icon.addClass('icon-jinru');
  285. _this.$element.find('.verify-msg:eq(0)').text('向右滑动完成验证');
  286. }, 400);
  287. this.options.error();
  288. }
  289. }else { //普通滑动
  290. if(parseInt(this.htmlDoms.move_block.css('left')) >= (parseInt(this.setSize.bar_width) - parseInt(this.options.barSize.height) - parseInt(this.options.vOffset))) {
  291. this.htmlDoms.move_block.css('background-color', '#5cb85c');
  292. this.htmlDoms.left_bar.addClass('verify-left-bar-success');
  293. // this.htmlDoms.left_bar.css({'color': '#4cae4c', 'border-color': '#5cb85c', 'background-color': '#fff' });
  294. this.htmlDoms.icon.css('color', '#fff');
  295. this.htmlDoms.icon.removeClass('icon-jinru');
  296. this.htmlDoms.icon.addClass('icon-dagou');
  297. this.htmlDoms.refresh.hide();
  298. this.htmlDoms.move_block.unbind('mousedown');
  299. this.htmlDoms.move_block.unbind('touchstart');
  300. this.$element.find('.verify-msg:eq(1)').text('验证成功');
  301. this.options.success();
  302. }else {
  303. this.htmlDoms.move_block.css('background-color', '#d9534f');
  304. this.htmlDoms.left_bar.addClass('verify-left-bar-error');
  305. // this.htmlDoms.left_bar.css('border-color', '#d9534f');
  306. this.htmlDoms.icon.css('color', '#fff');
  307. this.htmlDoms.icon.removeClass('icon-jinru');
  308. this.htmlDoms.icon.addClass('icon-guanbi1');
  309. setTimeout(function () {
  310. _this.htmlDoms.move_block.animate({'left':'0px'}, 'fast');
  311. _this.htmlDoms.left_bar.animate({'width': '40px'}, 'fast');
  312. _this.htmlDoms.left_bar.removeClass('verify-left-bar-active');
  313. _this.htmlDoms.left_bar.removeClass('verify-left-bar-success');
  314. _this.htmlDoms.left_bar.removeClass('verify-left-bar-error');
  315. // _this.htmlDoms.left_bar.css({'border-color': '#ddd'});
  316. _this.htmlDoms.move_block.css('background-color', '#fff');
  317. _this.htmlDoms.icon.css('color', '#000');
  318. _this.htmlDoms.icon.removeClass('icon-guanbi1');
  319. _this.htmlDoms.icon.addClass('icon-jinru');
  320. _this.$element.find('.verify-msg:eq(0)').text('向右滑动解锁');
  321. }, 400);
  322. this.options.error();
  323. }
  324. }
  325. this.status = false;
  326. }
  327. },
  328. resetSize : function(obj) {
  329. var img_width,img_height,bar_width,bar_height; //图片的宽度、高度,移动条的宽度、高度
  330. var parentWidth = obj.$element.parent().width() || $(window).width();
  331. var parentHeight = obj.$element.parent().height() || $(window).height();
  332. if(obj.options.imgSize.width.indexOf('%')!= -1){
  333. img_width = parseInt(obj.options.imgSize.width)/100 * parentWidth + 'px';
  334.   }else {
  335. img_width = obj.options.imgSize.width;
  336. }
  337. if(obj.options.imgSize.height.indexOf('%')!= -1){
  338. img_height = parseInt(obj.options.imgSize.height)/100 * parentHeight + 'px';
  339.   }else {
  340. img_height = obj.options.imgSize.height;
  341. }
  342. if(obj.options.barSize.width.indexOf('%')!= -1){
  343. bar_width = parseInt(obj.options.barSize.width)/100 * parentWidth + 'px';
  344.   }else {
  345. bar_width = obj.options.barSize.width;
  346. }
  347. if(obj.options.barSize.height.indexOf('%')!= -1){
  348. bar_height = parseInt(obj.options.barSize.height)/100 * parentHeight + 'px';
  349.   }else {
  350. bar_height = obj.options.barSize.height;
  351. }
  352. return {img_width : img_width, img_height : img_height, bar_width : bar_width, bar_height : bar_height};
  353. },
  354. //随机出生点位
  355. randSet: function() {
  356. var rand1 = Math.floor(Math.random()*9+1);
  357. var rand2 = Math.floor(Math.random()*9+1);
  358. var top = rand1 * parseInt(this.setSize.img_height)/15 + parseInt(this.setSize.img_height) * 0.1;
  359. var left = rand2 * parseInt(this.setSize.img_width)/15 + parseInt(this.setSize.img_width) * 0.1;
  360. this.$element.find('.verify-img-panel').css('margin-bottom', this.options.vSpace + 'px');
  361. this.$element.find('.verify-gap').css({'top': top, 'left': left});
  362. 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'});
  363. },
  364. //刷新
  365. refresh: function() {
  366. this.randSet();
  367. this.img_rand = Math.floor(Math.random() * this.options.imgName.length); //随机的背景图片
  368. 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});
  369. 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});
  370. },
  371. //获取left值
  372. getLeft: function(node) {
  373. var left = $(node).offset().left;
  374. // var nowPos = node.offsetParent;
  375. //
  376. // while(nowPos != null) {  
  377. // left += $(nowPos).offset().left; 
  378. // nowPos = nowPos.offsetParent;  
  379. // }
  380. return left;
  381. }
  382. };
  383. //定义Points的构造函数
  384. var Points = function(ele, opt) {
  385. this.$element = ele,
  386. this.defaults = {
  387. defaultNum : 4, //默认的文字数量
  388. checkNum : 3, //校对的文字数量
  389. vSpace : 5, //间隔
  390. imgName : ['1.jpg', '2.jpg'],
  391. imgSize : {
  392. width: '400px',
  393. height: '200px',
  394. },
  395. barSize : {
  396. width : '400px',
  397. height : '40px',
  398. },
  399. ready : function(){},
  400. success : function(){},
  401. error : function(){}
  402. },
  403. this.options = $.extend({}, this.defaults, opt)
  404. };
  405. //定义Points的方法
  406. Points.prototype = {
  407. init : function() {
  408. var _this = this;
  409. //加载页面
  410. _this.loadDom();
  411. _this.refresh();
  412. _this.options.ready();
  413. this.$element[0].onselectstart = document.body.ondrag = function(){
  414. return false;
  415. };
  416. //点击事件比对
  417. _this.$element.find('.verify-img-panel canvas').on('click', function(e) {
  418. _this.checkPosArr.push(_this.getMousePos(this, e));
  419. if(_this.num == _this.options.checkNum) {
  420. _this.num = _this.createPoint(_this.getMousePos(this, e));
  421. setTimeout(function () {
  422. var flag = _this.comparePos(_this.fontPos, _this.checkPosArr);
  423. if(flag == false) { //验证失败
  424. _this.options.error();
  425. _this.$element.find('.verify-bar-area').css({'color': '#d9534f', 'border-color': '#d9534f'});
  426. _this.$element.find('.verify-msg').text('验证失败');
  427. setTimeout(function () {
  428. _this.$element.find('.verify-bar-area').css({'color': '#000','border-color': '#ddd'});
  429. _this.refresh();
  430. }, 400);
  431. }else { //验证成功
  432. _this.$element.find('.verify-bar-area').css({'color': '#4cae4c', 'border-color': '#5cb85c'});
  433. _this.$element.find('.verify-msg').text('验证成功');
  434. _this.$element.find('.verify-refresh').hide();
  435. _this.$element.find('.verify-img-panel').unbind('click');
  436. _this.options.success();
  437. }
  438. }, 400);
  439. }
  440. if(_this.num < _this.options.checkNum) {
  441. _this.num = _this.createPoint(_this.getMousePos(this, e));
  442. }
  443. });
  444. //刷新
  445. _this.$element.find('.verify-refresh').on('click', function() {
  446. _this.refresh();
  447. });
  448. },
  449. //加载页面
  450. loadDom : function() {
  451. this.fontPos = []; //选中的坐标信息
  452. this.checkPosArr = []; //用户点击的坐标
  453. this.num = 1; //点击的记数
  454. this.img_rand = Math.floor(Math.random() * this.options.imgName.length); //随机的背景图片
  455. var panelHtml = '';
  456. var tmpHtml = '';
  457. this.setSize = Slide.prototype.resetSize(this); //重新设置宽度高度
  458. 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>';
  459. this.$element.append(panelHtml);
  460. this.htmlDoms = {
  461. img_panel : this.$element.find('.verify-img-panel'),
  462. bar_area : this.$element.find('.verify-bar-area'),
  463. msg : this.$element.find('.verify-msg'),
  464. };
  465. 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'});
  466. this.htmlDoms.bar_area.css({'width': this.options.barSize.width, 'height': this.options.barSize.height, 'line-height':this.options.barSize.height});
  467. },
  468. //绘制合成的图片
  469. drawImg : function(obj, img) {
  470. //准备canvas环境
  471. var canvas = this.$element.find('canvas')[0];
  472. //var canvas=document.getElementById("myCanvas");
  473. var ctx=canvas.getContext("2d");
  474. // 绘制图片
  475. ctx.drawImage(img,0,0, parseInt(this.setSize.img_width), parseInt(this.setSize.img_height));
  476. // 绘制水印
  477. var fontSizeArr = ['italic small-caps bold 20px microsoft yahei', 'small-caps normal 25px arial', '34px microsoft yahei'];
  478. var fontStr = '天地玄黄宇宙洪荒日月盈昃辰宿列张寒来暑往秋收冬藏闰余成岁律吕调阳云腾致雨露结为霜金生丽水玉出昆冈剑号巨阙珠称夜光果珍李柰菜重芥姜海咸河淡鳞潜羽翔龙师火帝鸟官人皇始制文字乃服衣裳推位让国有虞陶唐吊民伐罪周发殷汤坐朝问道垂拱平章爱育黎首臣伏戎羌遐迩体率宾归王'; //不重复的汉字
  479. var fontChars = [];
  480. var avg = Math.floor(parseInt(this.setSize.img_width)/(parseInt(this.options.defaultNum)+1));
  481. var tmp_index = '';
  482. var color2Num = Math.floor(Math.random() * 5);
  483. for(var i = 1; i <= this.options.defaultNum; i++) {
  484. fontChars[i-1] = this.getChars(fontStr, fontChars);
  485. tmp_index = Math.floor(Math.random()*3);
  486. ctx.font = fontSizeArr[tmp_index];
  487. ctx.fillStyle = _code_color2[color2Num];
  488. if(Math.floor(Math.random() * 2) == 1) {
  489. var tmp_y = Math.floor(parseInt(this.setSize.img_height)/2) + tmp_index*20 + 20;
  490. }else {
  491. var tmp_y = Math.floor(parseInt(this.setSize.img_height)/2) - tmp_index*20;
  492. }
  493. ctx.fillText(fontChars[i-1],avg * i, tmp_y);
  494. this.fontPos[i-1] = {'char': fontChars[i-1], 'x': avg * i, 'y': tmp_y};
  495. }
  496. for(var i = 0; i < (this.options.defaultNum-this.options.checkNum); i++) {
  497. this.shuffle(this.fontPos).pop();
  498. }
  499. var msgStr = '';
  500. for(var i = 0; i < this.fontPos.length; i++) {
  501. msgStr += this.fontPos[i].char + ',';
  502. }
  503. this.htmlDoms.msg.text('请顺序点击【' + msgStr.substring(0,msgStr.length-1) + '】');
  504. return this.fontPos;
  505. },
  506. //获取坐标
  507. getMousePos :function(obj, event) {
  508. var e = event || window.event;
  509. var scrollX = document.documentElement.scrollLeft || document.body.scrollLeft;
  510. var scrollY = document.documentElement.scrollTop || document.body.scrollTop;
  511. var x = e.clientX - ($(obj).offset().left - $(window).scrollLeft());
  512. var y = e.clientY - ($(obj).offset().top - $(window).scrollTop());
  513. return {'x': x, 'y': y};
  514. },
  515. //递归去重
  516. getChars : function(fontStr, fontChars) {
  517. var tmp_rand = parseInt(Math.floor(Math.random() * fontStr.length));
  518. if(tmp_rand > 0) {
  519. tmp_rand = tmp_rand - 1;
  520. }
  521. tmp_char = fontStr.charAt(tmp_rand);
  522. if($.inArray(tmp_char, fontChars) == -1) {
  523. return tmp_char;
  524. }else {
  525. return Points.prototype.getChars(fontStr, fontChars);
  526. }
  527. },
  528. //洗牌数组
  529. shuffle : function(arr) {
  530. var m = arr.length, i;
  531. while (m) {
  532. i = (Math.random() * m--) >>> 0;
  533. [arr[m], arr[i]] = [arr[i], arr[m]]
  534. }
  535. return arr;
  536. },
  537. //创建坐标点
  538. createPoint : function (pos) {
  539. 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>');
  540. return ++this.num;
  541. },
  542. //比对坐标点
  543. comparePos : function (fontPos, checkPosArr) {
  544. var flag = true;
  545. for(var i = 0; i < fontPos.length; i++) {
  546. 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)) {
  547. flag = false;
  548. break;
  549. }
  550. }
  551. return flag;
  552. },
  553. //刷新
  554. refresh: function() {
  555. var _this = this;
  556. this.$element.find('.point-area').remove();
  557. this.fontPos = [];
  558. this.checkPosArr = [];
  559. this.num = 1;
  560. this.img_rand = Math.floor(Math.random() * this.options.imgName.length); //随机的背景图片
  561. var img = new Image();
  562. img.src = this.options.imgName[this.img_rand];
  563. // 加载完成开始绘制
  564. $(img).on('load', function(e) {
  565. this.fontPos = _this.drawImg(_this, this);
  566. });
  567. },
  568. };
  569. //在插件中使用codeVerify对象
  570. $.fn.codeVerify = function(options, callbacks) {
  571. var code = new Code(this, options);
  572. code.init();
  573. };
  574. //在插件中使用slideVerify对象
  575. $.fn.slideVerify = function(options, callbacks) {
  576. var slide = new Slide(this, options);
  577. slide.init();
  578. };
  579. //在插件中使用clickVerify对象
  580. $.fn.pointsVerify = function(options, callbacks) {
  581. var points = new Points(this, options);
  582. points.init();
  583. };
  584. })(jQuery, window, document);