分页小demo

150 阅读1分钟

//2017-11-20

基于jquery的分页小demo

function Pagination(options){
    var opts = $.extend({
        node : null,
        display : 5,
        isNeedQuick : true,
        isNeedInput : true,
        callback : null
    },options);
    //容器
    this.node = opts.node;
    this.display = opts.display;
    this.isNeedQuick = opts.isNeedQuick;
    this.isNeedInput = opts.isNeedInput;
    this.callback = opts.callback;
    this.state = {
        cur : -1,
        total : -1
    };
    //标注是否初始化创建
    this.initCreate = true;
};
Pagination.prototype = {
    constructor : Pagination,
    trigger : function(cur,total){
        var _this = this;
        if(!_this.node || !_this.node.length){return}
        _this.setState(cur,total);
    },
    //设置state
    setState : function(){
        var _this = this;
        var args = [].slice.call(arguments);
        var status = false;
        if(typeof args[0] == 'number' && args[0] >= 1 && _this.state.cur != args[0]){
           _this.state.cur = args[0];
           status = true;
        }
        if(typeof args[1] == 'number' && args[1] >= 1 && _this.state.total != args[1]){
            _this.state.total = args[1];
            status = true;
        }
        if(status){
            if(_this.initCreate){
                _this.handleCreate();
            }else{
                _this.createPage();
            } 
        }
    },
    //创建页码
    handleCreate : function(){
        var _this = this;
        if(_this.state.total < 0){return}
        _this.pageBox = $("<div class='vo_pagination clearfix'>");
        //创建页码
        _this.createPage();
        //快捷按钮
        _this.createQuick();
        //创建输入
        _this.createInput();
        //插入
        _this.node.html(_this.pageBox);
        //绑定事件
        _this.bindEve();
        //关闭初始化状态
        _this.initCreate = false;
    },
    //创建快捷按钮
    createQuick : function(){
        var _this = this;
        if(!_this.isNeedQuick){return}
        var firstBtn = $("<a class='first-btn' data-quick='first' href='javascript:;'>首页</a>"),
            prevBtn = $("<a class='prev-btn' data-quick='prev' href='javascript:;'>上一页</a>"),
            nextBtn = $("<a class='next-btn' data-quick='next' href='javascript:;'>下一页</a>"),
            lastBtn = $("<a class='last-btn' data-quick='last' href='javascript:;'>末页</a>");
        //插入
        _this.pageBox.prepend(prevBtn).prepend(firstBtn).append(nextBtn).append(lastBtn);

    },
    //创建页码
    createPage:function(){
        var _this = this;
        if(!_this.pageGroup){
            _this.pageGroup = $("<div class='page-group'></div>");
            _this.pageBox.html(_this.pageGroup);
        }
        var group = [];
        var len = _this.state.total > _this.display ? _this.display : _this.state.total;
        var start = _this.getStartPage();
        for(var i = 0; i < len; i++){
            var page = start + i;
            var className = page == _this.state.cur ? 'page-btn on' : 'page-btn';
            group.push("<a href='javascript:;' class='" + className + "' data-page='" + page + "'>" + page + "</a>");
        }
        //插入
        _this.pageGroup.html(group.join(''));
        //省略号
        if(start + i <= _this.state.total){
            _this.pageGroup.append("<span class='ellipsis'>...</span>");
        }else if(start > 1){
            _this.pageGroup.prepend("<span class='ellipsis'>...</span>");
        }

    },
    //获取开始页码
    getStartPage:function(){
        var _this = this;
        var start = 1;
        if(_this.display >= _this.state.total){
            return start;
        }
        var half = Math.floor(_this.display/2);
        start = _this.state.cur > half ? _this.state.cur - half : start;
        start = _this.state.cur + half >= _this.state.total ? _this.state.total - _this.display + 1 : start;
        return start;
    },
    //创建输入
    createInput:function(){
        var _this = this;
        if(!_this.isNeedInput){return}
        if(!_this.inputGroup){
            _this.inputGroup = $("<div class='input-group clearfix'></div>");
            _this.pageBox.append(_this.inputGroup);
        }
        var group = ["<span>第</span>"];
        group.push("<input type='text' data-node='text'/>");
        group.push("<span>页</span>");
        group.push("<a href='javascript:;' data-node='submit' class='submit-btn'>GO</a>");
        _this.inputGroup.html(group.join(''));
        //设置节点
        _this.inputText = _this.inputGroup.find("[data-node='text']");
        _this.inputBtn = _this.inputGroup.find("[data-node='submit']");
    },
    //用户操作
    handleUserAction : function(page){
        var _this = this;
        _this.setState(page);
        //回调
        if(typeof _this.callback == 'function'){
            _this.callback.call(_this,_this.state.cur);
        }
    },
    //快捷按钮
    handleQuick : function(){
        var _this = this;
        return function(){
            var quick = $(this).attr('data-quick');
            var cur = _this.state.cur,
                total = _this.state.total;
            var page = -1;
            switch(quick){
                case 'first':
                    page = cur == 1 ? page : 1;
                    break;
                case 'prev':
                    page = (cur - 1 >= 1) ? cur - 1 : page;
                    break;
                case 'next':
                    page = (cur + 1 > total) ? page : cur + 1;
                    break;
                case 'last':
                    page = cur == total ? page : total;
                    break;
            }
            if(page > -1){
                _this.handleUserAction(page);
            }
        }
    },
    //页码
    handlePage : function(){
        var _this = this;
        return function(){
            var page = parseInt($(this).attr('data-page'));
            if(page == _this.state.cur){ return false}
            _this.handleUserAction(page);
            return false;
        }
    },
    //检测输入值
    testInputPage : function(page){
        var _this = this;
        if(page == '' || isNaN(page)){
            alert('输入页码必须为数字!');
            return -1;
        }
        page = parseInt(page);
        if(page < 1 || page > _this.state.total){
            alert('输入页码不合法!')
            return -1;
        }
        return page;
    }, 
    //提交
    handleSubmit : function(){
        var _this = this;
        var page = _this.testInputPage(_this.inputText.val().trim());
        if(page < 0 || page == _this.state.cur){ 
            _this.inputText.val('');
            return;
        }
        _this.inputText.trigger('blur');
        _this.handleUserAction(page);
    },
    //绑定事件
    bindEve : function(){
        var _this = this;
        //页码点击
        _this.pageBox.on('click','[data-page]',_this.handlePage());
        //快捷按钮绑定事件
        if(_this.isNeedQuick){
            _this.pageBox.find('[data-quick]').on('click',_this.handleQuick());
        }
        //输入事件
        if(_this.isNeedInput){
            //输入快捷键
            _this.inputText.on('keyup',function(e){
                var e = e || window.event;
                if(e.keyCode == 13){
                    _this.handleSubmit();
                    return false;
                }
            });
            //输入按钮
            _this.inputBtn.on('click',function(){
                _this.handleSubmit();
                return false;
            });
        }
    }
};

sCss:

.vo_pagination{
    color: #cfcfcf;
    $height:24px;
    a{
        color: #cfcfcf;
        border-radius: 4px;
        &:hover{
            color: #67b7f0;
        }
    }
    .first-btn,
    .prev-btn,
    .next-btn,
    .last-btn,
    .page-btn,
    .submit-btn{
        $btnHeight:$height - 2;
        float: left;
        height: $btnHeight;
        line-height: $btnHeight;
        padding: 0 8px;
        border: 1px solid #b0b0b0;
        margin: 0 10px 0 0;
        
    }
    .page-group{
        float: left;
        height: $height;
        .page-btn{
            &.on{
                color: #67b7f0;
            }
        }
        .ellipsis{
            float: left;
            line-height: $height;
            margin: 0 10px 0 0;
        }
    }
    .input-group{
        float: left;
        height: $height;
        line-height: $height;
        span{
            float: left;
            margin: 0 10px 0 0;
        }
        input{
            float: left;
            margin: 0 10px 0 0;
            width: 60px;
            text-align: center;
            border: 0;
            border-bottom:1px solid #b0b0b0;
        }
        .submit-btn{
            margin: 0;
        }
    }
}

使用:

<div data-node="pagination"></div>
var pagination = new Virgo.pagination({
        node : $("[data-node='pagination']"),
        callback : function(cur){
            console.log(cur);
        }
    });
    pagination.trigger(1,10);