独立思想是最宝贵的

多写原创的文章
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

原创:仿AspNetPager写的JS分页控件,适合ajax调用

Posted on 2012-07-23 14:21  漂流的鱼  阅读(1358)  评论(1编辑  收藏  举报

      一直在用AspNetPager.dll这个服务器端分页控件很好使,但最近产品总是要求在分页上要使用无刷新技术AspNetPager就无法使用了,公司里也有不少人写了几个分页控件封装的都不好,不利于重复使用,于是自己按照AspNetPager的设计写了这么一个jquery插件。

      它的优点是配置多,可以方便地控制,但目前css类名不支持可配置的,大家可以通过改源码或者添加配置属性。我这里贴上js源码,附件中有完整的例子。 

/*
* JS分页控件,V1.0
*
* Copyright 2011, Leo.Liu  mail:wuyis.llq@gmail.com
*
* 用法一:$.ecpAjaxPager.renderControl(当前页数, 总记录数, 每页大小, 容器ID, 翻页回调函数, 设置); 
* 例如$.ecpAjaxPager.renderControl(pageindex, 148, pagesize, 'pager1', pageChange, { showFirstLast: true, showPrevNext: true, showPageSize: true, showNumberButton: true });
* 用法二:var htmlContent = $.ecpAjaxPager.renderControl(当前页数, 总记录数, 每页大小, null, null, 设置); //修改htmlContent的内容之后设置到DOM上  $.ecpAjaxPager.bindEvent(容器ID, 翻页回调函数);
* 例如var htmlContent = $.ecpAjaxPager.renderControl(pageindex, 98, pagesize);  $('#pager2').html(pageHTML);   $.ecpAjaxPager.bindEvent('pager2', pageChange);
* 注:设置的写法为:{ showFirstLast: true, showPrevNext: true, showPageSize: true, showNumberButton: true }
*/

jQuery.extend({
    ecpAjaxPager: {
        //设置默认的配置节
        setConfig: function (cusSetting) {
            if (!cusSetting)
                cusSetting = {};

            if (!cusSetting.alwaysShow)     //该值指定是否总是显示Pager分页按件
                cusSetting.alwaysShow = false;
            if (!cusSetting.showFirstLast)  //该值指示是否在页导航元素中显示第一页和最后一页按钮
                cusSetting.showFirstLast = false;
            if (!cusSetting.showPrevNext)   //该值指示是否在页导航元素中显示上一页和下一页按钮
                cusSetting.showPrevNext = false;
            if (typeof (cusSetting.showPageIndex) == 'undefined')  //该值指示是否在页导航元素中显示页索引数值按钮
                cusSetting.showPageIndex = true;
            if (!cusSetting.showNumberButton)   //该值指示是否在页导航元素中显示跳转到某页按钮
                cusSetting.showNumberButton = false;
            if (!cusSetting.showPageSize)   //该值指定是否显示每页大小选择器
                cusSetting.showPageSize = false;
            if (!cusSetting.selectPageIndex)   //该值指示每页大小的候选值
                cusSetting.selectPageIndex = [10, 20, 30, 40];
            if (!cusSetting.numberButtonCount)   //该值指示控件的页导航元素中同时显示的数值按钮的数目
                cusSetting.numberButtonCount = 10;

            return cusSetting;
        },


        //生成分页控件
        renderControl: function (currentPageIndex, totalCount, pageSize, containerID, callback, setting) {
            setting = this.setConfig(setting);

            //计算和校验数据
            totalCount = parseInt(totalCount);
            totalCount = totalCount > 0 ? totalCount : 0;
            pageSize = parseInt(pageSize);
            pageSize = (pageSize && pageSize > 0) ? pageSize : 10;
            var pageCount = Math.floor((totalCount + pageSize - 1) / pageSize);
            currentPageIndex = parseInt(currentPageIndex);
            currentPageIndex = currentPageIndex < 1 ? 1 : currentPageIndex;
            currentPageIndex = currentPageIndex > pageCount ? pageCount : currentPageIndex;

            if (pageCount <= 1 && !setting.alwaysShow) {
                this.renderHTML(containerID, '', callback);
                return '';
            }

            var pageHTML = '<div class="pagerWraaper">';

            //生成设置每页大小的下拉框
            if (setting.showPageSize) {
                pageHTML += '<span class="">每页显示<select id="selPageSize" class="">';
                $.each(setting.selectPageIndex, function (i, item) {
                    pageHTML += '<option value="' + item + (item == pageSize ? '" selected="selected"' : '"') + '>' + item + '</option>';
                });
                pageHTML += '</select>条</span> ' + currentPageIndex + '/' + pageCount + '页(' + totalCount + '项)';
            }
            else {
                pageHTML += '<input type="hidden" id="selPageSize" value="' + pageSize + '" />';
            }


            //生成首页链接
            if (currentPageIndex <= 1) {
                if (setting.showFirstLast)
                    pageHTML += '<span class="page-icon iconFirst disabled">&lt;&lt;</span>';
                if (setting.showPrevNext)
                    pageHTML += '<span class="page-icon iconBack disabled">&lt;</span>';
            } else {
                if (setting.showFirstLast)
                    pageHTML += '<a class="page-icon iconFirst" pageindex="1">&lt;&lt;</a>';
                if (setting.showPrevNext)
                    pageHTML += '<a class="page-icon iconBack"  pageindex="' + (currentPageIndex - 1) + '">&lt;</a>';
            }


            //生成分页列表
            if (setting.showPageIndex) {
                var ne_half = Math.ceil(setting.numberButtonCount / 2);
                var ne_limit = pageCount - setting.numberButtonCount;
                var start = currentPageIndex > ne_half ? Math.max(Math.min(currentPageIndex - ne_half, ne_limit), 1) : 1;
                var end = currentPageIndex > ne_half ? Math.min(currentPageIndex + ne_half - 1, pageCount) : Math.min(setting.numberButtonCount, pageCount);

                pageHTML += '<span class="pagerIndex">';
                for (var i = start; i <= end; i++) {  //*******
                    if (i == currentPageIndex)
                        pageHTML += '<span class="on">' + i + '</span>';
                    else
                        pageHTML += '<a pageindex="' + i + '">' + i + '</a>';
                }
                pageHTML += '</span>';
            }


            //生成尾页链接
            if (currentPageIndex >= pageCount) {
                if (setting.showPrevNext)
                    pageHTML += '<span class="page-icon iconNext disabled">&gt;</span>';
                if (setting.showFirstLast)
                    pageHTML += '<span class="page-icon iconLast disabled">&gt;&gt;</span>';
            } else {
                if (setting.showPrevNext)
                    pageHTML += '<a class="page-icon iconNext" pageindex="' + (currentPageIndex + 1) + '">&gt;</a>';
                if (setting.showFirstLast)
                    pageHTML += '<a class="page-icon iconLast"  pageindex="' + pageCount + '">&gt;&gt;</a>';
            }

            //生成跳转代码
            if (setting.showNumberButton) {
                pageHTML += '<span>跳转到第<input type="text" id="tbGoToPage" class="textField1">页</span><input type="button" id="btnGoToPage" value="GO" class="toPageNo">';
            }

            pageHTML += '</div>';


            this.renderHTML(containerID, pageHTML, callback);


            return pageHTML;
        },

        renderHTML: function (containerID, pageHTML, callback) {
            if (containerID) {  //如果不设置此值,可以先修改分页控件的html代码之后,再调用bindEvent方法来绑定事件
                $('#' + containerID).html(pageHTML);
                this.bindEvent(containerID, callback);
            }
        },

        //绑定事件
        bindEvent: function (containerID, callback) {
            //分页事件
            $('#' + containerID + ' a').each(function (i, item) {
                if ($(item).attr('pageindex')) {
                    $(item).bind('click', function () {
                        callback($(item).attr('pageindex'), $('#' + containerID + ' #selPageSize').val());
                    });
                }
            });
            //跳转
            $('#' + containerID + ' #btnGoToPage').bind('click', function () {
                var page = $('#' + containerID + ' #tbGoToPage').val();
                if (!page || !page.match(/^\d+$/i)) {
                    alert('请输入要跳转到的页数');
                    $('#' + containerID + ' #tbGoToPage').focus();
                    return;
                }
                callback(page, $('#' + containerID + ' #selPageSize').val());
            });
            //            $('#' + containerID + ' #tbGoToPage').bind('keyup', function (event) {
            //                if (event.keyCode == '13') {
            //                    var page = $('#' + containerID + ' #tbGoToPage').val();
            //                    if (!page || !page.match(/^\d+$/i)) {
            //                        alert('请输入要跳转到的页数');
            //                        $('#' + containerID + ' #tbGoToPage').focus();
            //                        return;
            //                    }
            //                    //callback(page, $('#' + containerID + ' #selPageSize').val());
            //                }
            //            });
            //设置页大小
            $('#' + containerID + ' #selPageSize').bind('change', function () {
                callback(1, $('#' + containerID + ' #selPageSize').val());
            });
        }
    }
});

       附件:js分页控件代码