自己做过分页功能吗?我们一起打造自己的分页控件

一、概述

这些日子在做一套系统,基本上告了一段落,其中包括分页相关的功能.

主要涉及:Url分页和Ajax 分页.而基本上开发中所用到的就这两种,当然有其他的方式,我们就不说了.

为什么会谈及这两种分页呢,原因如下

ajax 分页用户体验好,性能更好.

Url 分页对于搜索引擎友好.

而做的这套系统两方面都需要,故此重新设计了分页方案.自认目前十分灵活便捷的分页控件.

二、效果预览

三、ajax分页的使用方式

说明:在配置分页参数的时候,smallPageUrl 表示加载每页内容的地址.

后台代码:

using (var db=Db.CreateDefaultDb()) {
				var mqlJoin=ScoreSet.SelectAll()
					.InnerJoin(StudentSet.Select(StudentSet.Name))
					.InnerJoin(ClassSet.Select(ClassSet.ID.AS("ClassID"),ClassSet.ClassName))
					.ON(ScoreSet.Student_ID.Equal(StudentSet.ID)
					    .And(StudentSet.Class_ID.Equal(ClassSet.ID) )
					   );
				if (Request["onlyGetSumDataCount"]=="1") {
					var sumCount=db.GetCount(mqlJoin);
					Response.Write(sumCount);
					Response.End();
					return;
				}else{
					int sumPageCount;
					int sumDataCount;
					var pageIndex=Request["pageIndex"];
					var pageSize=Request["pageSize"];
					this.List=db.GetPagerToDictionaryList(mqlJoin,out sumPageCount,out sumDataCount,int.Parse(pageIndex),
					                                      int.Parse(pageSize),null);
				}
			}

页面代码:

<%@ Page
Language           = "C#"
AutoEventWireup    = "false"
Inherits           = "Moon.Pager.SmallPage"
ValidateRequest    = "false"
EnableSessionState = "false"
%>
<%
foreach(var a in this.List){%>
<p><%=a["ID"]%> <%=a["Name"]%></p>
<%}%>

  

  

四、ajax 分页功能的实现

4.1所需脚本

var pageNav = pageNav || {};
pageNav.fn = null;
pageNav.pre = "pre";
pageNav.next = "next";
var pagesize = 20;
var _pageindex = 0;
var _pagecount = 0;
var _pagesumcount = 0;
pageNav.nav = function (a, b) {
    _pagesumcount = b;
    if (1 >= b) return this.pn = this.p = 1, this.pHtml2(1);
    b < a && (a = b); var c = "";
    1 >= a ? a = 1 : (c += this.pHtml(a - 1, b, pageNav.pre), c += this.pHtml(1, b, "1"));
    this.p = a;
    this.pn = b;
    //这里的e=10表示的是当前显示10个页码,后面的d=a-4和e=a+4表示的是点击...之后每次增加4个页码或减少4个页码
    var d = 2, e = 10 > b ? b : 10; 7 <= a && (c += "...", d = a - 4, e = a + 4, e = b < e ? b : e);
    for (; d < a; d++)
        c += this.pHtml(d, b);
    c += this.pHtml2(a);
    for (d = a + 1; d <= e; d++)
        c += this.pHtml(d, b);
    e < b && (c = c + "..." + this.pHtml(b, b));
    a < b && (c += this.pHtml(a + 1, b, pageNav.next));
    return c;
};
pageNav.pHtml = function (a, b, c) {
    return " <a href=‘javascript:pageNav.go(" + a + "," + b + ");‘ class=‘pageNum‘>" + (c || a) + "</a> "
};
pageNav.pHtml2 = function (a) {

    if (a == 1 && _pagesumcount==1) {

        return "";
    }
    if (_pagesumcount==0) {
        return "";
    }

    return " <span class=‘cPageNum‘>" + a + "</span> "
};
pageNav.go = function (a, b) {
   var content= this.nav(a, b);
       if(document.getElementsByClassName){
           all=document.getElementsByClassName(‘pageNav‘);

       }else{
        all=getElementsByClassName(document,‘pageNav‘);
    }
    for(var i=0;i<all.length;i++){
        var one=all[i];
        one.innerHTML =content;
    }
    null != this.fn && this.fn(this.p, this.pn);
};

function getElementsByClassName(node,classname) {
  if (node.getElementsByClassName) { // use native implementation if available
    return node.getElementsByClassName(classname);
  } else {
    return (function getElementsByClass(searchClass,node) {
        if ( node == null )
          node = document;
        var classElements = [],
            els = node.getElementsByTagName("*"),
            elsLen = els.length,
            pattern = new RegExp("(^|\\s)"+searchClass+"(\\s|$)"), i, j;

        for (i = 0, j = 0; i < elsLen; i++) {
          if ( pattern.test(els[i].className) ) {
              classElements[j] = els[i];
              j++;
          }
        }
        return classElements;
    })(classname, node);
  }
}

//---------

function LoadNav(sum,smallPageUrl,perCount,contentDomID) {
            pageNav.pre = ‘前一页‘;
            pageNav.next = ‘下一页‘;
            pageNav.fn = function (currentPageIndex, pageSum) {
                GetPage(currentPageIndex,smallPageUrl,perCount,contentDomID);
            };
            pageNav.go(1, sum);
    }

function GetPage(currentPageIndex,smallPageUrl,perCount,contentDomID) {
            $.ajax({
                url: smallPageUrl,
                async: true,
                cache: false,
                data: { pageIndex: currentPageIndex, pageSize: perCount },
                success: function (html) {
                    $(‘#‘+contentDomID).html(html);
                }
      });
}
function MoonPager()
{
    this.LoadPager= function(sumDataCountUrl,smallPageUrl,perCount,contentDomID) {
            $.get(sumDataCountUrl,{}, function (ret) {
                var a = 0;
                if (ret % perCount == 0) {
                    a = ret / perCount;
                } else {
                    a = Math.floor(ret / perCount) + 1;
                }
                LoadNav(a,smallPageUrl,perCount,contentDomID);
            });
     }
}        

4.2所需样式

 .pageNav a { color:#2B4A78; text-decoration:none;margin-right:1px; }
		 .pageNav a:hover { color:#2B4A78;text-decoration:underline; }
		 .pageNav  a:focus,
		 .pageNav input:focus {outline-style:none; outline-width:medium; }
		 .pageNav .pageNum{border: 1px solid #999;padding:2px 8px;display: inline-block;}
		 .pageNav .cPageNum{font-weight: bold;padding:2px 5px;}
		 .pageNav  a:hover{text-decoration:none;background: #fff4d8; }
		 .pageNav {text-align:right;margin-right:5px;margin-top:5px;margin-bottom:5px;}

5.Url分页的使用方式

var pager=Moon.Orm.Util.PagerUtil.GetUrlPager("........自己浏览参数");
var UrlPagerControl=pager.UrlPagerControl;
var List=pager.Data;

前端:

List 用于数据遍历

UrlPagerControl 用于显示导航控件.

时间: 2024-10-18 22:56:37

自己做过分页功能吗?我们一起打造自己的分页控件的相关文章

一个简单的图片轮播功能(图片自动播放,点击控件可直接跳转对对应图片)

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-

winform中DataGridView实现分页功能

http://liyaguang20111105.blog.163.com/blog/static/19929420220146283255809/ 在winform的设计中,要实现对DataGridView控件的分页功能,需要两个控件:BindingSource.BindingNavigator,根据需求可对BindingNavigator进行自由的扩展,下图的示例则是根据一般需求对分页功能的实现.红色区域是对BindingNavigator控件扩展后的效果. 具体实现过程 : //窗体构造方

ASP.NET使用ListView数据绑定控件和DataPager实现数据分页显示(一)

为什么使用ListView+DataPager的方式实现分页显示? .net提供的诸多数据绑定控件,每一种都有它自己的优点和缺点.如果需要对数据进行操作,如果数据量不大的情况下,DataList和GridView是最好的选择,但是他们会生产额外的<table><tr><tbody><td>标签.如果只是罗列出来一些简单的数据,出于对性能的考虑,repeater必然是首选.当然ListView和DataPager的组合必将是开发中的黄金组合,无论从性能上和功能

Mybatis Generator实现分页功能

Mybatis Generator实现分页功能 分类: IBATIS2013-07-17 17:03 882人阅读 评论(1) 收藏 举报 mybatisibatisgeneratorpage分页 众所周知,Mybatis本身没有提供基于数据库方言的分页功能,而是基于JDBC的游标分页,很容易出现性能问题.网上有很多分页的解决方案,不外乎是基于Mybatis本机的插件机制,通过拦截Sql做分页.但是在像Oracle这样的数据库上,拦截器生成的Sql语句没有变量绑定,而且每次语句的都要去拦截,感觉

django--两级联查搜索分页功能

在写搜索功能时,对搜索出来的内容进行分页,摸索了很久,因为一开始做分页功能,就是用的自定义的分页,没有用Django使用内置paginator类分页,不过效果还是实现了 在点击search后,页面显示的搜索内容,当点击下一页的时候,会直接跳回到没有搜索之前的内容,在这里,想了很久,最后用比较笨的方法实现了分页功能 至于搜索功能的实现,请参考上篇博文 故障管理系统--select两级联动查询 html.py #/usr/bin/env python  #_*_coding:utf-8_*_ fro

一个js实现的分页功能

分页,一直是个令我头疼的问题,用java写网站的时候 ,需要用到分页功能,那时候是定义一个分页用的类,感觉比较麻烦,不过在数据量大的时候,应该会比较合适 去年做项目的过程中,用的是下拉刷新的组件,是别人写的,实现起来不方便, 效果也不太好 偶然在网上看到过js的分页功能,想想既然java能实现,js肯定是也能实现的. 参考网上的内容,稍微修改了下,暂且称之为0.1版 具体方法:先将所有的数据取出来,并用html展示出来,但用js去控制html标签的显示与隐藏,算是从另一个角度实现了分页功能 这一

MyBatis精通之路之分页功能的实现

MyBatis精通之路之分页功能的实现(数组分页.sql分页.拦截器,RowBounds分页) 原创 2017年04月27日 21:34:48 标签: mybatis / java / j2ee / mysql / 分页 4162 前言:学习hibernate & mybatis等持久层框架的时候,不外乎对数据库的增删改查操作.而使用最多的当是数据库的查找操作, 而当数据库数据过多时,符合查找条件的数据可能也会是很庞大的数据.往往在这个时候,我们都不会希望一次性的将所有的数据一起性读取出来,并且

DevExpress中实现GridControl的分页功能

DevExpress中如何实现GridControl的分页功能 简介:DevExpress中如何实现GridControl的分页功能, 主要是利用DataNavigator和GridControl组合,自定义事件实现分页功能 接下来,我们就去实现分页功能,先看下效果图: ------------------------------------------------------------------------------------------------------------------

最好用的兼容多种数据库通用高效的大数据分页功能

通用权限管理系统底层有一个通用分页查询功能,该功能可实现多种数据库的查询,支持多表关联分页查询,目前是最完善的分页功能实现. 下面代码是使用的方法截图: /////////////////////////////// 后台代码截图1 /////////////////////////////// 后台代码截图2 /////////////////////////////// 后台代码截图3 /////////////////////////////// 后台代码截图4 /////////////