Web页面分页显示+局部刷新

Web页面分页展示+局部刷新

整合handlebars.js+自定义分页按钮jquery

设计背景:

在日常的Web开发中,我们经常做的一件事就是分页设计;Web页面分页展示可以给用户非常良好的体验,所以做好分页将是程序员的一项基本功。分页的后台设计,使用过MyBatis、Hibernate、JFinal等框架的童鞋都知道,后台分页查询只需要套用模板代码,操作极其简单,如果用原生sql语句编写对于我们来说也是常规操作。分页的前端设计,使用原生jQuery和JSTl+EL语句实现,当点击翻页按钮时刷新整个页面将不需要过多的DOM拼接操作,使用EL语句取值便是;但有些业务场景,翻页并不需要刷新页面,所以点击按钮实现局部请求数据,响应之后就需要大量的DOM拼接代码,这样会更加繁琐。本文介绍使用handlebars.js插件实现模板式页面刷新,并采用自定义分页按钮jQuery插件实现按钮展示。

1. 环境搭建

1.1 handlebars.js

Handlebars 是 JavaScript 一个语义模板库,通过对view和data的分离来快速构建Web模板。可通过如下地址下载:http://builds.handlebarsjs.com.s3.amazonaws.com/handlebars-v4.0.12.js。

<script type="text/javascript" src="/js/assets/jquery-3.1.0.min.js"></script>
<script type="text/javascript" src="/js/handlebars/handlebars-v4.0.12.js"></script>

需要映入jQuery。

1.2 myPagination

自定义一个分页按钮插件(或网上下载),有js代码和css样式代码,实现分页按钮的动态展示和发送数据请求。这里提供本文使用下载:

http://pj992190r.bkt.clouddn.com/myPagination.css

http://pj992190r.bkt.clouddn.com/myPagination.js

<link rel="stylesheet" href="/js/pagination/myPagination.css">
<script src="/js/pagination/myPagination.js"></script>

2. 代码编写

2.1 实现业务目标

1544879621279

分页展示数据列表,点击按钮实现局部刷新。

2.2 HTML代码

<h2>Hello Pagination!</h2>
<%--表格--%>
<table id="myList">

</table>
<%--分页按钮--%>
<div id="pagination" class="pagination"></div>

准备table标签和翻页按钮容器div标签。

2.2 handlebars模板代码

<script id="entry-template" type="text/x-handlebars-template">
    <tr>
        <th>序号</th>
        <th>姓名</th>
        <th>年龄</th>
    </tr>
    {{#list list}}
    <tr>
    <td>{{id}}</td>
    <td>{{name}}</td>
    <td>{{age}}</td>
    </tr>
    {{/list}}
</script>

自定义handlebars模板,实现DOM拼接。

2.3 JS代码

Ⅰ. handlebars操作(加载模板)
//自定义handlebars模板,DOM拼接(表格)
Handlebars.registerHelper('list', function(items, options) {
    var out = "";
    for(var i=0, l=items.length; i<l; i++) {
        out = out+options.fn(items[i]);
    }
    return out;
});
//加载自定义handlebars模板
var source = $("#entry-template").html();
var template = Handlebars.compile(source);
Ⅱ. 加载翻页按钮方法
//加载翻页按钮
function loadPage(total,pages,curPage) {
    new Page({
        id: 'pagination',
        pageTotal: pages, //必填,总页数
        pageAmount: 5,  //每页多少条
        dataTotal: total, //总共多少条数据
        curPage:curPage, //初始页码,不填默认为1
        pageSize: 5, //分页个数,不填默认为5
        showPageTotalFlag:true, //是否显示数据统计,不填默认不显示
        showSkipInputFlag:true, //是否支持跳转,不填默认不显示
        getPage: function (page) {
            //分页查询
            queryDatas(page);
        }
    })

}
Ⅲ. 分页查询方法
//分页查询
function  queryDatas(pageNum) {
    var params={};
    params.pageNum=1;//默认查询第一页
    params.pageSize=5;//每页显示5条
    //params.xxx = "xxx",这里也可以添加查询条件
    if(pageNum==null){
        params.pageNum=pageNum;
    }
    $.ajax({
        type:"post",
        url: "/myJson.json",//这里本地模拟请求的json数据
        data:params,
        dataType:"json",
        success:function (data) {
            var list=data.list;//后台传来的数据列表
            var total=data.total;//总记录条数
            var pages=data.pages;//总记录页数
            var curPage=data.pageNum;//当前页数
            if(data.total>0){
                //调用上述按钮加载方法
                loadPage(total,pages,curPage);
                // 使用handlebars模板拼接列表dom并输出到页面
                var html = template(data);
                document.getElementById("myList").innerHTML = html;
            }else{
                $("#pagination").html("<img style='margin-left: -70px;padding:40px;' " +
                    "src='/img/zanwushuju.png'>");//这里进行未查询到数据的操作
            }
        }
    })
}
Ⅴ. 页面加载完毕执行
$(function () {
    queryDatas(1);//页面初次加载时默认查询第一页
});

2.4 json数据模拟

myJson.json文件,模拟本地响应请求。

{
  "pageNum": 1,
  "pageSize": 5,
  "size": 5,
  "total": 7,
  "pages": 2,
  "list":[
        {
          "id": "001",
          "name": "zhangsan",
          "age": 19
        },
        {
          "id": "002",
          "name": "lisi",
          "age": 20
        },
        {
          "id": "003",
          "name": "wangwu",
          "age": 21
        },
        {
          "id": "004",
          "name": "zhaoliu",
          "age": 22
        },
        {
          "id": "005",
          "name": "tianqi",
          "age": 23
        }
      ]
}

3. 完整代码

<!DOCTYPE html>
<html lang="en">
<head>
    <%@ page contentType= "text/html;charset=utf-8"%>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <title>Pagination</title>
    <link rel="stylesheet" href="/js/pagination/myPagination.css">
    <style>
        table,table tr th, table tr td { border:1px solid #0094ff; }
        table { width: 200px; min-height: 25px; line-height: 25px; text-align: center; border-collapse: collapse;}
    </style>
    <script type="text/javascript" src="/js/assets/jquery-3.1.0.min.js"></script>
    <script type="text/javascript" src="/js/handlebars/handlebars-v4.0.12.js"></script>
</head>
<body>
<h2>Hello Pagination!</h2>
<%--表格--%>
<table id="myList">

</table>
<%--分页按钮--%>
<div id="pagination" class="pagination"></div>

</body>
<script src="/js/pagination/myPagination.js"></script>
<script id="entry-template" type="text/x-handlebars-template">
    <tr>
        <th>序号</th>
        <th>姓名</th>
        <th>年龄</th>
    </tr>
    {{#list list}}
    <tr>
    <td>{{id}}</td>
    <td>{{name}}</td>
    <td>{{age}}</td>
    </tr>
    {{/list}}
</script>

<script type="text/javascript">
    $(function () {
        queryDatas(1);
    });

    //自定义handlebars模板,拼接DOM(列表)
    Handlebars.registerHelper('list', function(items, options) {
        var out = "";
        for(var i=0, l=items.length; i<l; i++) {
            out = out+options.fn(items[i]);
        }
        return out;
    });
    //加载自定义handlebars模板
    var source = $("#entry-template").html();
    var template = Handlebars.compile(source);

    //加载分页按钮
    function loadPage(total,pages,curPage) {
        new Page({
            id: 'pagination',
            pageTotal: pages, //必填,总页数
            pageAmount: 5,  //每页多少条
            dataTotal: total, //总共多少条数据
            curPage:curPage, //初始页码,不填默认为1
            pageSize: 5, //分页个数,不填默认为5
            showPageTotalFlag:true, //是否显示数据统计,不填默认不显示
            showSkipInputFlag:true, //是否支持跳转,不填默认不显示
            getPage: function (page) {
                //分页查询
                queryDatas(page);
            }
        })
    }

    //分页查询
    function  queryDatas(pageNum) {
        var params={};
        params.pageNum=1;
        params.pageSize=5;
        if(pageNum==null){
            params.pageNum=pageNum;
        }

        $.ajax({
            type:"post",
            url: "/myJson.json",
            data:params,
            dataType:"json",
            success:function (data) {
                var list=data.list;
                var total=data.total;
                var pages=data.pages;
                var curPage=data.pageNum;
                if(data.total>0){
                    //调用按钮加载
                    loadPage(total,pages,curPage);
                    // 使用handlebars模板拼接列表dom并输出到页面
                    var html = template(data);
                    document.getElementById("myList").innerHTML = html;
                }else{
                    $("#pagination").html("<img style='margin-left: -70px;padding:40px;' " +
                                          "src='/img/zanwushuju.png'>");
                }
            }
        })

    }

</script>
</html>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql" %> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>动漫搜索</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> <script type="text/javascript"> var xmlhttp; function loadXMLDoc(url,cfun) { // alert("hadhfaf"); xmlhttp=new XMLHttpRequest(); xmlhttp.onreadystatechange=cfun; xmlhttp.open("GET",url,true); xmlhttp.send(); } function myfunction(id,times) { //alert("123"); loadXMLDoc("open.jsp?id="+id+"&times="+times+"&t="+Math.random(),function() { //alert(xmlhttp.status); if(xmlhttp.readyState==4 && xmlhttp.status==200) { document.getElementById(id).innerHTML=xmlhttp.responseText; } }); } </script> <% //currentPage当前显示页数 if (request.getParameter("currentPage") == null||request.getParameter("currentPage").equals("")) { pageContext.setAttribute("currentPage", new Integer(0)); } else { pageContext.setAttribute("currentPage", request .getParameter("currentPage")); } %> <sql:query var="rs" dataSource="jdbc/mysql"> select* from anime </sql:query> <!-- 得到所有记录数 --> <c:set var="resultNum"> <jsp:getProperty name="rs" property="rowCount" /> </c:set> <!-- 每页显示记录数 --> <c:set var="PerPageNum" value="3" /> </head> <style type="text/css"> body{background-color:} </style> <body> <% int perPageNum = Integer.parseInt((String) pageContext .getAttribute("PerPageNum")); int resultNum = Integer.parseInt((String) pageContext .getAttribute("resultNum")); int pageNum; //如果所有记录数除每页显示记录数没有余数-1 if((int)resultNum%perPageNum==0) pageNum = (int)(resultNum / perPageNum-1); else pageNum = (int)(resultNum / perPageNum); pageContext.setAttribute("pageNum", pageNum); %> <div style="border:1px solid #cccccc; width:1100px;margin:100px 0 0 90px"> <table style=" width:1100px;"> <tr> <td>序号</td> <td>热搜动漫</td> <td>动漫简介</td> <td>更新集数</td> <td>搜索指数</td> <td>动漫详情</td> </tr> <c:if test="${currentPage lt 0 }"><!-- 当前显示页小于0 --> <c:set var="currentPage" value="0"></c:set> </c:if> <c:if test="${currentPage gt pageNum}"><!-- 当前显示页大于总页数 --> <c:set var="currentPage" value="${pageNum }"></c:set> </c:if> <c:set var="currentPage" value="${currentPage}" scope="session" /> <!-- 循环查找记录 --> <c:forEach var="row" items="${rs.rows}" begin="${currentPage*PerPageNum}" end="${PerPageNum+currentPage*PerPageNum-1}" > <tr> <td> ${row.id }</td> <td> <img src="image/${row.image}" width="50" height="50"/></td> <td style="width:600"> ${row.introduce}</td> <td> ${row.blues} </td> <td> ${row.times }</td> <c:set var="times" value="${row.times }" scope="session" /> <td> <input type="button" value="展开" onclick="myfunction(${row.id },${row.times })"/> </td> </tr> <tr> <td colspan=6 id="${row.id}"></td> </tr> </c:forEach> </table> <div style="margin:0px 0px 0px 800px"> 总共有${pageNum+1}页-第${currentPage+1}页-<a href="index.jsp?currentPage=${currentPage-1}">上一页</a> - <a href="index.jsp?currentPage=${currentPage+1}">下一页</a> </div> </div> </body> </html>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值