当前位置: 代码迷 >> Web前端 >> 用jQuery兑现的一个分页工具栏
  详细解决方案

用jQuery兑现的一个分页工具栏

热度:35   发布时间:2012-10-07 17:28:51.0
用jQuery实现的一个分页工具栏
先看下效果图:


这是第一次写博文,是关于学习jQuery完成的一个实例,希望大家不吝赐教。
以下是代码片段,完整的demo详见附件! 望和大家一起学习进步。谢谢!
	/**
	 * @described 分页组件
	 * @author xuxb
	 * @see 通过jquery完成页面数据的分页工具栏 pagetoolbar
	 * @see 用于缓解页面数据量过大而导致页面停顿或假死现象
	 * @mark 定义的局部变量为私有变量 提供对应的方法进行操作, 如 this.totalSize = totalSize; 将破坏对象的封装
	 * @created 2011-05-30
	 */
	var pageInfo = null; // 全局分页信息
	var PAGE_SIZE = 10;  // 每页显示多少条
	
	function turnPage(pageNo) { // 翻页操作
		pageInfo.currentPage = pageNo;
		pageInfo.show();
	}

	
	function PageComponent(totalSize, pageSize, currentPage) {
		this.totalSize = totalSize;
		this.pageSize = pageSize;
		this.currentPage = currentPage;
		this.toolbarSize = 7; // 默认的页码个数  (奇数可以保持页码对称)
		this.step = 3;  // 当前页码的前、后页码数(步长)
		
		if (PageComponent._init==undefined) {  // 调用初始化方法 -- 
			this.init();
			PageComponent._init = 1;
		}
	}
	PageComponent.prototype.init = function() {   // 完成一些初始化动作init
//		$("#tipPage").text(this.getTipPage());
	};
	
	PageComponent.prototype.getStartIndex = function() {  // 获取开始索引值
		if (this.currentPage == 1) 
			return 0;
		else 
			return (this.currentPage - 1) * this.pageSize;
	};
	PageComponent.prototype.getEndIndex = function() {  // 获取结束索引值
		if (this.currentPage == 1) 
			return this.pageSize;
		else 
			if (this.currentPage * this.pageSize >= this.totalSize) {
				return this.totalSize;
			}
			else {
				return this.currentPage * this.pageSize;
			}
	};
	PageComponent.prototype.getPageCount = function() { // 获取总页数
		return Math.ceil(this.totalSize / this.pageSize);
	};
	
	PageComponent.prototype.getUpPage = function() {  // 获取上一页 页码
		if (this.currentPage - 1 < 1) 
			return 1;
		return this.currentPage - 1;
	};
	
	PageComponent.prototype.getDownPage = function() { // 获取下一页 页码
		if (this.currentPage >= this.getPageCount()) 
			return this.getPageCount();
		return this.currentPage + 1;
	};
	
	PageComponent.prototype.getFirstPage = function() { // 获取下一页 页码
		return 1;
	};
	
	PageComponent.prototype.getTipPage = function() { // 获取提示信息
		return "第" + this.currentPage + "页/共" + this.getPageCount() + "页  共有结果" + this.totalSize + "条";
	};
	
	PageComponent.prototype.computePage = function() {
		$("#toolbar").hide();
//		$("#tipPage").text(this.getTipPage());
//		$("#firstPage").val(this.getFirstPage());
//		alert($("#upPage").val());
//		$("#upPage").val(this.getUpPage());
//		$("#downPage").val(this.getDownPage());
//		$("#endPage").val(this.getPageCount());
		$("#tipPage").html(this.getTipPage());
		$("#toolbar").show();
	};
	
	PageComponent.prototype.pageToolbar = function() {//公式
		/*
		 * 重新理思路
		 * 1. 根据当前页码生成待生成的JSON格式页码 如{"< Prev":"1","2":"2",....,"Next >":"2"}
		 * 2. 可分为2种情况实现 
		 */
		var jsonArray = new Array();
		var items = "";
		jsonArray.push('"< Prev ":"'+this.getUpPage()+'"'); // 上一页
		jsonArray.push('"'+this.getFirstPage()+'":"'+this.getFirstPage()+'"'); // 首页
		
		if (this.getPageCount() <= this.toolbarSize) {// 情况一:需要生成的页码小于或等于默认值
			for (var i = 1; i <= this.getPageCount(); i++) {
				if (this.currentPage<=this.yardage*2) {
					jsonArray.push('"'+i+'":"'+i+'"'); // 格式如下 "2":"2"
				}
			}
		} else { // 情况二:需要生成的页码大于默认值
			
			var start = parseInt(this.currentPage)-parseInt(this.step); // 3
			var end = parseInt(this.currentPage)+parseInt(this.step);
			
			if (start<this.step) {  // 起始值小于step
				start=2;
				end=start+2*this.step-1;
			}else if (end>this.getPageCount()) { // 结束值大于总页数
				end=this.getPageCount();
				start=end-2*this.step;
			}

			for (var i=start; i<=end; i++) {
				
				if(i==start&&start>=this.step) { // first...
					jsonArray.push('"first...":"..."');
				}
				
				jsonArray.push('"'+i+'":"'+i+'"'); // 格式如下 "2":"2"
				
				if (i==end&&end<this.getPageCount()-1) { // after...
					jsonArray.push('"after...":"..."');
				}
			}
		}
		
		jsonArray.push('"'+this.getPageCount()+'":"'+this.getPageCount()+'"'); // 末页
		jsonArray.push('" Next >":"'+this.getDownPage()+'"');// 下一页
		

		jsonArray = "{" + jsonArray.join(",") + "}";
		
		jsonArray = $.parseJSON(jsonArray);
		var temp = this.currentPage;  // 保存当前页码值
//		var regx = /^\d+$/;
		$.each(jsonArray, function(i, n) {
			if (!isNaN(n)) {
				items += "<li";
				if (temp==n&&i==n) { // 当前页和当前待生成的页码一样, 并且生成页码的key和value相等。
					items += " class='currentpage'";
				} else if (temp==n&&i!=n) {
					// 1.若当前页没有上一页,上一页按钮css为dispage
					// 2.若当前页没有下一页,下一页按钮css为dispage
					items += " class='dispage'";
				} else {
					items += " onclick='javascript:turnPage("+n+");'";
				}
				items += ">&nbsp;"+i+"&nbsp;</li>"
			} else {
				items += n; // ... 省略号
			}
			
		});
		
		$("#ulpage").empty();
		$("#ulpage").append(items);
	};
	
	PageComponent.prototype.addClass = function(className) { // 鼠标悬停切换样式
		$(".ulpage li").bind("mouseover mouseout", function() {
			$(this).toggleClass(className);
		});
	};
	
	PageComponent.prototype.show = function(pageNo) {
		
		if (pageNo!=null&&pageNo!="") {  // 可以接收参数,当前页码
			this.currentPage = pageNo;
		}
		/*
		 * 前置条件:
		 *  1.当前页码大于0
		 *  2.总记录数大于0
		 *  3.当前页码必须小于总页码
		 */
		if (this.currentPage > 0 && this.totalSize > 0 && this.currentPage <= this.getPageCount()) {
			
			this.computePage();
			this.pageToolbar();
			this.addClass("ulpageunderline");  // 样式ulpageunderline
			
			var hidepart = $("#table2 tr:not(.list_table_tr)"); // 隐藏部分CSS的id选择器
			hidepart.hide();
			for (i = this.getStartIndex(); i < this.getEndIndex(); i++) {
				hidepart.eq(i).show();
			}
		}
	};

  相关解决方案