/** * @version 1.1 * @author ideawu@163.com * @link http://www.ideawu.net/ * @class * 分页控件, 使用原生的javascript代码编写. 重写onclick方法, 获取翻页事件, * 可用来向服务器端发起ajax请求. * * @param {string} id: html节点的id属性值, 控件将显示在该节点中. * @returns {pagerview}: 返回分页控件实例. * * @example * ### html: * <div id="pager"></div> * * ### javascript: * var pager = new pagerview('pager'); * pager.urlbase = 'http://....'; // optional 如果不指定, 则生成 js 事件 * pager.index = 3; // 当前是第3页 * pager.size = 16; // 每页显示16条记录 * pager.itemcount = 100; // 一共有100条记录 * * pager.onclick = function(index){ * alert('click on page: ' + index); * // display data... * }; * * pager.render(); * */ var pagerview = function(id){ var self = this; this.id = id; this._pagecount = 0; // 总页数 this._start = 1; // 起始页码 this._end = 1; // 结束页码 /** * 当前控件所处的html节点引用. * @type domelement */ this.container = null; /** * 当前页码, 从1开始 * @type int */ this.index = 1; /** * 每页显示记录数 * @type int */ this.size = 4; /** * 显示的分页按钮数量 * @type int */ this.maxbuttons = 5; /** * 记录总数 * @type int */ this.itemcount = 0; this.urlbase = null; /** * 控件使用者重写本方法, 获取翻页事件, 可用来向服务器端发起ajax请求. * 如果要取消本次翻页事件, 重写回调函数返回 false. * @param {int} index: 被点击的页码. * @returns {boolean} 返回false表示取消本次翻页事件. * @event */ this.onclick = function(index){ return true; }; /** * 内部方法. */ this._onclick = function(index){ var old = self.index; self.index = index; if(self.onclick(index) !== false){ self.render(); }else{ self.index = old; } }; /** * 在显示之前计算各种页码变量的值. */ this._calculate = function(){ self._pagecount = parseint(math.ceil(self.itemcount / self.size)); self.index = parseint(self.index); if(self.index > self._pagecount){ self.index = self._pagecount; } if(self.index < 1){ self.index = 1; } self._start = math.max(1, self.index - parseint(self.maxbuttons/2)); self._end = math.min(self._pagecount, self._start + self.maxbuttons - 1); self._start = math.max(1, self._end - self.maxbuttons + 1); }; /** * 获取作为参数的数组落在相应页的数据片段. * @param {array[object]} rows * @returns {array[object]} */ this.page = function(rows){ self._calculate(); var s_num = (self.index - 1) * self.size ; var e_num = self.index * self.size; return rows.slice(s_num, e_num); }; function build_url(index){ var ret = ''; if(!self.urlbase){ ret = 'javascript://' + index; }else{ ret = self.urlbase; ret += (self.urlbase.indexof('?') == -1)? '?' : '&'; ret += 'page=' + index + '&size=' + self.size; } return ret; } /** * 渲染控件. */ this.render = function(){ var div = document.getelementbyid(self.id); div.view = self; self.container = div; self._calculate(); var str = ''; str += '
\n'; if(self._pagecount > 1){ if(self.index != 1){ str += '|<'; str += '<<'; }else{ str += '|<'; str += '<<'; } } for(var i=self._start; i<=self._end; i++){ if(i == this.index){ str += '' + i + ""; }else{ str += '' + i + ''; } } if(self._pagecount > 1){ if(self.index != self._pagecount){ str += '>>'; str += '>|'; }else{ str += '>>'; str += '>|'; } } str += '

一共' + self._pagecount + '页, ' + self.itemcount + '条记录 '; str += '
\n'; self.container.innerhtml = str; var a_list = self.container.getelementsbytagname('a'); for(var i=0; i