AJAX+php实现分页器:分页展示数据

效果图:

.html

<style>
        
        *{
            margin:0px;
            padding: 0px;
        }
        .pagination{
            width: 800px;
            height: 40px;
            border:1px solid red;
            margin: 20px auto;
        }
        table{
            margin:10px auto;
        }
        td,th{
            text-align: center;
            padding: 5px;
        }
</style>

 

<div class="pagination"></div>
    <table border='1' cellpadding='0' cellspacing='0'>
        <thead>
            <tr>
                <th>序号</th>
                <th>学生ID</th>
                <th>学生姓名</th>
                <th>学生年龄</th>
                <th>学生性别</th>
                <th>学生班级</th>
                <th>学生成绩</th>
            </tr>
        </thead>
        <tbody>
        </tbody>
    </table>
<script src="../pagination.js"></script>
    <script src="../ajax.js"></script>
    <script>
        //获取操作对象
        var tbody=document.querySelector("tbody")
        var pagination=document.querySelector('.pagination')
        //通过ajax获取数据
        ajax({
            url:'./pagination1.php',
            success:function(dt){
                //将后台响应过来的字符串转为对象
                var arr=eval('('+dt+')')
                
                //创建分页器对象
                var o1={
                    pageInfo:{
                        pagenum:1,
                        pagesize:12,
                        totalsize:arr.length,
                        totalpage:Math.ceil(arr.length/12)
                    },
                    textInfo:{
                        first:"首页",
                        prev:"上一页",
                        next:"下一页",
                        last:"尾页"
                    }
                }
                //创建分页器实例化对象
                new Pagination(pagination,o1,(m)=>{
                    //根据页码截取数组中对应的数据
                    //一页12条数据
                    var arr2=arr.slice((m-1)*12,m*12)
                    //创建字符串拼接所有内容
                    var str=''
                    //遍历数组
                    arr2.forEach((item,index)=>{
                       str+=`
                       <tr>
                            <td>${index+1}</td>
                            <td>${item.id}</td>
                            <td>${item.name}</td>
                            <td>${item.age}</td>
                            <td>${item.gender}</td>
                            <td>${item.class}</td>
                            <td>${item.score}</td>
                        </tr>
                       ` 
                    })
                    //把拼接好的数据渲染到tbody中
                    tbody.innerHTML=str
                })
            }
        })
    </script>

.php

<?php

header("content-type:text/html;charset=utf-8");

$link=mysqli_connect("localhost","root","","shop2");
//设置编码
mysqli_set_charset($link,"utf8");
//SQL语句
$sql="select * from student";
//结果集
$result=mysqli_query($link,$sql);
//存放所有数据
$arr=[];
//遍历每一条数据
while($row=mysqli_fetch_assoc($result)){
    array_push($arr,$row);
}

//数组转为字符串
echo json_encode($arr);
//关闭
mysqli_close($link);

?>

AJAX函数封装

function ajax(obj){
    //ajax():方法名
    //obj:参数集
    //默认参数
    var defaultObj={
        url:'',//请求地址
        type:'get',//请求方式
        async:true,//是否异步(表示异步,是默认值)
        data:'',//请求参数
        success:function(){},//请求成功的回调函数
        error:function(){} //请求失败的回调函数
    }
    //判断传入的参数中是否有请求地址
    if(!obj.url){
        throw new Error("必须书写请求地址")
    }
    //把传入的参数替换默认参数
    for(var attr in obj){
        //arr:传入的参数集obj里面的每一个参数
        defaultObj[attr]=obj[attr]
    }

    //创建ajax对象
    var xhr=new XMLHttpRequest()
    //判断当前defaultObj.data中是否存在内容
    if(defaultObj.data){
        //判断请求方式  toUpperCase:转换为大写,因为不确定用户书写的请求方式是大写还是小写,所有最好把传过来的type参数值转换大写
        if(defaultObj.type.toUpperCase()=="GET"){
            //配置请求信息
            xhr.open(defaultObj.type,defaultObj.url+"?"+defaultObj.data,defaultObj.async)
            //发送请求
            xhr.send()
        }else if(defaultObj.type.toUpperCase()=="POST"){
            //配置请求信息
            xhr.open(defaultObj.type,defaultObj.url,defaultObj.async)
            //设置请求头信息 告诉一下服务端我给你的是一个什么样子的数据格式
            //`application/x-www-form-urlencoded` 表示的数据格式就是 `key=value&key=value`
            xhr.setRequestHeader("content-type","application/x-www-form-urlencoded")
            //发送请求
            xhr.send(defaultObj.data)
        }
    }else{
        //配置请求信息
        xhr.open(defaultObj.type,defaultObj.url,defaultObj.async)
        //发送请求
        xhr.send()
    }

    //操作响应结果
    //监听ajax状态是否结束
    xhr.onreadystatechange=function(){
        //判断ajax状态是否结束
        if(xhr.readyState==4){
            //判断http请求是否成功
            if(xhr.status==200){
                //调用成功的回调函数
                defaultObj.success(xhr.responseText)
            }else{
                //调用失败的回调函数
                defaultObj.error(xhr.error)
            }
        }
    }
}

分页函数封装

//创建分页器的构造函数
function Pagination(ele,options,cb){
    //创建实例化属性
    this.ele=ele
    this.options=options||{}
    this.cb=cb||function(){}
    //创建默认属性
    this.default={
        //数据信息
        pageInfo:{
            pagenum:1, //当前页
            pagesize:10,//每页显示的条数
            totalsize:130,//总条数
            totalpage:13 //总页数
        },
        //文本信息
        textInfo:{
            first:"first", //首页
            prev:"prev", //上一页
            list:"",  //页码
            next:"next", //下一页
            last:"last" //尾页
        }
    }
    this.list=null //存放所有页码
    //调用入口函数
    this.init()
}
//创建入口函数
Pagination.prototype.init=function(){
    //调用替换参数的方法
    this.replace1()
    //显示大盒子中的信息
    this.showBox()
    //给大盒子对象添加点击事件
    this.clickBox()
}
//使用传入的参数去替换默认参数
Pagination.prototype.replace1=function(){
    //判断传入的参数中是否存在pageinfo
    if(this.options.pageInfo){
        //使用传入的参数替换默认参数
        for(let attr in this.options.pageInfo){
            //把传入的参数赋值给对应默认参数中的指定位置
            this.default.pageInfo[attr]=this.options.pageInfo[attr]
        }
    }

    if(this.options.textInfo){
        for(let attr in this.options.textInfo){
            this.default.textInfo[attr]=this.options.textInfo[attr]
        }
    }
}
//把数据信息放在大盒子中
Pagination.prototype.showBox=function(){
    //清空大盒子中的内容
    this.ele.innerHTML=''
    //给大盒子对象设置为弹性盒子
    setStyle(this.ele,{
        display: "flex",
        justifyContent: "center",
        alignItems: "center"
    })
    //显示文本信息
    this.showText()
    //显示页码信息
    this.showP()
    //给大盒子中设置禁用按钮
    this.stop1()
    //显示按钮信息
    this.showBtn()
    //调用回调函数
    this.cb(this.default.pageInfo.pagenum)
}
//创建按钮
Pagination.prototype.showBtn=function(){
    //创建输入框对象
    var inp=document.createElement("input")
    //给输入框添加文本
    inp.value=this.default.pageInfo.pagenum
    //给输入框对象设置样式
    setStyle(inp,{
        width:"30px",
        lineHeight:"20px"
    })
    //把当前输入框追加到大盒子中
    this.ele.appendChild(inp)
    //创建按钮对象
    var btn=document.createElement("button")
    //给按钮设置文本
    btn.innerHTML="GO"
    //给按钮设置样式
    setStyle(btn,{
        width:"30px",
        lineHeight:"20px"
    })
    //把按钮追加到大盒子中
    this.ele.appendChild(btn)

}
//禁用
Pagination.prototype.stop1=function(){
    //获取当前页码
    var pagenum=this.default.pageInfo.pagenum
    //获取最大页码
    var totalpage=this.default.pageInfo.totalpage
    //获取大盒子对象中所有的子div对象
    var divs=this.ele.children
    //判断当前页是否为第一页
    if(pagenum==1){
        divs[0].style.backgroundColor="#666"
        divs[1].style.backgroundColor="#666"
    }

    if(pagenum==totalpage){
        divs[3].style.backgroundColor="#666"
        divs[4].style.backgroundColor="#666"
    }
}
//显示文本信息
Pagination.prototype.showText=function(){
    //获取默认参数中的文本内容
    let textInfo=this.default.textInfo
    //遍历当前对象中的键值对
    for(var attr in textInfo){
        //创建div对象
        var newDiv=document.createElement("div")
        //给当前div对象添加class属性值
        newDiv.className=attr
        //判断当前attr是否等于list
        if(attr=="list"){
            this.list=newDiv
            //给当前页码盒子设置为弹性盒子
            setStyle(newDiv,{
                display: "flex",
                justifyContent: "center",
                alignItems: "center"
            })
        }else{
            setStyle(newDiv,{
                border:"1px solid red",
                margin:"0px 3px",
                padding:"2px 5px"
            })
            //给新的div对象添加文本
            newDiv.innerHTML=textInfo[attr]
        }
        //把新的div对象追加到大盒子中
        this.ele.appendChild(newDiv)
    }
}
//显示页码信息
Pagination.prototype.showP=function(){
    //获取默认参数中的当前页和总页数
    var pagenum=this.default.pageInfo.pagenum
    var totalpage=this.default.pageInfo.totalpage
    //判断总页数是否小于10
    if(totalpage<10){
        //遍历所有页码的数字
        for(let i=1;i<=totalpage;i++){
            //创建p标签对象
            var newP=createP(i,pagenum)
            //把当前p标签对象追加到list对象中
            this.list.appendChild(newP)
        }
    }else{
        //判断当前页码是多少
        if(pagenum<5){
            //前面5个
            for(let i=1;i<=5;i++){
                //创建p标签对象
                var newP=createP(i,pagenum)
                //把当前p标签对象追加到list对象中
                this.list.appendChild(newP)
            }
            //中间三个点
            var span=document.createElement('span')
            span.innerHTML="..."
            //把span标签追加到this.list中
            this.list.appendChild(span)
            //最后两个
            for(let i=totalpage-1;i<=totalpage;i++){
                //创建p标签对象
                var newP=createP(i,pagenum)
                //把当前p标签对象追加到list对象中
                this.list.appendChild(newP)
            }
        }else if(pagenum==5){
            //前面7个
            for(let i=1;i<=7;i++){
                //创建p标签对象
                var newP=createP(i,pagenum)
                //把当前p标签对象追加到list对象中
                this.list.appendChild(newP)
            }
            //中间三个点
            var span=document.createElement('span')
            span.innerHTML="..."
            //把span标签追加到this.list中
            this.list.appendChild(span)
            //最后两个
            for(let i=totalpage-1;i<=totalpage;i++){
                //创建p标签对象
                var newP=createP(i,pagenum)
                //把当前p标签对象追加到list对象中
                this.list.appendChild(newP)
            }
        }else if(pagenum>5 && pagenum<totalpage-4){
            //前面2个
            for(let i=1;i<=2;i++){
                //创建p标签对象
                var newP=createP(i,pagenum)
                //把当前p标签对象追加到list对象中
                this.list.appendChild(newP)
            }
            //中间三个点
            var span=document.createElement('span')
            span.innerHTML="..."
            //把span标签追加到this.list中
            this.list.appendChild(span)
            //中间5个
            for(let i=pagenum-2;i<=pagenum+2;i++){
                //创建p标签对象
                var newP=createP(i,pagenum)
                //把当前p标签对象追加到list对象中
                this.list.appendChild(newP)
            }
            //中间三个点
            var span2=document.createElement('span')
            span2.innerHTML="..."
            //把span标签追加到this.list中
            this.list.appendChild(span2)
            //最后两个
            for(let i=totalpage-1;i<=totalpage;i++){
                //创建p标签对象
                var newP=createP(i,pagenum)
                //把当前p标签对象追加到list对象中
                this.list.appendChild(newP)
            }
        }else if(pagenum==totalpage-4){
            //前面2个
            for(let i=1;i<=2;i++){
                //创建p标签对象
                var newP=createP(i,pagenum)
                //把当前p标签对象追加到list对象中
                this.list.appendChild(newP)
            }
            //中间三个点
            var span=document.createElement('span')
            span.innerHTML="..."
            //把span标签追加到this.list中
            this.list.appendChild(span)
            //最后7个
            for(let i=totalpage-6;i<=totalpage;i++){
                //创建p标签对象
                var newP=createP(i,pagenum)
                //把当前p标签对象追加到list对象中
                this.list.appendChild(newP)
            }
        }else if(pagenum>totalpage-4){
            //前面2个
            for(let i=1;i<=2;i++){
                //创建p标签对象
                var newP=createP(i,pagenum)
                //把当前p标签对象追加到list对象中
                this.list.appendChild(newP)
            }
            //中间三个点
            var span=document.createElement('span')
            span.innerHTML="..."
            //把span标签追加到this.list中
            this.list.appendChild(span)
            //最后7个
            for(let i=totalpage-4;i<=totalpage;i++){
                //创建p标签对象
                var newP=createP(i,pagenum)
                //把当前p标签对象追加到list对象中
                this.list.appendChild(newP)
            }
        }
    }
}
//给大盒子添加点击事件
Pagination.prototype.clickBox=function(){  
    //给大盒子添加点击事件
    this.ele.onclick=(e)=>{
        //获取当前页
        var pagenum=this.default.pageInfo.pagenum
        //事件对象兼容
        var e = e || window.event
        //获取当前操作对象
        var target=e.target || e.srcElement
        //下一页
        if(target.className=="next" && pagenum!=this.default.pageInfo.totalpage){
            //改变当前页码
            this.default.pageInfo.pagenum+=1
            //重新刷新大盒子中的内容
            this.showBox()
        }
        //上一页
        if(target.className=="prev" && pagenum!=1){
            //改变当前页码
            this.default.pageInfo.pagenum-=1
            //重新刷新大盒子中的内容
            this.showBox()
        }
        //尾页
        if(target.className=='last' && pagenum!=this.default.pageInfo.totalpage){
            //改变当前页码
            this.default.pageInfo.pagenum=this.default.pageInfo.totalpage
            //重新刷新大盒子中的内容
            this.showBox()
        }
        //首页
        if(target.className=="first" && pagenum!=1){
            //改变当前页码
            this.default.pageInfo.pagenum=1
            //重新刷新大盒子中的内容
            this.showBox()
        }
        //点击页码
        if(target.nodeName=="P" && pagenum!=target.innerHTML){
            //把当前点击对象的文本获取,并赋值给默认参数
            this.default.pageInfo.pagenum=parseInt(target.innerHTML)
            this.showBox()
        }
        //点击go按钮
        if(target.nodeName=="BUTTON" && target.previousElementSibling.value!=pagenum){
            //把输入框中的value值赋值给到当前页
            this.default.pageInfo.pagenum=parseInt(target.previousElementSibling.value)
            this.showBox()
        }
    }
}
//创建页码p标签
function createP(m,nn){
    //创建p标签
    var p1=document.createElement("p")
    //给当前p标签添加内容
    p1.innerHTML=m
    //给p标签设置样式
    setStyle(p1,{
        border:"1px solid red",
        margin:"0px 3px",
        padding:"2px 5px"
    })
    //判断m是否为当前被选中的页码
    if(m==nn){
        setStyle(p1,{
            backgroundColor:"#ccc"
        })
    }
    return p1
}
//给当前元素设置样式
function setStyle(ele,options){
    //遍历样式对象
    for(var attr in options){
        ele.style[attr]=options[attr]
    }
}

 

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现分页的一种常见方式是使用 AjaxPHP。下面是一个简单的示例: 1. HTML 页面中放置一个用于显示分页结果的 div 元素: ```html <div id="results"></div> ``` 2. 在 JavaScript 中编写 Ajax 请求函数: ```javascript function getPage(pageNum) { $.ajax({ url: 'get_page.php', type: 'POST', data: {page: pageNum}, success: function(response) { $('#results').html(response); } }); } ``` 这个函数会向服务发送一个 POST 请求,其中包含当前页码 pageNum。服务将返回分页结果,然后在 success 回调函数中将结果显示在结果 div 中。 3. 在 PHP 中编写分页代码: ```php // 获取当前页码 $page = isset($_POST['page']) ? $_POST['page'] : 1; // 计算从哪里开始查询 $start = ($page - 1) * $perPage; // 查询数据库 $result = mysqli_query($conn, "SELECT * FROM mytable LIMIT $start, $perPage"); // 显示分页结果 while ($row = mysqli_fetch_assoc($result)) { echo '<div>' . $row['content'] . '</div>'; } // 显示分页链接 echo '<div class="pagination">'; for ($i = 1; $i <= $totalPages; $i++) { if ($i == $page) { echo '<span class="current">' . $i . '</span>'; } else { echo '<a href="javascript:getPage(' . $i . ')">' . $i . '</a>'; } } echo '</div>'; ``` 这个 PHP 代码会根据当前页码计算出查询的起始位置,并从数据库中获取当前页的数据。然后它会将数据显示在页面上,并生成分页链接。 注意,这只是一个简单的示例,实际应用中可能需要更多的逻辑和处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值