var urlCapta = "/en/account/SlideVerificationCode" //var url = "http://localhost:65317/VerificationCode/"; var IdCapta = ""; /* * drag 1.1 * date 2017-02-10 * 获取滑块验证码 * JavaScript工具推荐: * http://tool.lu/js */ (function($) { var __imgx = 0, //图片宽度 __imgy = 0, //图片高度 __spec = "", //图片尺寸 __executename, //校验通过后执行的函数 __codediv; //验证码区域的div $.fn.captaSlide = function(imgspec, exename) { //校验参数 if (imgspec == null) { imgspec = "300*300"; } else if (typeof imgspec !== "string") { imgspec = "300*300"; } var div = this; __codediv = div.attr("id"); __spec = imgspec; __executename = exename; if (__codediv === undefined) { throw div.selector + ' does not exist'; } __init(); this.off("refresh").on("refresh", __init); }; //载入 function __init() { if (__spec === "") __spec = "300*300"; var _spec = __spec.split('*'); __imgx = _spec[0]; __imgy = _spec[1]; CreadeCodeDiv(); $("#" + __codediv).css("width", __imgx); $("#" + __codediv).css("height", parseInt(__imgy) + $('#drag').height()+10); $('#drag').drag(__executename, __imgx, __imgy, __codediv); $.ajax({ //获取验证码 type: "POST", url: urlCapta + "?action=getcode", dataType: "JSON", async: true, data: { spec: __spec }, success: function(result) { IdCapta = result['Id']; if (result['state'] === -1) { return; } var errcode = result['errcode']; if (errcode !== 0) { document.getElementById(__codediv).innerHTML = "" + $("#slidecodefailure").val() + result['errmsg'] + ""; } var yvalue = result['y'], small = result['small'], array = result['array'], normal = result['normal']; __imgx = result['imgx']; __imgy = result['imgy']; $(".cut_bg").css("background-image", "url(" + normal + ")"); $("#xy_img").css("background-image", "url(" + small + ")"); $("#xy_img").css("top", yvalue); $("#drag").css("width", __imgx); $("#drag .drag_text").css("width", __imgx); $(".cut_bg").css("width", __imgx / 10); $(".cut_bg").css("height", __imgy / 2); $(".refesh_bg").show(); // $(".refesh_bg").css("left", __imgx - 25); var bgarray = array.split(','); //还原图片 var _cutX = __imgx / 10; var _cutY = __imgy / 2; for (var i = 0; i < bgarray.length; i++) { var num = indexOf(bgarray, i.toString()); //第i张图相对于混淆图片的位置为num var x = 0, y = 0; //还原前偏移 y = i > 9 ? -_cutY : 0; x = i > 9 ? (i - 10) * -_cutX : i * -_cutX; //当前y轴偏移量 if (num > 9 && i < 10) y = y - _cutY; if (i > 9 && num < 10) y = y + _cutY; //当前x轴偏移量 x = x + (num - i) * -_cutX; //显示第i张图片 $("#bb" + i).css("background-position", x + "px " + y + "px"); } //完成,移除提示 $(".vcode-hints").remove(); }, beforeSend: function() {} }); } function indexOf(arr, str) { if (arr && arr.indexOf) return arr.indexOf(str); var len = arr.length; for (var i = 0; i < len; i++) { if (arr[i] === str) return i; } return -1; } //绘制验证码结构 function CreadeCodeDiv() { var __codeDIV = document.getElementById(__codediv); __codeDIV.innerHTML = ''; var __codeHTML = "
"; //正在载入提示文字 __codeHTML += "
" + $("#slidecodeload").val() + "...
"; for (var i = 0; i < 20; i++) { //20张小图组成完整的验证码图片 __codeHTML += "
"; } __codeHTML += "
"+$("#slidedragerrortips").val()+"
"; __codeDIV.innerHTML = __codeHTML; } })(jQuery); /* * * date 2017-02-10 * 滑块验证码校验 */ (function($) { $.fn.drag = function(executename, imgx, imgy, __codediv) { var x, $dragBar = this, isMove = false; //添加背景,文字,滑块 var html = '
' + $("#slidecodedrag").val() + '
' + '
'; $dragBar.append(html); var $refeshBg = $dragBar.find(".refesh_bg") var handler = $dragBar.find('.handler'), // $dragBar = $("#drag"), $splitImgWrap = $(".splitImgWrap"), drag_bg = $dragBar.find('.drag_bg'), $dragText = $dragBar.find('.drag_text'), maxHandleWidth = imgx- handler.width(), //能滑动的最大间距 maxPicWidth = imgx-$("#xy_img").width(),//图片跟随的间距 picwidthRate = maxPicWidth/maxHandleWidth, errerTimer, t1 = new Date(), //开始滑动时间 t2 = new Date(); //结束滑动时间 var $xy_img = $("#xy_img"); var arrayDate = new Array(); //鼠标/手指移动轨迹 $refeshBg.on("click", function() { $dragBar.trigger("refresh"); }) $dragText.css("width", imgx); /* *鼠标/手指在上下文移动时, *移动距离大于0小于最大间距 *滑块x轴位置等于鼠标移动距离 *绑定document防止鼠标/手指 *离开滑块时监听停止 */ handler.mousedown(function(e) { dragstart(e.pageX); }); //鼠标按下 $(document).mousemove(function(e) { dragmoving(e.pageX); }); //移动鼠标 $(document).mouseup(function(e) { dragmovend(e.pageX); }); //松开鼠标 handler.mouseout(function(e) {}); //鼠标移出元素 handler.on("touchstart", function(e) { dragstart(e.originalEvent.touches[0].pageX); //阻止页面的滑动默认事件 document.addEventListener("touchmove", defaultEvent, { passive: false }); }); //手指按下 $(document).on("touchmove", function(e) { dragmoving(e.originalEvent.touches[0].pageX); }); //手指移动 $(document).on("touchend", function(e) { dragmovend(e.originalEvent.changedTouches[0].pageX); //阻止页面的滑动默认事件 document.removeEventListener("touchmove", defaultEvent, { passive: false }); }); //手指松开 //鼠标/手指开始滑动 function dragstart(thisx) { //if (thisx >= maxWidth) { // return; //} $xy_img.show(); $refeshBg.hide(); $dragText.hide(); isMove = true; x = thisx - parseInt(handler.css('left'), 10); t1 = new Date(); } //鼠标/手指移动过程 function dragmoving(thisx) { var _x = thisx - x; if (isMove) { if (_x > -2 && _x <= maxHandleWidth) { $xy_img.css({ 'left': _x*picwidthRate }); handler.css({ 'left': _x }); drag_bg.css({ 'width': _x }); arrayDate.push([_x, new Date().getTime()]); }else if (_x > maxHandleWidth) { //鼠标指针移动距离达到最大时清空事件 $xy_img.css({ 'left': maxHandleWidth*picwidthRate }); handler.css({ 'left': maxHandleWidth }); drag_bg.css({ 'width': maxHandleWidth }); }else{ $xy_img.css({ 'left':0}); handler.css({ 'left': -2 }); drag_bg.css({ 'width': 0 }); } } } //取消事件的默认动作 //防止一些Android浏览器页面跟随滑动的情况 function defaultEvent(e) { e.preventDefault(); } //鼠标/手指移动结束 function dragmovend(thisx) { if (!isMove) { //没有滑动过程 直接返回 return; } isMove = false; if (isNaN(x) || x === undefined) { return; } var _x = Math.round(thisx - x); //取整 if (_x < 10) { dragBack() return; } t2 = new Date(); $dragBar.addClass("loading"); $splitImgWrap.addClass("loading"); $.ajax({ //校验 type: "POST", url: urlCapta + "?action=check", dataType: "json", // async: true, data: { Id: IdCapta, point: Math.floor(_x*picwidthRate), timespan: t2 - t1, datelist: arrayDate.join("|") }, success: function(result) { $dragBar.removeClass("loading"); $splitImgWrap.removeClass("loading"); if (result['state'] === 0) { //成功 dragOk(); var token = result['token']; //用于后台验证 if (typeof executename == "function") { executename("&vcodeid=" + IdCapta + "&vtoken=" + token) } } else { //失败 dragError(result); } }, error: function(xhr, response, text) { $dragBar.removeClass("loading"); $splitImgWrap.removeClass("loading"); dragError(text); } }); } function dragError(result) { $dragBar.addClass("dragError"); $splitImgWrap.addClass("dragError"); clearTimeout(errerTimer); if (result && result['state'] == -10014) { //超过最大错误次数限制 刷新验证码 $dragBar.trigger("refresh"); } errerTimer = setTimeout(function(){ $dragBar.removeClass("dragError"); $splitImgWrap.removeClass("dragError"); dragBack(); },1000) } function dragBack(){ $refeshBg.show(); $dragText.show(); $xy_img.css({ 'left': 0 }); handler.css({ 'left': -2 }); drag_bg.css({ 'width': 0 }); } //清空事件 function dragOk() { //抖动效果 // for (var i = 1; 4 >= i; i++) { // $xy_img.animate({ left: _x - (40 - 10 * i) }, 50); // $xy_img.animate({ left: _x + 2 * (40 - 10 * i) }, 50, function () { // $xy_img.css({ 'left': result['data'] }); // }); // } $dragBar.addClass("dragSuccess"); $splitImgWrap.addClass("dragSuccess"); handler.css({ 'left': maxHandleWidth }); drag_bg.css({ 'width': imgx }); $xy_img.removeClass('xy_img_bord'); $dragText.show().text($("#slidecodesuccess").val()); //验证通过 handler.unbind('mousedown'); $(document).unbind('mousemove'); $(document).unbind('mouseup'); } }; })(jQuery);