博客列表 >项目整改-实现获取栏目数据和分页功能--2019/07/29

项目整改-实现获取栏目数据和分页功能--2019/07/29

LISTEN的博客
LISTEN的博客原创
2019年07月30日 22:13:19511浏览

对之前项目进行整改,实现通过点击按钮,利用ajax获取数据库栏目信息,和获取栏目的详细列表信息,并实现分页功能。

1、首页代码 index.html

实例

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <link rel="stylesheet" href="../static/css/header.css">
    <link rel="stylesheet" href="../static/css/footer.css">
    <link rel="stylesheet" href="../static/css/about.css">
    <title>首页</title>
    <style>
        .btn{
            margin: 20px;
           font-size: 16px;
        }

        .tab{
            width: 1000px;
            margin: 0px auto;
            overflow: hidden;
            display: none;
        }

        .tab table{
            width: 1000px;
            /*order-collapse 属性设置表格的边框是否被合并为一个单一的边框,*/
            border-collapse: collapse;
        }
        .tab th,td{
            border: 1px solid black;
            text-align: center;
        }

        .tab thead>tr{
            background-color: #00F7DE;
        }

        .ulpage,li{
            padding: 0;
            margin: 5px auto;
            list-style: none;
            text-align: center;
            overflow: hidden;
        }

        .ulpage li{
            display: inline-block;
            width: 30px;
            height: 20px;
            border: 1px solid black;
            margin-left: 3px;
        }

        .ulpage li:hover{
            background-color: #00F7DE;
            cursor: pointer;
        }

        .tab .active{
            background-color: #00F7DE;
        }
    </style>
</head>
<body>
<!-- 头部 -->
<div class="header">
    <div class="content">
        <ul class="nav">
            <li class="item"><a href="index.html">首页</a></li>
        </ul>
    </div>
</div>
<button class="btn">获取栏目</button>
<br>
<button class="btn">获取所有信息列表</button>
<!--中间-->
<div class="main">

</div>
<br>
<div class="tab">
    <table>
        <caption>信息列表</caption>
        <thead>
        <tr>
            <th>序号</th>
            <th>名称</th>
            <th>详情</th>
        </tr>
        </thead>
        <tbody>

        </tbody>
    </table>
    <ul class="ulpage">

    </ul>
</div>

<!-- 底部 -->
<div class="footer">
    <div class="content">
        <p>
            <a href="">©版权所有</a>
        </p>
    </div>
</div>

<script>
    var btn1=document.getElementsByClassName('btn')[0];
    var btn2=document.getElementsByClassName('btn')[1];
    var tab=document.getElementsByClassName('tab')[0];
    // 获取表格显示区
    var tbody=document.getElementsByTagName('tbody')[0];

    // 获取页码显示区
    var ul=document.getElementsByClassName('ulpage')[0];

    //获取总页数
    var pages='';
    //当前页码
    var p=1;
    p=parseInt(p);

    // 创建 Ajax对象
    var request=new XMLHttpRequest();
    btn1.addEventListener('click',getNav,false);
    btn2.addEventListener('click',show,false);

    function show() {
        tab.style.display='block';
        showData(p);
    }

    function showData(page){
        request.addEventListener('readystatechange',getData,false);
        request.open('GET','get_detail.php?p='+page,true);
        request.send(null);
    }
    function getData() {
        if(request.readyState===4){
            var obj=JSON.parse(request.responseText);
            // console.log(obj);
            pages=obj['pages'];
            var details=obj['details'];

            // 生成表格数据
            var str="";
            details.forEach(function (detail) {
                str+='<tr>';
                str+='<td>'+detail['detail_id']+'</td>';
                str+='<td>'+detail['name']+'</td>';
                str+='<td>'+detail.detail+'</td>';
                str+='</tr>';
            });

            tbody.innerHTML=str;

            //判断分页控件有没有出现,防止重复出现
            if(ul.children.length=='0'){
                createPage();
            }else{
                for(var i=1;i<=pages;i++){
                    // 设置当前页码是否高亮?
                    if(p==i){
                        ul.children[i].classList.add('active');
                    }else{
                        ul.children[i].classList.remove('active');
                    }
                }
            }
        }
    }
    
    function createPage() {
        ul.innerHTML+="<li id='prev'>«</li>";
        for(var i=1;i<=pages;i++){
            var active=(i==1)?'active':'';
            ul.innerHTML+='<li class="'+active+'">'+i+'</li>';
        }
        ul.innerHTML+="<li id='next'>»</li>";
    }

    // 给页码添加点击事件
    ul.addEventListener('click',set_page,false);

    function set_page(ev) {
        if(ev.target.id==='prev'&&p>1){
            p--;
        }
        if(ev.target.id==='next'&&p<pages){
            p++;
        }
        if(ev.target.id===''){
            p=parseInt(ev.target.innerText);
        }

        showData(p);
    }

    
    function getNav(ev) {

        request.addEventListener('readystatechange',callback,false);
        request.open('GET','get_nav.php',true);
        request.send(null);

        // 从当前按钮上移除点击事件, 防止重复点击
        ev.target.removeEventListener('click',getNav,false);
    }


    function callback() {
        if(request.readyState===4){
           var data=JSON.parse(request.responseText);
            // console.log(data);
            var div=document.getElementsByClassName('main')[0];
            data.forEach(function (index) {
                var str='';
                var main1=document.createElement('div');
                main1.classList.add('main-1');
                str+='<img src="../static/images/'+index['image']+'" alt="" width="200" >';
                str+='<h4><a href="">'+index['alias']+'</a></h4><hr align="left">';
                main1.innerHTML=str;
                div.appendChild(main1);
            });
        }
    }



</script>

</body>
</html>

运行实例 »

点击 "运行实例" 按钮查看在线实例

2、获取栏目代码:get_nav.php

实例

<?php
require __DIR__.'/db/connect.php';

$sql='select * from `nav`';
$stmt=$pdo->prepare($sql);
$stmt->execute();
$result=$stmt->fetchAll(PDO::FETCH_ASSOC);

//echo '<pre>'.print_r($result,true);
echo json_encode($result);

运行实例 »

点击 "运行实例" 按钮查看在线实例

3、获取刚刚栏目的详细信息并获取分页数据代码:get_detail.php

实例

<?php
require __DIR__.'/db/connect.php';

$page=intval(isset($_GET['p'])?$_GET['p']:1);

// 每页显示数量
$num=2;

// 总页数: 需要分二步, 第一求出总记录数量, 第二总记录数量除以每页显示的记录数量,再向上取整
$sql="select ceil(count(`detail_id`)/{$num}) from `details`";
$stmt=$pdo->prepare($sql);
$stmt->execute();
$pages=$stmt->fetchColumn(0);//fetchColumn — 从结果集中的下一行返回单独的一列

// 每页的显示起止位置: 偏移量
// 偏移量 = 当前显示数量 * (当前页码 - 1)
$offset=$num*($page-1);

// left(str, length):从左开始截取字符串
//CONCAT()函数用于将多个字符串连接成一个字符串
$sql="select `detail_id`,`name`,concat(left(`detail`,30),'...') as `detail` from `details` limit {$num} offset {$offset}";
$stmt=$pdo->prepare($sql);
$stmt->execute();
$details=$stmt->fetchAll(PDO::FETCH_ASSOC);

echo json_encode(['pages'=>$pages,'details'=>$details]);

运行实例 »

点击 "运行实例" 按钮查看在线实例

运行结果:

获取栏目:

1.png

获取栏目详细信息列表:

2.png


整体页面:

3.png


总结:

通过对老师的代码进行整改,分页功能整改地方:

首页使用HTML文件,初始化当前页码p值为1,通过点击分页按钮实现p值的改变。

修改使用“location.search = '?p=' +p;”方法。通过重新加载showData(p)函数,传递p值,进行ajax数据获取和改变,这样就不会出现当点击分页按钮时,出现URL变化导致页面重新加载的情况。

因为不改变URL,重新加载showData(p)函数,就会重新进行ajax请求,获取新的请求数据,如果按照老师的代码,就会导致因为重复进行ajax请求,导致重复出现分页列表,所以要就是否已经出现分页列表进行判断,当ul没有子元素时,在生成分页列表,如果存在,则不生成。同时也需要重新修改分页页码高亢的代码。


声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议