欢迎访问艾立兹站 Aliz- 专注建站教程与技术分享
您当前的位置:首页 > 建站教程 > 帝国 CMS 教程

帝国 CMS AJAX 无刷新多条件筛选完整版代码|无需刷新页面高级搜索

时间:2026-08-28 12:52:29  来源:aliz.cn  作者:SKY  阅读:

前言

普通的多条件搜索提交表单后页面会整页刷新,用户体验差。采用 AJAX 异步请求,点击筛选条件,只刷新列表内容,顶部筛选条件、侧边栏、导航保持不动,非常适合产品库、资源列表、房源、教程资源站。

实现思路:前端 jQuery 监听筛选表单,收集参数异步 POST 给后台处理接口,PHP 查询数据库返回 html 列表,JS 把结果渲染到页面容器。 适配版本:帝国 CMS7.5、8.0

⚠️安全前置提醒

  1. 所有 GET/POST 参数必须使用帝国自带过滤函数RepPostStr()(int)强制过滤,杜绝 SQL 注入。
  2. 新建的接口文件不要放在 data、class 目录,建议放在/e/ajax/
  3. 测试时先关闭缓存,调试完成再开启。

一、第一步:新建 AJAX 接口文件 ajax_list.php

新建目录 /e/ajax/,创建文件 /e/ajax/ajax_list.php

<?php
require('../../class/connect.php');
require('../../class/db_sql.php');
$link=db_connect();
$empire=new mysqlquery();

//接收筛选参数并且过滤
$classid=(int)$_POST['classid'];
$dz=RepPostStr($_POST['dz']);
$minprice=(int)$_POST['minprice'];
$maxprice=(int)$_POST['maxprice'];
$key=RepPostStr($_POST['key']);

//查询条件 1=1作为永真条件,方便后续拼接and
$where='1=1';

if(!empty($key)){
    $where.=" and title like '%$key%'";
}
if($classid>0){
    $where.=" and classid='$classid'";
}
if(!empty($dz)){
    $where.=" and dz='$dz'";
}
if($minprice>0){
    $where.=" and price >= '$minprice'";
}
if($maxprice>0){
    $where.=" and price <= '$maxprice'";
}

//主查询语句,news换成你自己的数据表模型后缀
$sql=$empire->query("select * from {$dbtbpre}ecms_news where $where order by newstime desc limit 30");

//循环输出列表HTML
if($empire->num($sql)==0){
    echo '<li>暂时没有找到符合条件的数据</li>';
}else{
    while($r=$empire->fetch($sql)){
        $titleurl=sys_ReturnBqTitleLink($r);
?>
<li>
    <a href="<?=$titleurl?>"><?=$r['title']?></a>
    <p>地区:<?=$r['dz']?> |价格:<?=$r['price']?></p>
</li>
<?php
    }
}

db_close();
$empire=null;
exit;
?>

二、第二步:前台页面完整模板代码(筛选表单 + 列表容器 + JS)

放到你的列表页模板、首页模板,jQuery 必须引入

<!--筛选表单区域-->
<div class="filter-box">
    <div>
        <label>关键词</label>
        <input type="text" id="key" placeholder="输入标题">
    </div>
    <div>
        <label>栏目</label>
        <select id="classid">
            <option value="0">全部栏目</option>
            <option value="12">建站教程</option>
            <option value="13">服务器运维</option>
        </select>
    </div>
    <div>
        <label>地区</label>
        <select id="dz">
            <option value="">不限地区</option>
            <option value="广东">广东</option>
            <option value="北京">北京</option>
        </select>
    </div>
    <div>
        <label>价格区间</label>
        <input type="number" id="minprice" placeholder="最低价">
        <input type="number" id="maxprice" placeholder="最高价">
    </div>
    <button id="searchBtn">筛选查询</button>
</div>

<!--列表渲染容器,AJAX加载结果放到这里-->
<ul id="list_result">
    <!--初始默认列表内容可放灵动标签输出-->
    [e:loop={'select * from phome_ecms_news order by newstime desc limit 30',30,0,0}]
    <li>
        <a href="<?=$bqr['titleurl']?>"><?=$bqr['title']?></a>
        <p>地区:<?=$bqr['dz']?>|价格:<?=$bqr['price']?></p>
    </li>
    [/e:loop]
</ul>

<!--引入jQuery库-->
<script src="https://cdn.jsdelivr.net/npm/jquery@3.7.1/dist/jquery.min.js"></script>
<script>
$(function(){
    $("#searchBtn").click(function(){
        //获取表单所有筛选值
        var key = $("#key").val();
        var classid = $("#classid").val();
        var dz = $("#dz").val();
        var minprice = $("#minprice").val();
        var maxprice = $("#maxprice").val();

        //加载提示文字
        $("#list_result").html("<li>数据加载中...</li>");

        //发起AJAX异步请求
        $.ajax({
            url:"/e/ajax/ajax_list.php",
            type:"POST",
            data:{
                key:key,
                classid:classid,
                dz:dz,
                minprice:minprice,
                maxprice:maxprice
            },
            success:function(res){
                //返回结果渲染到列表容器
                $("#list_result").html(res);
            },
            error:function(){
                $("#list_result").html("<li>请求出错,请重试</li>");
            }
        })
    })
})
</script>

三、进阶:选择框 change 自动触发筛选(无需点击按钮)

如果你想下拉框切换就立刻筛选,不用点查询按钮,把 JS 代码替换下面这段即可:

<script>
$(function(){
    //绑定所有筛选控件变更事件
    $("#classid,#dz,#minprice,#maxprice").on('change',function(){
        loadData();
    });
    //点击按钮查询
    $("#searchBtn").click(function(){
        loadData();
    });

    function loadData(){
        var key = $("#key").val();
        var classid = $("#classid").val();
        var dz = $("#dz").val();
        var minprice = $("#minprice").val();
        var maxprice = $("#maxprice").val();
        $("#list_result").html("<li>加载中...</li>");
        $.ajax({
            url:"/e/ajax/ajax_list.php",
            type:"POST",
            data:{
                key:key,
                classid:classid,
                dz:dz,
                minprice:minprice,
                maxprice:maxprice
            },
            success:function(res){
                $("#list_result").html(res);
            },
            error:function(){
                $("#list_result").html("<li>请求失败</li>");
            }
        })
    }
})
</script>

四、增加分页(AJAX 无刷新分页方案)

AJAX 分页不能使用帝国原生$searchpage,需要自制分页参数。 1、ajax_list.php 接收 page 参数

$page=(int)$_POST['page'];
$pagesize=30;
$offset=$page*$pagesize;
$sql=$empire->query("select * from {$dbtbpre}ecms_news where $where order by newstime desc limit $offset,$pagesize");

2、前端 JS 传递 page 页码参数,点击分页按钮调用加载函数,传入页码即可。

五、常见问题排查

  1. AJAX 请求 404:检查接口文件路径是否上传正确,访问地址 /e/ajax/ajax_list.php
  2. 查询不到数据:自定义字段后台模型中开启【可搜索字段】,数据表核对正确
  3. 筛选条件不生效:JS 有没有获取到表单的值,打印 console 日志调试
  4. 跨域报错:筛选页面和 ajax 接口必须在同一个域名下
  5. 缓存旧数据:接口文件顶部加入 header("Cache-Control: no‑cache");

六、可选优化方向

  • 加入加载动画 loading 效果
  • URL 地址栏同步筛选参数(浏览器前进后退可用)
  • checkbox 多选筛选,多个值逗号分割查询
  • 价格滑块拖拽筛选

本文配套模板、静态源码可前往艾立兹素材库alisucai.com下载

发表评论 共有0条评论
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表
公众号二维码

扫码关注公众号
获取全套技术教程