0

0

基于 CodeIgniter 和 AJAX 实现动态下拉菜单筛选表格数据

DDD

DDD

发布时间:2025-09-02 18:22:00

|

652人浏览过

|

来源于php中文网

原创

基于 CodeIgniter 和 AJAX 实现动态下拉菜单筛选表格数据

本教程详细介绍了如何在 CodeIgniter 框架中,利用 jQuery 和 AJAX 技术实现表格数据的实时过滤功能。通过监听下拉菜单的change事件,前端异步请求后端接口,后端根据筛选条件从数据库获取数据并返回 JSON,最终前端动态更新表格内容,无需页面刷新,从而提升用户体验。

1. 概述与核心原理

在传统的 web 应用中,当用户需要根据某个条件筛选数据时,通常会通过提交表单来刷新整个页面。然而,这种方式会导致用户体验不佳。通过引入 ajax(asynchronous javascript and xml)技术,我们可以在不刷新页面的情况下,与服务器进行数据交互,实现数据的实时更新。

本教程将结合 CodeIgniter 的 MVC 架构和 jQuery 库,实现以下流程:

  1. 前端 (View):用户在下拉菜单中选择一个选项。
  2. JavaScript (jQuery):捕获下拉菜单的change事件,获取选中的值,并构建一个 AJAX 请求发送给后端。
  3. 后端路由 (Routes):将 AJAX 请求的 URL 映射到 CodeIgniter 控制器的一个特定方法。
  4. 后端控制器 (Controller):接收前端发送的筛选参数,调用模型层方法查询数据库。
  5. 后端模型 (Model):根据筛选参数执行数据库查询,并返回过滤后的数据。
  6. 后端控制器 (Controller):将查询结果封装成 JSON 格式,发送回前端。
  7. 前端 (JavaScript):接收到 JSON 数据后,解析数据并动态更新页面上的表格内容。

2. 前端视图 (View) 设计

首先,我们需要在视图文件中准备好表格结构和下拉菜单。为了方便 JavaScript 操作,请为下拉菜单和表格的 zuojiankuohaophpcntbody> 元素添加唯一的 id 属性。同时,引入 jQuery 库。

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>动态数据筛选</title>
    <!-- 引入 jQuery 库 -->
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
    <style>
        table {
            width: 100%;
            border-collapse: collapse;
            margin-top: 20px;
        }
        th, td {
            border: 1px solid #ddd;
            padding: 8px;
            text-align: left;
        }
        th {
            background-color: #f2f2f2;
        }
        select {
            padding: 5px;
            margin-bottom: 10px;
        }
    </style>
</head>
<body>

    <h1>数据实时筛选示例</h1>

    <!-- 筛选下拉菜单 -->
    <div class="filter-controls">
        <label for="sourceFilter">按来源筛选:</label>
        <select id="sourceFilter">
            <option value="">所有来源</option>
            <?php if (isset($sources) && $sources): ?>
                <?php foreach ($sources as $source): ?>
                    <option value="<?php echo htmlspecialchars($source['title']); ?>">
                        <?php echo htmlspecialchars($source['title']); ?>
                    </option>
                <?php endforeach; ?>
            <?php endif; ?>
        </select>
        <!-- 如果有多个筛选条件,可以添加更多下拉菜单,并赋予不同的ID -->
        <!-- <label for="categoryFilter">按分类筛选:</label>
        <select id="categoryFilter">
            <option value="">所有分类</option>
            ...
        </select> -->
    </div>

    <!-- 数据表格 -->
    <table id="recordsTable">
        <thead>
            <tr>
                <th width="10%">来源</th>
                <!-- 根据实际数据添加更多表头 -->
                <!-- <th>其他字段</th> -->
            </tr>
        </thead>
        <tbody id="recordsTableBody">
            <?php
            // 初始加载的数据
            if (isset($records) && count($records) > 0) {
                foreach ($records as $row) {
            ?>
                <tr>
                    <td><?= htmlspecialchars($row->source); ?></td>
                    <!-- <td><?= htmlspecialchars($row->other_field); ?></td> -->
                </tr>
            <?php
                }
            } else {
                echo '<tr><td colspan="1">暂无数据</td></tr>'; // 初始无数据时的提示
            }
            ?>
        </tbody>
    </table>

    <!-- JavaScript 逻辑 -->
    <script>
        $(document).ready(function() {
            // 监听下拉菜单的 change 事件
            $('#sourceFilter').on('change', function() {
                var selectedSource = $(this).val(); // 获取当前选中的值

                // 如果有多个筛选条件,可以这样收集所有值
                // var filters = {
                //     source: $('#sourceFilter').val(),
                //     category: $('#categoryFilter').val() // 假设有另一个ID为 categoryFilter 的下拉菜单
                // };

                // 发送 AJAX 请求
                $.ajax({
                    url: '<?php echo base_url('ajax_dropdown'); ?>', // CodeIgniter 的 base_url 辅助函数
                    type: 'GET',
                    data: {
                        source: selectedSource // 将筛选值作为 GET 参数发送
                        // 如果有多个筛选条件,可以发送 filters 对象
                        // data: filters
                    },
                    dataType: 'json', // 期望服务器返回 JSON 格式的数据
                    beforeSend: function() {
                        // 请求发送前显示加载提示
                        $('#recordsTableBody').html('<tr><td colspan="1">加载中...</td></tr>');
                    },
                    success: function(response) {
                        // AJAX 请求成功后处理数据
                        var records = response;
                        var html = '';

                        if (records && records.length > 0) {
                            // 遍历数据并构建表格行
                            $.each(records, function(index, record) {
                                html += '<tr>';
                                html += '<td>' + htmlspecialchars(record.source) + '</td>';
                                // 根据实际数据添加更多列
                                // html += '<td>' + htmlspecialchars(record.other_field) + '</td>';
                                html += '</tr>';
                            });
                        } else {
                            html = '<tr><td colspan="1">暂无数据</td></tr>';
                        }
                        // 更新表格的 tbody 内容
                        $('#recordsTableBody').html(html);
                    },
                    error: function(xhr, status, error) {
                        // AJAX 请求失败时处理错误
                        console.error("AJAX Error: ", status, error);
                        $('#recordsTableBody').html('<tr><td colspan="1">数据加载失败,请重试。</td></tr>');
                    }
                });
            });

            // JavaScript 辅助函数,用于 HTML 转义,防止 XSS
            function htmlspecialchars(str) {
                if (typeof str !== 'string') {
                    return str; // 如果不是字符串,直接返回
                }
                var map = {
                    "&": "&",
                    "<": "<",
                    ">": ">",
                    "\"": """,
                    "'": "&#039;"
                };
                return str.replace(/[&<>"']/g, function(m) { return map[m]; });
            }
        });
    </script>

</body>
</html>

关键点:

  • id="sourceFilter":用于 jQuery 选中下拉菜单。
  • id="recordsTableBody":用于 jQuery 动态更新表格内容。
  • base_url('ajax_dropdown'):确保 AJAX 请求的 URL 正确指向 CodeIgniter 的根路径。
  • dataType: 'json':明确告知 jQuery 期望服务器返回 JSON 格式的数据。
  • htmlspecialchars:在将数据插入 HTML 前进行转义,防止 XSS 攻击。
  • 多下拉菜单处理:如果存在多个筛选下拉菜单,可以在 data 对象中传递所有筛选器的值,并在后端同时处理。例如 data: { source: selectedSource, category: selectedCategory }。

3. 后端路由 (Routes) 配置

在 CodeIgniter 的 application/config/routes.php 文件中,添加一条路由规则,将前端 AJAX 请求的 URL 映射到控制器的方法。

<?php
defined('BASEPATH') OR exit('No direct script access allowed');

/*
| -------------------------------------------------------------------------
| URI ROUTING
| -------------------------------------------------------------------------
| This file lets you re-map URI requests to specific controller functions.
|
*/

// ... 其他路由规则 ...

// 为 AJAX 请求定义路由
$route['ajax_dropdown'] = 'your_controller/ajax_dropdown';

说明:

Insou AI
Insou AI

Insou AI 是一款强大的人工智能助手,旨在帮助你轻松创建引人入胜的内容和令人印象深刻的演示。

下载
  • ajax_dropdown 是前端 AJAX 请求的 URL 片段。
  • your_controller/ajax_dropdown 指向 application/controllers/Your_controller.php 文件中的 ajax_dropdown 方法。请根据你的实际控制器名称进行替换。

4. 后端控制器 (Controller) 逻辑

创建一个控制器文件(例如 application/controllers/Your_controller.php),并在其中实现 ajax_dropdown 方法,用于接收前端请求、调用模型、并返回 JSON 数据。

<?php
defined('BASEPATH') OR exit('No direct script access allowed');

class Your_controller extends CI_Controller {

    public function __construct() {
        parent::__construct();
        // 载入模型,用于数据库操作
        $this->load->model('your_model'); // 替换为你的模型名称
    }

    // 默认方法,用于加载初始视图和数据
    public function index() {
        // 假设这里获取初始的下拉菜单数据和表格数据
        $data['sources'] = $this->your_model->get_all_sources();
        $data['records'] = $this->your_model->get_all_records(); // 获取所有记录或默认记录
        $this->load->view('your_view', $data); // 替换为你的视图文件
    }

    // 处理 AJAX 请求的方法
    public function ajax_dropdown() {
        // 确保请求是 AJAX 请求 (可选,但推荐)
        if (!$this->input->is_ajax_request()) {
            show_404(); // 如果不是 AJAX 请求,返回 404
        }

        // 获取前端发送的筛选参数
        // $this->input->get() 方法用于获取 GET 请求参数
        // TRUE 参数用于开启 XSS 过滤,提高安全性
        $source_filter = $this->input->get('source', TRUE);

        // 如果有多个筛选条件,可以这样获取
        // $category_filter = $this->input->get('category', TRUE);
        // $filters = ['source' => $source_filter, 'category' => $category_filter];

        // 调用模型方法,根据筛选条件获取数据
        $filtered_data = $this->your_model->get_filtered_records($source_filter); // 将筛选参数传递给模型

        // 设置响应头为 JSON 格式
        $this->output
             ->set_content_type('application/json')
             ->set_output(json_encode($filtered_data)); // 将数据编码为 JSON 并输出
    }
}

关键点:

  • $this->load->model('your_model'):载入你的数据模型,以便进行数据库操作。
  • $this->input->get('source', TRUE):安全地获取名为 source 的 GET 参数。
  • $this->output->set_content_type('application/json')->set_output(json_encode($filtered_data)):这是 CodeIgniter 推荐的返回 JSON 数据的方式,它会自动设置正确的 HTTP Content-Type 头。

5. 后端模型 (Model) 逻辑

创建一个模型文件(例如 application/models/Your_model.php),用于封装所有的数据库操作。

<?php
defined('BASEPATH') OR exit('No direct script access allowed');

class Your_model extends CI_Model {

    public function __construct() {
        parent::__construct();
        $this->load->database(); // 载入数据库库
    }

    /**
     * 获取所有用于下拉菜单的来源数据
     * @return array
     */
    public function get_all_sources() {
        // 假设你的数据表中有一个 'title' 字段表示来源名称
        $this->db->select('DISTINCT(title) as title');
        $this->db->from('your_table_name'); // 替换为你的数据表名
        $query = $this->db->get();
        return $query->result_array(); // 返回数组,方便在视图中 foreach
    }

    /**
     * 获取所有记录 (用于初始加载)
     * @return array
     */
    public function get_all_records() {
        $query = $this->db->get('your_table_name'); // 替换为你的数据表名
        return $query->result(); // 返回对象数组
    }

    /**
     * 根据筛选条件获取记录
     * @param string|null $source_filter 来源筛选值
     * @return array
     */
    public function get_filtered_records($source_filter = null) {
        $this->db->select('source'); // 选择你需要展示的字段
        // 如果有其他字段,可以添加:$this->db->select('

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

457

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

549

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

337

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

82

2025.09.10

jquery插件有哪些
jquery插件有哪些

jquery插件有jQuery UI、jQuery Validate、jQuery DataTables、jQuery Slick、jQuery LazyLoad、jQuery Countdown、jQuery Lightbox、jQuery FullCalendar、jQuery Chosen和jQuery EasyUI等。本专题为大家提供jquery插件相关的文章、下载、课程内容,供大家免费下载体验。

156

2023.09.12

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

337

2023.10.13

jquery删除元素的方法
jquery删除元素的方法

jquery可以通过.remove() 方法、 .detach() 方法、.empty() 方法、.unwrap() 方法、.replaceWith() 方法、.html('') 方法和.hide() 方法来删除元素。更多关于jquery相关的问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

406

2023.11.10

jQuery hover()方法的使用
jQuery hover()方法的使用

hover()是jQuery中一个常用的方法,它用于绑定两个事件处理函数,这两个函数将在鼠标指针进入和离开匹配的元素时执行。想了解更多hover()的相关内容,可以阅读本专题下面的文章。

515

2023.12.04

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

49

2026.03.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 13.6万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 11.3万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 1.0万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号