福利到~分享一个基于jquery的分页控件

前台分页控件有很多,以下是我的实现。默认情况下,点击页码会像博客园一样,在url后面加上"#p页码"。

有2个参数需要注意:

beforeRender: 在每个页码项呈现前会被调用,参数为页码的jQuery对象。这个时候我们可以在呈现前做一些处理,例如增加自己的属性等。默认情况下,点击页码,会在url后面加上“#p页码”,这样的url并不会刷新页面。如果我们需要刷新页面,例如url为,"default.aspx?index=页码",就可以在这个回调函数里处理。

callback: 点击页码触发,参数为整个options。点击页码并不会发起ajax请求,需要自己处理,options.index 就是本次点击的页码。有时候我们的总数可能会变化,callback 可以将 options 参数回传,这里只要重新设置总数,然后 return 即可。

具体看调用例子就明白了。

源代码:

/*分页控件v1.0
  date:2015.08.26
*/
(function(window,$){
    $.fn.pagination = function(options){
        var _dftOpts = {
            count:0,//总数
            size:10,//每页数量
            index:1,//当前页
            lrCount:5,//当前页左右最多显示的数量
            lCount:0,//最开始预留的数量
            rCount:0,//最后预留的数量
            first:"首页",
            last:"尾页",
            before:"上一页",
            next:"下一页",
            url: location.pathname + location.search + "#p",//目标地址
            callback:null,//点击事件
            beforeRender:null//项呈现前
        };
        $.extend(_dftOpts,options);
        var count = _dftOpts.count;
        if(count <= 0) return;
        var _ellipsis = "...";
        var _size = _dftOpts.size > 0 ? (_dftOpts.size > count ? count : _dftOpts.size) : 1;
        var _page = Math.ceil(count / _size);
        var _index = _dftOpts.index > 0 ? (_dftOpts.index > _page ? _page : _dftOpts.index) : 1;
        var _lrcount = _dftOpts.lrCount * 2 + 1 > _page ? parseInt((_page - 1) / 2) : _dftOpts.lrCount;
        var _continueCount = _lrcount * 2 + 1;
        var _lCount = _dftOpts.lCount <= 0 ? 0 : (_dftOpts.lCount > _page ? _page - 1 : _dftOpts.lCount);
        var _rCount = _dftOpts.rCount <= 0 ? 0 : (_dftOpts.rCount > _page ? _page - 1 : _dftOpts.rCount);
        var _first = _dftOpts.first;
        var _before = _dftOpts.before;
        var _last = _dftOpts.last;
        var _next = _dftOpts.next;
        var _FromTo;
        var _url = location.pathname + location.search + "#p";
        var jthis = this;
        var jPager = $("<div>",{"class":"pager"});
        initJPager();
        jthis.append(jPager);
        regisiterEvent();
        return jthis;

        /*function*/
        function initJPager(){
            _FromTo = GetFromTo();
            var from = _FromTo.from;
            var to = _FromTo.to;
            var before = _index <= 1 ? 1 : _index - 1;
            var next = _index >= _page ? _page : _index + 1;
            var beforeLast = _page - 1;
            var jPrevs,jNexts;
            var i;

            //前
            if(from === 2 && _lCount > 0){
                appendLink(1);
            }else if(from > _lCount + 1){
                for(i = 0;i < _lCount;i++){
                    appendLink(i + 1);
                }
                if(_lCount > 0){
                    appendEllipsis();
                }
            }else{
                for(i = 1;i < from;i++){
                    appendLink(i);
                }
            }

            //连续部分
            for(i = from;i <= to;i++){
                if(i === _index){
                    appendLink(i,true);
                }else{
                    appendLink(i);
                }
            }

            //后
            if(to === beforeLast && _rCount > 0){
                appendLink(_page);
            }else if(to < _page - _rCount){
                if(_rCount > 0){
                    appendEllipsis();
                }
                for(i = _page - _rCount;i < _page;i++){
                    appendLink(i + 1);
                }
            }else{
                for(i = to;i < _page;i++){
                    appendLink(i + 1);
                }
            }

            appendFirstAndLast();
        }
        function GetFromTo(){
            var from,to;
            from = _index - _lrcount;
            if(from <= 1){
                return {from:1,to:_continueCount};
            }
            if(_page - _index < _lrcount){
                from = _page - _continueCount + 1;
                return {from:from,to:_page};
            }
            to = _index + _lrcount;
            to = to > _page ? _page : to;
            return {from:from,to:to};
        }
        function appendLink(index,active){
            var jA = $("<a>",{text:index,href:_url+index});
            if(active){
                jA.addClass("active");
            }
            if(_dftOpts.beforeRender){
                _dftOpts.beforeRender(jA);
            }
            jPager.append(jA);
        }
        function appendFirstAndLast(){
            var jFirst = $("<a>",{text:_first});
            var jBefore = $("<a>",{text:_before});
            var jLast = $("<a>",{text:_last});
            var jNext = $("<a>",{text:_next});
            jPager.append(jNext).append(jLast);
            jBefore.insertBefore(jPager.find("a").first());
            jFirst.insertBefore(jBefore);
            if(_index === 1){
                jFirst.addClass("disabled");
                jBefore.addClass("disabled");
            }else{
                jFirst.attr("href",_url+1);
                jBefore.attr("href",_url+(_index-1));
            }
            if(_index === _page){
                jLast.addClass("disabled");
                jNext.addClass("disabled");
            }else{
                jLast.attr("href",_url+_page);
                jNext.attr("href",_url+(_index+1));
            }
        }
        function appendEllipsis(){
            jPager.append(_ellipsis);
        }
        //event
        function regisiterEvent(){
            jPager.on("mouseenter","a",function(){
                var jthis = $(this);
                if(!jthis.hasClass("active") && !jthis.hasClass("disabled")){
                    jthis.addClass("hover");
                }
            }).on("mouseout","a",function(){
                var jthis = $(this);
                if(!jthis.hasClass("active")){
                    jthis.removeClass("hover");
                }
            }).on("click","a",function(){
                var jItem = $(this);
                if(jItem.hasClass("disabled")){
                    return;
                }
                var text = jItem.text();
                var index = 0;
                switch(text){
                    case _first:
                        index = 1;
                        break;
                    case _before:
                        index = _index - 1;
                        break;
                    case _last:
                        index = _page;
                        break;
                    case _next:
                        index = _index + 1;
                        break;
                    default:
                        index = parseInt(text);
                        break;
                }
                var callback = _dftOpts.callback;
                var newOpts;
                _dftOpts.index = index;
                jPager.remove();
                if(callback){
                    newOpts = callback(_dftOpts);
                }
                if(newOpts){
                    _dftOpts = newOpts;
                }
                jthis.pagination(_dftOpts);
            });
        }
    }
})(window,$);

样式很简单,可以自己调:

.pager{height:30px;line-height:30px;font-size: 12px;margin: 25px 0px;text-align: center;color: #2E6AB1;overflow: hidden;}
.pager a{border:1px solid #9AAFE5;color:#2E6AB1;margin:0px 5px;padding:5px 8px;text-decoration: none;}
.pager a.hover,.pager a.active{background-color:#2E6AB1;border-color:#000080;color:#FFF;}
.pager a.disabled{color:#C8CDD2;cursor:auto;}

使用例子:

   $(".div1").pagination({
        count:200,
        size:10,
        index:1,
        lrCount:3,
        lCount:1,
        rCount:1,
        callback:function(options){
            //alert(options.index);
            //options.count = 300;
            //return options;
        },
        beforeRender:function(jA){
            //jA.attr("href","default.aspx?index="+jA.text());
        }
    });

pagination.js 1.0 还有可能还有一些不足和bug,我会及时修正。

时间: 2024-10-14 03:18:36

福利到~分享一个基于jquery的分页控件的相关文章

福利到~分享一个基于jquery的智能提示控件intellSeach.js

一.需求 我们经常会遇到[站内搜索]的需求,为了提高用户体验,我们希望能做到像百度那样的即时智能提示.例如:某公司人事管理系统,想搜索李XX,只要输入“李”,系统自然会提示一些姓李的员工,这样方便用户使用.说白了,就是用户边输入,系统会提示相关的结果:或者,当用户点击搜索框时,就推荐一些内容,如360.百度都会提示今天的主要新闻或搜索量大的内容. jquery 已经有一个这样的插件了,叫 autocomplete, 但我觉得不好用.关于autocomplete的介绍也很多,有兴趣的朋友可以去试试

基于jQuery 常用WEB控件收集

Horizontal accordion: jQuery 基于jQuery开发,非常简单的水平方向折叠控件. Horizontal accordion: jQuery jQuery-Horizontal Accordion 具有XBOX360 blade界面风格的水平方向Accordion. jQuery-Horizontal Accordion AutoComplete-JQuery jQuery插件易于集成到现在的表单中(Form). AutoComplete-JQuery Facebook

一些基于jQuery开发的控件

基于jQuery开发,非常简单的水平方向折叠控件.主页:http://letmehaveblog.blogspot.com/2007/10/haccordion-simple-horizontal-accordion.html (无法找到)下载:http://letmehaveblog.blogspot.com/2007/10/haccordion-simple-horizontal-accordion.html 示例:http://letmehaveblog.blogspot.com/2007

使用amaze ui的分页样式封装一个通用的JS分页控件

作为一名码农,天天百度.偶尔谷歌,所有代码全靠copy,用第三方插件,偶尔也想着造造轮子,毕竟自己的骨肉总归比较亲. 今天有点空闲时间,想起我们公司之前套的页面的分页插件上还有bug,而写那个分页插件的小伙子已经离职,就决定自己来写一个. 首先,肯定是用我们的妹子UI做样式效果,毕竟开发妹子少,做的东西能和妹子沾点边,就沾一点,毕竟妹子比较好看. 然后 开始吧 第一步 找到妹子UI的分页HTML代码,一共有2种,我喜欢第一种,比较有颜 这是妹子UI的分页代码 <ul data-am-widget

jquery.bootpag分页控件

<script src="//code.jquery.com/jquery-2.1.3.min.js"></script> <script src="//netdna.bootstrapcdn.com/bootstrap/3.3.4/js/bootstrap.min.js"></script> <script src="//raw.github.com/botmonster/jquery-bootpag

Jquery异步分页控件

ascx控件: <%@ Control Language="C#" AutoEventWireup="true" CodeBehind="Pager.ascx.cs" Inherits="com.eshop.www.Web.controls.Pager" %> <script src="/script/pagination/Pager.js" type="text/javascr

Angularjs中使用jquery分页控件

首篇,不知写何物,思来想去,敬上分页控件使用方法,望共同探讨. 分页乃前端数据展现之常用功能,而在我们使用的Angular js中,原生的分页需要将数据全部取到前端后,然后再到前端分页,在大批量数据操作时并不实用.接下来,我来介绍了将一种jquery的分页控件修改为Angularjs指令的方法. 首先在web项目中引用jquery1.10.Angularjs库文件以及jq-pagination控件. 我降指令名称为custompagination,为指令添加Html样式. 然后给指令添加对应的控

paginationjs一款功能强大的分页控件

在项目中,很多时候需要分页控件,分页控件自己写也比较简单,但是要写一个功能丰富的分页控件话,就麻烦了,这里推荐一款不错的空间,页数太多的话,显示总页数,搜索指定页码. github地址:https://github.com/superRaytin/paginationjs 简单demo代码: <!DOCTYPE html> <html> <head> <title>Paginationjs example</title> <meta htt

WinForm下编写分页控件,实现DataGridView的分页效果

 前几天做C/S项目的时候用到了分页查询,所以就想去网上找一些封装好的分页控件,类似BS项目中的那种.但是找了好几个都不是特别的好,没有自己想要的.而且WinForm 里面的DataGridView也不像WebForm里面的GridView那样有自带的分页功能.没办法还是自己动手封装一个吧,以后复用也方便. 从网上找了几个demo做了一下,实现挺简单的. 用到的方法就是编写一个用户控件,下面说明如何实现: 一,先画界面 新建一个用户控件,然后拖拽几个标签,文本框和按钮,排列好.如下图所示: