批改状态:合格
老师批语:有错别字, 不过,写得不错
对之前项目进行整改,实现通过点击按钮,利用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]);点击 "运行实例" 按钮查看在线实例
运行结果:
获取栏目:

获取栏目详细信息列表:

整体页面:

总结:
通过对老师的代码进行整改,分页功能整改地方:
首页使用HTML文件,初始化当前页码p值为1,通过点击分页按钮实现p值的改变。
修改使用“location.search = '?p=' +p;”方法。通过重新加载showData(p)函数,传递p值,进行ajax数据获取和改变,这样就不会出现当点击分页按钮时,出现URL变化导致页面重新加载的情况。
因为不改变URL,重新加载showData(p)函数,就会重新进行ajax请求,获取新的请求数据,如果按照老师的代码,就会导致因为重复进行ajax请求,导致重复出现分页列表,所以要就是否已经出现分页列表进行判断,当ul没有子元素时,在生成分页列表,如果存在,则不生成。同时也需要重新修改分页页码高亢的代码。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号