zoukankan      html  css  js  c++  java
  • php 滑动验证码

    自己研究: jQuery拖拽滑动验证码插件 slideunlock.js

    原理:(别人说)

    响应时间,拖拽速度,时间,位置,轨迹,重试次数等。
    这些因素能够构成一个采样结果或者辨识特性。

    只获取到滑动时间,滑动的长度。

    效果:

    html页面

    <link href="css/slide-unlock.css" rel="stylesheet">
    <script type="text/javascript" src="js/jquery-2.0.2.min.js"></script>

    <div id="slider">

    <div id="slider_bg"></div>

    <span id="label">>></span> <span id="labelTip">拖动滑块验证</span>

    </div>

    <script>

    var startTime = 0;

        var endTime = 0;

        var numTime = 0;

        $(function () {

                 var slider = new SliderUnlock("#slider",{

                     successLabelTip : "欢迎注册"

            },function(){

    var  sli_width = $("#slider_bg").width();

                alert("验证成功");

                endTime = nowTime();

                numTime = endTime-startTime;

                endTime = 0;

                startTime = 0;

                                // 获取到滑动使用的时间 滑动的宽度

                alert( numTime );

                alert( sli_width );

    });

                 slider.init();

    })

    /**

     * 获取时间精确到毫秒

    * @type

     */

    function nowTime(){

    var myDate = new Date();

    var H = myDate.getHours();//获取小时

    var M = myDate.getMinutes(); //获取分钟

    var S = myDate.getSeconds();//获取秒

    var MS = myDate.getMilliseconds();//获取毫秒

    var milliSeconds = H * 3600 * 1000 + M * 60 * 1000 + S * 1000 + MS;

    return milliSeconds;

    }

    </script>

    <script src="js/jquery.slideunlock.js"></script>

     

    css样式


    #slider {
    margin: 10px 5%;
    90%;
    height: 40px;
    position: relative;
    border-radius: 8px;
    background-color: #dae2d0;
    overflow: hidden;
    text-align: center;
    user-select: none;
    -moz-user-select: none;
    -webkit-user-select: none;
    }

    #slider_bg {
    position: absolute;
    left: 0;
    top: 0;
    height: 100%;
    background-color: #7AC23C;
    z-index: 1;
    }

    #label {
    46px;
    position: absolute;
    left: 0;
    top: 0;
    height: 38px;
    line-height: 38px;
    border: 1px solid #cccccc;
    background: #fff;
    z-index: 3;
    cursor: move;
    color: #ff9e77;
    font-size: 16px;
    font-weight: 900;
    }

    #labelTip {
    position: absolute;
    left: 0;
    100%;
    height: 100%;
    font-size: 13px;
    font-family: 'Microsoft Yahei', serif;
    color: #787878;
    line-height: 38px;
    text-align: center;
    z-index: 2;
    }


    js效果


    /**
    * jquery plugin -- jquery.slideunlock.js
    * www.sucaijiayuan.com
    * created: March 27, 2016
    */

    ;(function ($,window,document,undefined) {
    function SliderUnlock(elm, options, success){
    var me = this;
    var $elm = me.checkElm(elm) ? $(elm) : $;
    success = me.checkFn(success) ? success : function(){};

    var opts = {
    successLabelTip: "Successfully Verified",
    duration: 200,
    swipestart: false,
    min: 0,
    max: $elm.width(),
    index: 0,
    IsOk: false,
    lableIndex: 0
    };

    opts = $.extend(opts, options||{});

    //$elm
    me.elm = $elm;
    //opts
    me.opts = opts;
    //是否开始滑动
    me.swipestart = opts.swipestart;
    //最小值
    me.min = opts.min;
    //最大值
    me.max = opts.max;
    //当前滑动条所处的位置
    me.index = opts.index;
    //是否滑动成功
    me.isOk = opts.isOk;
    //滑块宽度
    me.labelWidth = me.elm.find('#label').width();
    //滑块背景
    me.sliderBg = me.elm.find('#slider_bg');
    //鼠标在滑动按钮的位置
    me.lableIndex = opts.lableIndex;
    //success
    me.success = success;
    }

    SliderUnlock.prototype.init = function () {
    var me = this;

    me.updateView();
    me.elm.find("#label").on("mousedown", function (event) {
    var e = event || window.event;
    me.lableIndex = e.clientX - this.offsetLeft;
    me.handerIn();
    }).on("mousemove", function (event) {
    me.handerMove(event);
    }).on("mouseup", function (event) {
    me.handerOut();
    }).on("mouseout", function (event) {
    me.handerOut();
    }).on("touchstart", function (event) {
    var e = event || window.event;
    me.lableIndex = e.originalEvent.touches[0].pageX - this.offsetLeft;
    me.handerIn();
    }).on("touchmove", function (event) {
    me.handerMove(event, "mobile");
    }).on("touchend", function (event) {
    me.handerOut();
    });
    };

    /**
    * 鼠标/手指接触滑动按钮
    */
    SliderUnlock.prototype.handerIn = function () {
    var me = this;
    me.swipestart = true;

    var myDate = new Date();
    var H = myDate.getHours();//获取小时
    var M = myDate.getMinutes(); //获取分钟
    var S = myDate.getSeconds();//获取秒
    var MS = myDate.getMilliseconds();//获取毫秒
    var milliSeconds = H * 3600 * 1000 + M * 60 * 1000 + S * 1000 + MS;

    startTime = milliSeconds;


    me.min = 0;
    me.max = me.elm.width();
    };

    /**
    * 鼠标/手指移出
    */
    SliderUnlock.prototype.handerOut = function () {
    var me = this;
    //停止
    me.swipestart = false;

    weizhi = me.labelWidth;

    //me.move();
    if (me.index < me.max) {
    me.reset();
    }
    };

    /**
    * 鼠标/手指移动
    * @param event
    * @param type
    */
    SliderUnlock.prototype.handerMove = function (event, type) {
    var me = this;
    if (me.swipestart) {
    event.preventDefault();
    event = event || window.event;
    if (type == "mobile") {
    me.index = event.originalEvent.touches[0].pageX - me.lableIndex;
    } else {
    me.index = event.clientX - me.lableIndex;
    }
    me.move();
    }
    };

    /**
    * 鼠标/手指移动过程
    */
    SliderUnlock.prototype.move = function () {
    var me = this;
    if ((me.index + me.labelWidth) >= me.max) {
    me.index = me.max - me.labelWidth -2;
    //停止
    me.swipestart = false;
    //解锁
    me.isOk = true;
    }
    if (me.index < 0) {
    me.index = me.min;
    //未解锁
    me.isOk = false;
    }
    if (me.index+me.labelWidth+2 == me.max && me.max > 0 && me.isOk) {
    //解锁默认操作
    $('#label').unbind().next('#labelTip').
    text(me.opts.successLabelTip).css({'color': '#fff'});

    me.success();
    }
    me.updateView();
    };


    /**
    * 更新视图
    */
    SliderUnlock.prototype.updateView = function () {
    var me = this;

    me.sliderBg.css('width', me.index);
    me.elm.find("#label").css("left", me.index + "px")
    };

    /**
    * 重置slide的起点
    */
    SliderUnlock.prototype.reset = function () {
    var me = this;

    startTime = 0;

    me.index = 0;
    me.sliderBg .animate({'width':0},me.opts.duration);
    me.elm.find("#label").animate({left: me.index}, me.opts.duration)
    .next("#lableTip").animate({opacity: 1}, me.opts.duration);
    me.updateView();
    };

    /**
    * 检测元素是否存在
    * @param elm
    * @returns {boolean}
    */
    SliderUnlock.prototype.checkElm = function (elm) {
    if($(elm).length > 0){
    return true;
    }else{
    throw "this element does not exist.";
    }
    };

    /**
    * 检测传入参数是否是function
    * @param fn
    * @returns {boolean}
    */
    SliderUnlock.prototype.checkFn = function (fn) {
    if(typeof fn === "function"){
    return true;
    }else{
    throw "the param is not a function.";
    }
    };


    window['SliderUnlock'] = SliderUnlock;
    })(jQuery, window, document);





    两个链接

    https://www.zhihu.com/question/32209043/answer/55252171

    http://www.zhihu.com/question/35538123

  • 相关阅读:
    蠢货之对闭包表的扩展
    蠢货之TaskCompletionSource 带事件的同步调用
    SQLSERVER新建存储过程模板
    缓存更新
    写给”源码爱好者“
    区块链-一个不神秘却总能骗人的东西
    graceful-upgrades-in-go
    谁也逃不过C++
    Go的问题
    面试
  • 原文地址:https://www.cnblogs.com/gyrgyr/p/5953735.html
Copyright © 2011-2022 走看看