转 分页代码

// pager.demo.js

/**
 * jquery/bootstrap pager.
 * depends: jquery1.10, boostrap2
 * https://code.csdn.net/snippets/146160
 * @see: http://blog.csdn.net/win_lin/article/details/17628631
 * v 1.0.2
 */

///////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////
/**
 * 分页的界面类。
 * @param page_size 每页多少条记录
 * @param start_page 起始的页数,即最开始就从多少页展示,或者选中的页数。
 *       从自然计数开始计算,即1表示第1页。
 * @param max_pages 显示的最多页数,当超过页数时,不显示其他的。
 *       点击上一页和下一页可以翻页。
 * events:
 *       on_click_page():void 当用户点击某一页时的回调函数。可以获取点击的数据。
 * step 1: 需要在页面放置一下元素:
 <div class="pagination text-center">
     <ul>
         <li id="pager_first"><a href="javascript:void(0);">«</a></li>
         <li id="pager_pre_page"><a href="javascript:void(0);">前N页</a></li>
         <li id="pager_pre"><a href="javascript:void(0);">上一页</a></li>
         <li id="pager_next"><a href="javascript:void(0);">下一页</a></li>
         <li id="pager_next_page"><a href="javascript:void(0);">后N页</a></li>
         <li id="pager_last"><a href="javascript:void(0);">»</a></li>
         <li><span>第 <font id="txt_page_index">1</font> 页 / 共 <font id="txt_page_total">1</font> 页</span></li>
     </ul>
    <li id="pager_template" class="hide"><a href="javascript:void(0);" id="pager_num">1</a></li>
 </div>
 * step 2: 在初始化页面时初始化控件:
 $(function(){
        var pager_ui = new PagerUI(10, 1, 10);
        pager_ui.on_click_page = function() {
            // 点击时,获取分页的参数,发起新的异步请求。
            ajax_request();
        };
    });
 * step 3: 向服务器发起请求,从分页获取分数的参数。获取结果后更新分页。
 function ajax_request() {
        var url = "/api/v1/tasks?"
            + "start=" + pager_ui.get_query_start()
            + "&count=" + pager_ui.get_query_count();

        jQuery.getJSON(url, function(ret) {
            var total = ret["data"]["total"];
            var count = ret["data"]["count"];
            pager_ui.pager_render(total, count);

            setTimeout(ajax_request, 5000);
        });
    }
 */
function PagerUI(page_size, start_page, max_pages) {
    $("#pager_template").hide();

    this.__pager = new Pager(page_size, start_page - 1);

    // 显示的最多的页数:滑动窗口的大小
    this.__window = new PagerWindow(this.__pager, max_pages);

    this.__pager_nav_handler();
}
/**
 * 获取请求的query参数:起始索引。
 * @return start 例如:15:表示从第15索引开始的记录,即符合条件的第16条记录。
 */
PagerUI.prototype.get_query_start = function() {
    return this.__pager.get_query_start();
}
/**
 * 获取请求的query参数:记录数目。
 * @return count 例如:10:表示要求返回的最大记录数目。
 */
PagerUI.prototype.get_query_count = function() {
    return this.__pager.get_query_count();
}
/**
 * 从服务器端请求后,更新分页数据,并更新展示。
 * @param total 后端数据库符合条件的总记录数。譬如100表示:请求10条记录,但符合条件的共有100条。
 * @param count 后端返回的记录条数。譬如3表示:要求返回10条,可能只返回了3条。
 */
PagerUI.prototype.pager_render = function(total, count) {
    if (!this.__pager.update(total, count)) {
        setTimeout(this.on_page_changed, 0);
    }

    $("#txt_page_index").text(this.__pager.get_page_index() + 1);
    $("#txt_page_total").text(this.__pager.get_page_total());

    var _self = this;
    this.__window.render(function(){
        var parent = $(this).parent();
        var page_index = parseInt(parent.text()) - 1;
        _self.__on_click_page(page_index);
    });

    this.__update_pager_navigate_items();
    return;
}
/**
 * 当用户点击某页时的回调事件。
 * 可以通过get_query()获取更新的分页参数。
 */
PagerUI.prototype.on_click_page = function() {
}
/**
 * 当页面改变时,譬如展现页面时发现页面改变了之类。
 */
PagerUI.prototype.on_page_changed = function() {
}
PagerUI.prototype.__on_click_page = function(page_index) {
    // update the previous selected page.
    $("#pager_item_" + this.__pager.get_page_index()).removeClass("disabled");

    // refresh page.
    this.__pager.set_page_index(page_index);
    this.__update_pager_navigate_items();

    this.on_click_page();
}
PagerUI.prototype.__update_pager_navigate_items = function() {
    // disable the current selected page
    $("#pager_item_" + this.__pager.get_page_index()).addClass("disabled");

    if (this.__pager.is_first_page()) {
        $("#pager_first").addClass("disabled");
    } else {
        $("#pager_first").removeClass("disabled");
    }

    if (this.__pager.is_last_page()) {
        $("#pager_last").addClass("disabled");
    } else {
        $("#pager_last").removeClass("disabled");
    }

    this.__window.__update_pager_navigate_items();
}
PagerUI.prototype.__pager_nav_handler = function() {
    var _self = this;

    // first page
    $("#pager_first").click(function(){
        if ($(this).hasClass("disabled")) {
            return;
        }
        _self.__on_click_page(0);
    });

    // previous page
    $("#pager_pre").click(function(){
        if ($(this).hasClass("disabled")) {
            return;
        }
        _self.__on_click_page(_self.__pager.get_page_index() - 1);
    });

    // previous N page
    $("#pager_pre_page").click(function(){
        if ($(this).hasClass("disabled")) {
            return;
        }
        _self.__on_click_page(_self.__window.to_previous());
    });

    // next N page
    $("#pager_next_page").click(function(){
        if ($(this).hasClass("disabled")) {
            return;
        }
        _self.__on_click_page(_self.__window.to_next());
    });

    // next page
    $("#pager_next").click(function(){
        if ($(this).hasClass("disabled")) {
            return;
        }
        _self.__on_click_page(_self.__pager.get_page_index() + 1);
    });

    // last page
    $("#pager_last").click(function(){
        if ($(this).hasClass("disabled")) {
            return;
        }
        _self.__on_click_page(_self.__pager.get_page_total() - 1);
    });
}

///////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////
/**
 * 分页窗口管理。
 */
function PagerWindow(pager, window_size) {
    // 分页逻辑对象
    this.__pager = pager;
    // 窗口的大小。
    this.__window_size = window_size;

    $("#pager_pre_page").find("a").text("前"+this.__window_size+"页");
    $("#pager_next_page").find("a").text("后"+this.__window_size+"页");

    // 窗口的起始索引。
    this.__start = 0;

    // 窗口中的元素。
    /*{
     page: 页码。
     ui: jquery的显示对象。
     }*/
    this.__elems = [];
}
/**
 * 展示滑动窗口。
 * @param total_pages 总的页数。
 * @param on_click_page 新增页码的点击回调函数。
 */
PagerWindow.prototype.render = function(on_click_page) {
    var total_pages = this.__pager.get_page_total();
    this.__start = parseInt(this.__pager.get_page_index() / this.__window_size);

    // valid start/end page index.
    var valid_start_page = Math.max(0, this.__start * this.__window_size);
    var valid_end_page = Math.min(total_pages, valid_start_page + this.__window_size);

    // delete the removed
    for (var i = this.__elems.length - 1; i >= 0; i--) {
        var elem = this.__elems[i];
        if (elem.page >= valid_start_page && elem.page < valid_end_page) {
            continue;
        }

        elem.ui.remove();
        this.__elems.splice(i, 1);
    }

    // show elements.
    var previous = $("#pager_pre");
    for (var i = valid_start_page; i < valid_end_page; i++) {
        var item_id = "pager_item_" + i;
        var item = $("#" + item_id);

        if (item.length > 0) {
            previous = item;
            continue;
        }

        item = $("<li/>").html($("#pager_template").html()).attr("id", item_id);
        item.find("#pager_num").text(i + 1);
        item.find("#pager_num").click(on_click_page);

        item.insertAfter(previous);
        previous = item;

        this.__elems.push({page: i, ui: item});
    }
}
/**
 * change to previous N pages.
 @return the changed current page.
 */
PagerWindow.prototype.to_previous = function() {
    this.__start--;

    var new_page = this.__start * this.__window_size;
    new_page = Math.max(0, new_page);

    return new_page;
}
/**
 * change to next N pages.
 @return the changed current page.
 */
PagerWindow.prototype.to_next = function() {
    this.__start++;

    var new_page = this.__start * this.__window_size;
    new_page = Math.min(this.__pager.get_page_total() - 1, new_page);

    return new_page;
}
PagerWindow.prototype.__update_pager_navigate_items = function() {
    // update the navigate window
    if (this.__pager.is_first_page() || this.__start == 0) {
        $("#pager_pre_page").addClass("disabled");
    } else {
        $("#pager_pre_page").removeClass("disabled");
    }

    if (this.__pager.is_last_page() || (this.__start + 1) * this.__window_size >= this.__pager.get_page_total()) {
        $("#pager_next_page").addClass("disabled");
    } else {
        $("#pager_next_page").removeClass("disabled");
    }

    // update the pre and next.
    if (this.__pager.is_first_page() || this.__start == this.__pager.get_page_index()) {
        $("#pager_pre").addClass("disabled");
    } else {
        $("#pager_pre").removeClass("disabled");
    }

    if (this.__pager.is_last_page() || this.__start + this.__window_size - 1 == this.__pager.get_page_index()) {
        $("#pager_next").addClass("disabled");
    } else {
        $("#pager_next").removeClass("disabled");
    }
}

///////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////
/**
 * 分页管理类:
 * @param page_size 每页多少条记录
 * @param start_page 起始的页数,即最开始就从多少页展示,或者选中的页数。
 *       从计算机计数开始计算,即0表示第1页。
 */
function Pager(page_size, start_page) {
    this.__page_size = page_size;
    this.__start_page = start_page;

    // server update.
    this.__total = 0;
    this.__count = 0;
}
/**
 * 获取请求的query参数:起始索引。
 * @return start 例如:15:表示从第15索引开始的记录,即符合条件的第16条记录。
 */
Pager.prototype.get_query_start = function() {
    var start = this.__start_page * this.__page_size;
    return start;
}
/**
 * 获取请求的query参数:记录数目。
 * @return count 例如:10:表示要求返回的最大记录数目。
 */
Pager.prototype.get_query_count = function() {
    var count = this.__page_size;
    return count;
}
/**
 * 从服务器端请求后,更新分页数据。
 * @param total 后端数据库符合条件的总记录数。譬如100表示:请求10条记录,但符合条件的共有100条。
 * @param count 后端返回的记录条数。譬如3表示:要求返回10条,可能只返回了3条。
 * @return true, 更新成功。false, 更新失败,需要重新请求数据后更新。
 */
Pager.prototype.update = function(total, count) {
    this.__total = total;
    this.__count = count;

    var previous_start_page = this.__start_page;
    this.__start_page = Math.min(this.__start_page, this.get_page_total() - 1);
    this.__start_page = Math.max(0, this.__start_page);

    return previous_start_page == this.__start_page;
}
/**
 获取当前请求的页的索引,从0开始计算,即0表示第1页。
 -1表示第0页,没有数据。
 */
Pager.prototype.get_page_index = function() {
    if (this.__total == 0) {
        return -1;
    }
    return this.__start_page;
}
/**
 设置当前请求的页的索引
 @param start_page 页索引,从0开始计算,即0表示第1页。
 */
Pager.prototype.set_page_index = function(start_page) {
    return this.__start_page = start_page;
}
/**
 * 返回当前选中的页是否是第一页。
 */
Pager.prototype.is_first_page = function() {
    return this.__start_page <= 0;
}
/**
 * 返回当前选中的页是否是最后一页。
 */
Pager.prototype.is_last_page = function() {
    var total = this.get_page_total();
    return this.__start_page >= total - 1;
}
/**
 获取总页数。1表示1页。
 */
Pager.prototype.get_page_total = function() {
    var left = this.__total % this.__page_size;
    var page_size = parseInt(this.__total / this.__page_size);

    if (left > 0) {
        return page_size + 1;
    }

    return page_size;
}

// other components.
/**
 * common utilities
 * depends: jquery1.10
 * https://code.csdn.net/snippets/147103
 * @see: http://blog.csdn.net/win_lin/article/details/17994347
 */

  

时间: 2024-10-11 11:55:27

转 分页代码的相关文章

javascript实现的分页代码实例

javascript实现的分页代码实例: 下面是一段javascript实现的分页代码,当然必须要结合后台代码实现.大家可以自行分析一下代码,希望能够给大家带来一定的帮助,代码如下: <script type="text/javascript"> function setPage(opt) { if(!opt.pageDivId || opt.allPageNum < opt.curpageNum || opt.allPageNum < opt.showPage

无刷新分页代码,jQuery分页完整示例

<!DOCTYPE html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><title>jQuery分页演示效果</title><script type="text/javascript" src="/ajaxjs/jquery1.3.2.js">&l

php分页函数示例代码,php分页代码实现方法

php分页函数示例代码 分享一例php分页函数代码,用此函数实现分页代码很不错. 代码,php分页函数. <?php /* * Created on 2011-07-28 * Author : LKK , http://lianq.net * 使用方法: require_once('mypage.php'); $result=mysql_query("select * from mytable", $myconn); $total=mysql_num_rows($result);

转载:分页原理+分页代码+分页类制作

分页显示是一种非常常见的浏览和显示大量数据的方法,属于web编程中最常处理的事件之一.对于web编程的老手来说,编写这种代码实在是和呼吸一样自然,但是对于初学者来说,常常对这个问题摸不着头绪,因此特地撰写此文对这个问题进行详细的讲解. 一.分页原理:       所谓分页显示,也就是将数据库中的结果集人为的分成一段一段的来显示,这里需要两个初始的参数: 每页多少条记录($PageSize)?       当前是第几页($CurrentPageID)? 现在只要再给我一个结果集,我就可以显示某段特

内容页分页代码

在使用Thinkphp开发的内容管理系统里面,很多东西都要自己开发,内容分页当然也是要自己开发的,下面是我根据查资料自己整理的方法: 1.首先是在后台编辑内容的时候需要插入分页符,不同的编辑器分页符自然也不同了 2.然后就是读取文章内容的时候,要根据分页符来把内容分割成多个数组然,这里需要传值当前是第几页,根据页数来读取分割后的数组 代码如下: <php>     $arr_con=explode('_ueditor_page_break_tag_',$dy['art_content']);/

PHP分页初探 一个最简单的PHP分页代码实现

PHP分页代码在各种程序开发中都是必须要用到的,在网站开发中更是必选的一项. 要想写出分页代码,首先你要理解SQL查询语句:select * from goods limit 2,7.PHP分页代码核心就是围绕这条语句展开的,SQL语句说明:查询goods数据表从第2条数据开始取出7条数据.在分页代码中,7表示每页显示多少条内容,2通过公式计算表示翻页数,通过传入不同参数替换“2”的值,即可筛选出不同的数据. index.php: include 'conn.php'; //引入数据库操作类 $

php 简易分页代码

使用php制作了一个博客之后,对于分页代码着实让我这个零基础的人费了一番老劲,终于研究了一天一夜之后,勉强写了一段简易代码,勉强可以使用.此为第一个版本,未来会更新到用类的方式进行分页.加油~ <?php  //设定每页显示的文章数 $pagesize=5; //确定页数P的参数 @$p=$_GET['p']?$_GET['p']:1; //数据指针 $offset = ($p-1)*$pagesize; //查询本页显示的数据   $query = "select * from `art

自定义调用 ecshop 分页代码(转)

自定义调用 ecshop 分页代码 原文出处:http://blog.sina.com.cn/s/blog_6479ae370100hsq6.html function get_comments($num,$start){     $sql =" SELECT * FROM ecs_comment WHERE status = 1 AND parent_id = 0 and comment_type=0 ORDER BY add_time DESC  limit $start, $num&quo

分页原理+分页代码+分页类制作

分页显示是一种非常常见的浏览和显示大量数据的方法,属于web编程中最常处理的事件之一.对于web编程的老手来说,编写这种代码实在是和呼吸一样自然,但是对于初学者来说,常常对这个问题摸不着头绪,因此特地撰写此文对这个问题进行详细的讲解. 一.分页原理:       所谓分页显示,也就是将数据库中的结果集人为的分成一段一段的来显示,这里需要两个初始的参数: 每页多少条记录($PageSize)?       当前是第几页($CurrentPageID)? 现在只要再给我一个结果集,我就可以显示某段特

Oracle中经典分页代码!

在Oracle中因为没有top关键字,所以在sqlserver中的分页代码并不适用于Oracle,那么在Oracle中如何来实现分页呢? --查询所有数据 STUNO STUNAME STUAGE STUID STUSEAAT ------ -------------------- ---------- ---------- ---------- 9 王五 15 5.9876E+15 5 13 哈哈 15 5.9876E+15 5 15 李四 12 1.5666E+10 6 1 66 10 55