最详细的JS动态创建表格以及实现分页!

本文详细介绍了如何使用HTML、JavaScript和jQuery实现动态表格渲染、搜索功能、页码展示、分页以及快速查找分页等操作。包括动态创建表格、搜索框事件监听、页码和分页状态的更新,以及分页显示优化,如在页码展示中使用省略号。示例代码详尽,涵盖了从基础HTML结构到交互逻辑的全过程。
摘要由CSDN通过智能技术生成

整篇文章用HTML+JS+JQ实现的功能有:渲染表格,表格搜索,页码详情展示、分页以及分页的快速查找。

效果图

先看效果,在没有数据的情况下。(图一)
图一
完整页面在搜索框输入关键字4,并查找的情况下。(图二)
图二

完整的HTML代码

话不多说先上完整的html代码,为了方便我把css写在一起的。

		  <div>
            <div style="overflow: hidden">
                <input type="text" class="form-control" id="search-input" placeholder="搜索"
                       style="height: 30px!important;width:20%;float:right;margin: 5px 0;">
            </div>
            <div id="table-box" style="height: 428px; clear: both;">
                <table class="table table-striped" style="margin: 0;">
                    <thead style="background-color: #eee;">
                    <tr>
                        <th scope="col"></th>
                        <th scope="col">小区编码</th>
                        <th scope="col">小区名称</th>
                    </tr>
                    </thead>
                    <tbody id="tbody">
                    <!--                <tr>-->
                    <!--                    <th style="width:8%;text-align: center;cursor: pointer">-->
                    <!--                        <input type="radio" id="check-radio" name="isCheck">-->
                    <!--                    </th>-->
                    <!--                </tr>-->
                    </tbody>
                </table>
            </div>
            <nav aria-label="Page navigation example" style="display: flex;align-items: center;justify-content: space-between;height: 74px;">
                <div id="page-text">
                    <!--                    <div style="float: left">-->
                    <!--                        <span class="first-page"></span>~-->
                    <!--                        <span class="last-page"></span>,-->
                    <!--                    </div>-->
                    <!--                    <div style="float: left">总共-->
                    <!--                        <span class="page-total"></span>-->
                    <!--                        条数据</div>-->
                </div>
                <div style="display: flex;align-items: center">
                    <ul class="pagination">
                        <!--                    <li class="page-item" id="pre">-->
                        <!--                        <a class="page-link" href="#" aria-label="Previous">-->
                        <!--                            <span aria-hidden="true">&laquo;</span>-->
                        <!--                        </a>-->
                        <!--                    </li>-->
                        <!--                    <li class="page-item"><a class="page-link" href="#">1</a></li>-->
                        <!--                    <li class="page-item"><a class="page-link" href="#">2</a></li>-->
                        <!--                    <li class="page-item"><a class="page-link" href="#">3</a></li>-->
                        <!--                    <li class="page-item" id="next">-->
                        <!--                        <a class="page-link" href="#" aria-label="Next">-->
                        <!--                            <span aria-hidden="true">&raquo;</span>-->
                        <!--                        </a>-->
                        <!--                    </li>-->
                    </ul>
                    <input style="width:50px;margin: 0 5px" type="text" class="form-control" id="search-page" />
                    <div  class="btn btn-default page-confirm" >跳转</div>
                </div>
            </nav>
          </div>

直接复制html代码然后把注释的放开就是图一的效果了,

生成表格

写完了静态的html,那么接下来先渲染表格,这是表格的html代码

            <div id="table-box" style=" height: 428px; clear: both;">
                <table class="table table-striped" style="margin: 0;">
                    <thead style="background-color: #eee;">
                    <tr>
                        <th scope="col"></th>
                        <th scope="col">小区编码</th>
                        <th scope="col">小区名称</th>
                    </tr>
                    </thead>
                    <tbody id="tbody">
                    </tbody>
                </table>
            </div>

因为要动态获取表格的高度所以外面加了个盒子。
这是动态生成表格高度的代码

        let tableHeight = document.getElementById("table-box")
        tableHeight.style.height = data.length * 30(每条数据的高度)+ 40(thead的高度) + "px"   //data.length为每页有多少条数据。

接下来动态生成表格的js代码

                  for (let i = 0; i < data.length; i++) {  //data为后端返回的数据
                    var html = "";
                    html += `<tr>
                                 <td style="width:8%;text-align: center;cursor: pointer">
                                 <input type="radio" class="check-radio" name="radio-group"
                                 data-isCheck="${data[i].id == tableList.id ? 'isCheck' : ''}" >
                                 </td>
                                 <td>${data[i].id}</td>
                                 <td>${data[i].Name}</td>
                             </tr>`;
                    $('#tbody').append(html);
                    $('input[data-isCheck="isCheck"]').attr("checked", true);  //true为选择,false为取消选择
                  }

生成了表格后的页面
在这里插入图片描述
单选框选择触发事件用这个方法

                // 根据单选框触发是否提交事件!
                $('input:radio.check-radio').change(function () {
                   console.log(this)  //里面自己写需要的功能
                })

搜索功能

接下来搜索功能,在主函数中定义searchList()这个方法

        searchList() {
            let searchInput = document.getElementById("search-input")
            searchInput.addEventListener("keyup", function (event) { //搜索用的键盘回车事件
                event.preventDefault();
                let searchValue = $("#search-input").val()
                if (event.keyCode === 13) {
                    let data = searchValue
                    getTableList(data, 1) //getTableList为表格查询请求接口的方法
                }
            });
        },

这里就实现了搜索功能,效果看图
在这里插入图片描述

表格下面的功能

接下来实现表格下面的功能,html代码

            <nav aria-label="Page navigation example" style="display: flex;align-items: center;justify-content: space-between;height: 74px;">
                <div id="page-text">
                </div>
                <div style="display: flex;align-items: center">
                    <ul class="pagination">
                    </ul>
                    <input style="width:50px;margin: 0 5px" type="text" class="form-control" id="search-page" />
                    <div  class="btn btn-default page-confirm" >跳转</div>
                </div>
            </nav>

实现之前要先定义一个对象来储存页码信息

    var pageList= {       //不要在意名字===/~_~/
        pageNo: 1,    //当前页
        pageSize: 10,   //一页多少条,我这里写死了的没有涉及到改变展示页数
        pageCount: 0,    //总共多少条
        pageTotal: 0,    //总共多少页
        pagingShowNum: []  //展示的页码数组成的数组
    };
    var newPagingShowNum=[]  //定义一个新的页码数组成的数组,来装页码

并在请求到后端返回的接口数据中初始化pageObj 对象

                pageList.pageNo = data.pageNum    //当前页
                pageList.pageCount = data.count   //总共多少条数据
                pageList.pageTotal = Math.ceil(pageList.pageCount / pageList.pageSize) //总共多少页

左下的页码展示

实现动态生成左下的页码展示

 $("#page-text").append(`
          当前第<span style="color: #a2a2a2">${pageList.pageNo}</span>页,总<span style="color: #a2a2a2">${pageList.pageCount}</span>条,共<span style="color: #a2a2a2">${pageList.pageTotal}</span>页
          `)

效果图
在这里插入图片描述

分页

接下来实现分页,分页有点复杂,当显示到中间时效果如图
在这里插入图片描述

因为我做的分页只展示四条数据,涉及到小于五条与大于四条分页时两种情况。
定义pagingShowNum

                    if (pageList.pageTotal <= 5) {
                        for (let i = 0; i < pageList.pageTotal; i++) {
                            pageList.pagingShowNum[i] = i + 1
                        }
                    } else {
                        for (let i = 0; i < 4; i++) {       //最长显示五页
                            pageList.pagingShowNum[i] = i + 1
                        }
                        pageList.pagingShowNum[pageList.pagingShowNum.length - 1] = pageList.pageTotal
                    }

动态生成分页的js代码

           if (pageList.pageTotal <= 5) {//小于五条的情况
                     $(".pagination").append(`
                         <li class="page-item" id="pre">
                       		 <a class="page-link" href="#" aria-label="Previous">
                            	<span aria-hidden="true">&laquo;</span>
                         	 </a>
                         </li>
                    	 <li class="page-item"><a class="pageFirst" href="#">1</a></li>
                   		 <li class="page-item" id="page-div"></li>
                   		 <li class="page-item" id="next">
                      	   <a class="page-link" href="#" aria-label="Next">
                             <span aria-hidden="true">&raquo;</span>
                     	   </a>
                  		</li>
                    `)
                        for (let i = 1; i < pageList.pagingShowNum.length; i++) {
                            if (pageList.pagingShowNum[i]) {
                                $("#page-div").append(`
                                <a class="page-link page-a" href="#" >${pageList.pagingShowNum[i]}</a>
                                `)
                            }
                        }
                    } else { }//大于四条的情况   

当页数大于4条时就要考虑生成…来隐藏没有展示的代码

                  $(".pagination").append( `
                    <li class="page-item" id="pre">
                        <a class="page-link" href="#" aria-label="Previous">
                            <span aria-hidden="true">&laquo;</span>
                        </a>
                    </li>
                    <li class="page-item"><a class="pageFirst" href="#">1</a></li>
                    <li class="page-item" id="page-div"></li>     <!--中间动态生成的页码-->
                    <li class="page-item"><a class="pageLast" href="#">${pageList.pageTotal}            </a></li>
                    <li class="page-item" id="next">
                        <a class="page-link" href="#" aria-label="Next">
                            <span aria-hidden="true">&raquo;</span>
                        </a>
                    </li>
               `)
                        $('#page-div').after(`
                      <li class="page-item" ><a class="ellipsis-right" href="#">...</a></li>
                 `); //右边省略号
                        $('#page-div').before(`
                      <li class="page-item" ><a class="ellipsis-left" href="#">...</a></li>
                 `); //左边省略号
                        for (let i = 1; i < pageList.pagingShowNum.length - 1; i++) {
                            if (newPagingShowNum.length != 0) {
                                pageList.pagingShowNum[1] = newPagingShowNum[1]
                                pageList.pagingShowNum[2] = newPagingShowNum[2]
                                $("#page-div").append(`
                <a class="page-link page-a" href="#">${pageList.pagingShowNum[i]}</a>`)
                            } else {
                                if (pageList.pagingShowNum[i]) {
                                    $("#page-div").append(`
                <a class="page-link page-a" href="#">${pageList.pagingShowNum[i]}</a>
                `)
                                }
                            }
                        }
                        if (pageList.pagingShowNum[2] < 4) {
                            $(".ellipsis-left").hide()    //中间页面小于4,左边省略号隐藏
                        }
                        if (pageList.pagingShowNum[2] > pageList.pageTotal - 2) {
                            $(".ellipsis-right").hide()   //中间页面大于最大页码-2,右边省略号隐藏
                        }

右边省略号展开

                $(".ellipsis-right").on("click", function () {
                    $("#page-div").empty()
                    if (pageList.pagingShowNum[2] < pageList.pageTotal - 2) {
                        pageList.pagingShowNum[1] = pageList.pagingShowNum[1] + 2
                        pageList.pagingShowNum[2] = pageList.pagingShowNum[2] + 2
                    } else {      //点到最右边是[1,…,total-2,total-1,total]
                        pageList.pagingShowNum[1] = pageList.pageTotal - 2
                        pageList.pagingShowNum[2] = pageList.pageTotal - 1
                        $(".ellipsis-right").hide()
                    }
                    if (pageList.pagingShowNum[2] == pageList.pageTotal - 1) {
                        $(".ellipsis-right").hide()
                    }
                    if (pageList.pagingShowNum[1] > 3) {
                        $(".ellipsis-left").show()
                    }
                    for (let i = 1; i < pageList.pagingShowNum.length - 1; i++) {
                        if (pageList.pagingShowNum[i]) {
                            $("#page-div").append(`
                <a class="page-link page-a" href="#">${pageList.pagingShowNum[i]}</a>
                `)
                        }
                    }
                    newPagingShowNum= pageList.pagingShowNum
                })

在这里插入图片描述

左边省略号展开

                $(".ellipsis-left").on("click", function () {
                    $("#page-div").empty()
                    if (pageList.pagingShowNum[1] > 3) {
                        pageList.pagingShowNum[1] = pageList.pagingShowNum[1] - 2
                        pageList.pagingShowNum[2] = pageList.pagingShowNum[2] - 2
                        $(".ellipsis-right").show()
                    } else {  //点到最左边是[1,2,3,…,total]
                        pageList.pagingShowNum[1] = 2
                        pageList.pagingShowNum[2] = 3
                    }
                    if (pageList.pagingShowNum[1] < 3) {
                        $(".ellipsis-left").hide()
                    }
                    for (let i = 1; i < pageList.pagingShowNum.length - 1; i++) {
                        if (pageList.pagingShowNum[i]) {
                            $("#page-div").append(`
                <a class="page-link page-a" href="#">${pageList.pagingShowNum[i]}</a>
                `)
                        }
                    }
                    newPagingShowNum = pageList.pagingShowNum
                })

在这里插入图片描述

页码选择

                $("#page-div").on("click", function (e) {
                    if (e.target.classList.value.includes("page-a")) {
                        let pageNum = Number(e.target.text)
                        Action.isValue("", pageNum)   //向后端请求数据的方法
                        if (pageNum >= 3 && pageNum != newPagingShowNum[2] && pageNum < pageList.pageTotal) {
                            newPagingShowNum = [1, pageNum - 1, pageNum, pageList.pageTotal]
                        } else if (pageNum >= 3 && pageNum == newPagingShowNum[2] && pageNum < pageList.pageTotal - 1) {
                            newPagingShowNum = [1, pageNum, pageNum + 1, pageList.pageTotal]
                        } else if (pageNum < 3) {
                            newPagingShowNum = [1, 2, 3, pageList.pageTotal]
                        }
                    }
                })

在这里插入图片描述
第一页

                $(".pageFirst").on("click", function () {
                    let pageNum = 1
                    Action.isValue("", pageNum)  //向后端请求数据的方法
                    newPagingShowNum = [1, 2, 3, pageList.pageTotal]
                })

在这里插入图片描述

最后一页

                $(".pageLast").on("click", function () {
                    let pageNum = pageList.pageTotal
                    Action.isValue("", pageNum)   //向后端请求数据的方法
                    newPagingShowNum = [1, pageNum - 2, pageNum - 1, pageList.pageTotal]
                })

在这里插入图片描述
上一页

                $("#pre a").on('click', function () {
                    if (pageList.pageNo > 1) {
                        let pageNum = pageList.pageNo - 1;
                        Action.isValue("", pageNum)    //向后端请求数据的方法
                        if (pageNum > 2 && pageNum < pageList.pageTotal) {
                            newPagingShowNum = [1, pageNum - 1, pageNum, pageList.pageTotal]
                        } else if (pageNum = 2) {
                            newPagingShowNum = [1, pageNum, pageNum + 1, pageList.pageTotal]
                        }
                    }
                });

下一页

                $("#next a").on('click', function () {
                    if (pageList.pageNo < pageList.pageTotal) {
                        let pageNum = pageList.pageNo + 1;
                        Action.isValue("", pageNum)    //向后端请求数据的方法
                        if (pageNum > 2 && pageNum < pageList.pageTotal - 1) {
                            newPagingShowNum = [1, pageNum, pageNum + 1, pageList.pageTotal]
                        } else if (pageNum = pageList.pageTotal - 1) {
                            newPagingShowNum = [1, pageNum - 1, pageNum, pageList.pageTotal]
                        }
                    }
                });

分页到这里就结束了,有些地方要多思考。

快速查找分页

在这里插入图片描述
最后实现跳转功能,接下来搜索功能,在主函数中定义pageSearch()这个方法
话不多说,上代码

        pageSearch() {
            let searchPage = document.getElementById("search-page")
             //同时绑定了鼠标点击跳转按钮事件和输入数字后直接按Enter回车搜索
            searchPage.addEventListener("keyup", function (e) {  
                e.preventDefault()
                if (event.keyCode === 13) {
                    $(".page-confirm").click()
                }
            })
            $(".page-confirm").on("click", function (e) {
                e.preventDefault()
                let pageValue = Number($("#search-page").val())
                //正则判断
                if (!pageValue) {
                    Action.isValue("", 1)     //向后端请求数据的方法,这里输入错误默认返回第一页
                    pageList.pageMessage = "请输入数字!"
                } else if (pageValue <= 0) {
                    Action.isValue("", 1)    //向后端请求数据的方法,这里输入错误默认返回第一页
                    pageList.pageMessage = "请输入正整数!"
                } else if (Math.floor(pageValue) === pageValue) {
                    if (pageValue > pageList.pageTotal) {
                        Action.isValue("", 1)    //向后端请求数据的方法,这里输入错误默认返回第一页
                        pageList.pageMessage = "超出最大页码!"
                    } else {
                        Action.isValue("", pageValue)   //向后端请求数据的方法,这里输入成功查找pageValue
                        pageList.pageMessage = "查找成功!"
                        //页码改变了,newPagingShowNum这个储存页码的数组也要改变
                        if (pageValue < pageList.pageTotal - 1 && pageValue > 1) {
                            newPagingShowNum = [1, pageValue, pageValue + 1, pageList.pageTotal]
                        } else if (pageValue == pageList.pageTotal - 1) {
                            newPagingShowNum = [1, pageValue - 1, pageValue, pageList.pageTotal]
                        } else if (pageValue == 1) {
                            newPagingShowNum = [1, 2, 3, pageList.pageTotal]
                        } else if (pageValue == pageList.pageTotal) {
                            newPagingShowNum = [1, pageValue - 2, pageValue - 1, pageList.pageTotal]
                        }
                    }
                } else {
                    Action.isValue("", 1)
                    pageList.pageMessage = "请输入整数!"   //向后端请求数据的方法,这里输入错误默认返回第一页
                }
            })
        },

在这里插入图片描述
到这里基本上关于表格的所有功能都实现了,有什么问题欢迎补充…,对了没有实现改变点击改变按钮颜色,有什么更好的方法欢迎补充… 在这里插入图片描述

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jet_closer

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值