/** * this jquery plugin displays pagination links inside the selected elements. * * @author gabriel birke (birke *at* d-scribe *dot* de) * @version 1.2 * @param {int} maxentries number of entries to paginate * @param {object} opts several options (see readme for documentation) * @return {object} jquery object */ jquery.fn.pagination = function(maxentries, opts){ opts = jquery.extend({ items_per_page:10, num_display_entries:10, current_page:0, num_edge_entries:0, link_to:"#", prev_text:"prev", next_text:"next", ellipse_text:"...", prev_show_always:true, next_show_always:true, callback:function(){return false;} },opts||{}); return this.each(function() { /** * 计算最大分页显示数目 */ function numpages() { return math.ceil(maxentries/opts.items_per_page); } /** * 极端分页的起始和结束点,这取决于current_page 和 num_display_entries. * @返回 {数组(array)} */ function getinterval() { var ne_half = math.ceil(opts.num_display_entries/2); var np = numpages(); var upper_limit = np-opts.num_display_entries; var start = current_page>ne_half?math.max(math.min(current_page-ne_half, upper_limit), 0):0; var end = current_page>ne_half?math.min(current_page+ne_half, np):math.min(opts.num_display_entries, np); return [start,end]; } /** * 分页链接事件处理函数 * @参数 {int} page_id 为新页码 */ function pageselected(page_id, evt){ current_page = page_id; drawlinks(); var continuepropagation = opts.callback(page_id, panel); if (!continuepropagation) { if (evt.stoppropagation) { evt.stoppropagation(); } else { evt.cancelbubble = true; } } return continuepropagation; } /** * 此函数将分页链接插入到容器元素中 */ function drawlinks() { panel.empty(); var interval = getinterval(); var np = numpages(); // 这个辅助函数返回一个处理函数调用有着正确page_id的pageselected。 var getclickhandler = function(page_id) { return function(evt){ return pageselected(page_id,evt); } } //辅助函数用来产生一个单链接(如果不是当前页则产生span标签) var appenditem = function(page_id, appendopts){ page_id = page_id<0?0:(page_id"+(appendopts.text)+""); }else{ var lnk = jquery(""+(appendopts.text)+"") .bind("click", getclickhandler(page_id)) .attr('href', opts.link_to.replace(/__id__/,page_id)); } if(appendopts.classes){lnk.addclass(appendopts.classes);} panel.append(lnk); } // 产生"previous"-链接 if(opts.prev_text && (current_page > 0 || opts.prev_show_always)){ appenditem(current_page-1,{text:opts.prev_text, classes:"prev"}); } // 产生起始点 if (interval[0] > 0 && opts.num_edge_entries > 0) { var end = math.min(opts.num_edge_entries, interval[0]); for(var i=0; i"+opts.ellipse_text+"").appendto(panel); } } // 产生内部的些链接 for(var i=interval[0]; i 0) { if(np-opts.num_edge_entries > interval[1]&& opts.ellipse_text) { jquery(""+opts.ellipse_text+"").appendto(panel); } var begin = math.max(np-opts.num_edge_entries, interval[1]); for(var i=begin; i 0) { pageselected(current_page - 1); return true; } else { return false; } } this.nextpage = function(){ if(current_page < numpages()-1) { pageselected(current_page+1); return true; } else { return false; } } // 所有初始化完成,绘制链接 drawlinks(); // 回调函数 opts.callback(current_page, this); }); }