201 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
		
		
			
		
	
	
			201 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * jquery plugin -- jquery.slideunlock.js
							 | 
						||
| 
								 | 
							
								 * Description: a slideunlock plugin based on jQuery
							 | 
						||
| 
								 | 
							
								 * Version: 1.1
							 | 
						||
| 
								 | 
							
								 * Author: Dong Yuhao
							 | 
						||
| 
								 | 
							
								 * 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.getIsOk = function() {
							 | 
						||
| 
								 | 
							
								        return this.isOk;
							 | 
						||
| 
								 | 
							
								    };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /**
							 | 
						||
| 
								 | 
							
								     * 鼠标/手指接触滑动按钮
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    SliderUnlock.prototype.handerIn = function () {
							 | 
						||
| 
								 | 
							
								        var me = this;
							 | 
						||
| 
								 | 
							
								        me.swipestart = true;
							 | 
						||
| 
								 | 
							
								        me.min = 0;
							 | 
						||
| 
								 | 
							
								        me.max = me.elm.width();
							 | 
						||
| 
								 | 
							
								    };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /**
							 | 
						||
| 
								 | 
							
								     * 鼠标/手指移出
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    SliderUnlock.prototype.handerOut = function () {
							 | 
						||
| 
								 | 
							
								        var me = this;
							 | 
						||
| 
								 | 
							
								        //停止
							 | 
						||
| 
								 | 
							
								        me.swipestart = false;
							 | 
						||
| 
								 | 
							
								        //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;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        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);
							 |