讲师中心 微信公众号
AI工具推荐 视频效率加速

使用JavaScript实现表格数据实时搜索过滤功能

胖伟姑娘_9618

胖伟姑娘_9618

发布时间:2025-11-09 09:33:11

|

420人浏览过

|

来源于php中文网

原创

使用javascript实现表格数据实时搜索过滤功能

本教程详细介绍了如何利用JavaScript为HTML表格实现实时搜索过滤功能。我们将从构建基础的HTML结构和数据展示开始,逐步讲解两种JavaScript实现方案:传统的`onkeyup`事件处理和现代化的`input`事件结合DOM操作优化。通过实例代码和注意事项,帮助读者掌握无需点击“Enter”键即可动态筛选表格数据的方法,从而提升用户体验。

1. 理解实时搜索的需求与优势

在现代Web应用中,用户期望能够快速、直观地与数据进行交互。当表格数据量较大时,提供一个实时搜索框,允许用户在输入过程中即时看到筛选结果,而非等待按下“Enter”键或点击搜索按钮,能显著提升用户体验。这种“即输即搜”的模式减少了用户的操作步骤,提高了信息获取效率。

本教程将以从后端(例如通过PHP从JSON API)获取数据并展示在HTML表格中为例,重点讲解如何使用纯JavaScript在客户端实现这一实时过滤功能。

2. 构建基础HTML结构与数据展示

首先,我们需要一个HTML页面来承载搜索输入框和数据表格。表格的数据可以预先通过服务器端语言(如PHP)从JSON源加载并渲染到页面上。

立即学习“Java免费学习笔记(深入)”;

2.1 HTML结构

我们将创建一个文本输入框作为搜索入口,并一个<table>元素来显示数据。为了便于JavaScript操作,它们都需要唯一的id属性。

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>实时表格搜索过滤</title>
    <link rel="stylesheet" href="style.css"> <!-- 引入样式文件 -->
</head>
<body>

    <input type="text" id="myInput" placeholder="在此搜索..." title="输入关键词进行搜索" autocomplete="off">

    <table id="myTable">
        <thead>
            <tr class="header">
                <th>Id</th>
                <th>Bin</th>
                <th>Tür</th>
                <th>Banka Adı</th>
                <th>Type</th>
                <th>Name</th>
                <th>Oluşturma Tarihi</th>
                <th>Güncelleme Tarihi</th>
            </tr>
        </thead>
        <tbody>
            <!-- 表格数据将由PHP或其他后端语言填充 -->
            <!-- 示例数据: -->
            <tr>
                <td>1</td>
                <td>123456</td>
                <td>信用卡</td>
                <td>示例银行A</td>
                <td>Credit</td>
                <td>张三丰</td>
                <td>2023-01-01</td>
                <td>2023-01-02</td>
            </tr>
            <tr>
                <td>2</td>
                <td>789012</td>
                <td>借记卡</td>
                <td>示例银行B</td>
                <td>Debit</td>
                <td>李四光</td>
                <td>2023-01-03</td>
                <td>2023-01-04</td>
            </tr>
            <tr>
                <td>3</td>
                <td>345678</td>
                <td>预付卡</td>
                <td>示例银行C</td>
                <td>Prepaid</td>
                <td>王五</td>
                <td>2023-01-05</td>
                <td>2023-01-06</td>
            </tr>
            <tr>
                <td>4</td>
                <td>901234</td>
                <td>信用卡</td>
                <td>示例银行A</td>
                <td>Credit</td>
                <td>赵六</td>
                <td>2023-01-07</td>
                <td>2023-01-08</td>
            </tr>
        </tbody>
    </table>

    <script src="script.js"></script> <!-- 引入JavaScript文件 -->
</body>
</html>

说明:

  • id="myInput":搜索输入框的唯一标识。
  • id="myTable":数据表格的唯一标识。
  • autocomplete="off":建议关闭浏览器的自动完成功能,以避免干扰搜索体验。
  • 表格中包含了<thead>和<tbody>,这是良好的语义化实践,也方便JavaScript进行DOM操作。

2.2 数据填充(PHP示例)

虽然JavaScript负责过滤,但表格数据通常来自后端。以下是一个简化的PHP代码片段,展示如何从JSON URL获取数据并填充到<tbody>中。

<?php
// 假设这是在你的HTML文件中的某个位置,用于生成<tbody>内容
// $json_url = "https://api.example.com/data"; // 替换为你的实际API地址
// $json = file_get_contents($json_url);
// $data = json_decode($json, TRUE);

// 模拟数据,实际应用中替换为从API获取
$data = [
    ["id" => 1, "bin" => "123456", "tur" => "信用卡", "banka_adi" => "示例银行A", "type" => "Credit", "name" => "张三丰", "created_at" => "2023-01-01", "updated_at" => "2023-01-02"],
    ["id" => 2, "bin" => "789012", "tur" => "借记卡", "banka_adi" => "示例银行B", "type" => "Debit", "name" => "李四光", "created_at" => "2023-01-03", "updated_at" => "2023-01-04"],
    ["id" => 3, "bin" => "345678", "tur" => "预付卡", "banka_adi" => "示例银行C", "type" => "Prepaid", "name" => "王五", "created_at" => "2023-01-05", "updated_at" => "2023-01-06"],
    ["id" => 4, "bin" => "901234", "tur" => "信用卡", "banka_adi" => "示例银行A", "type" => "Credit", "name" => "赵六", "created_at" => "2023-01-07", "updated_at" => "2023-01-08"]
];

echo "<tbody>";
foreach($data as $record) {
    echo "<tr>";
    echo "<td>" . htmlspecialchars($record["id"]) . "</td>";
    echo "<td>" . htmlspecialchars($record["bin"]) . "</td>";
    echo "<td>" . htmlspecialchars($record["tur"]) . "</td>";
    echo "<td>" . htmlspecialchars($record["banka_adi"]) . "</td>";
    echo "<td>" . htmlspecialchars($record["type"]) . "</td>";
    echo "<td>" . htmlspecialchars($record["name"]) . "</td>";
    echo "<td>" . htmlspecialchars($record["created_at"]) . "</td>";
    echo "<td>" . htmlspecialchars($record["updated_at"]) . "</td>";
    echo "</tr>";
}
echo "</tbody>";
?>

注意: PHP代码应在服务器端执行,并将生成的HTML直接输出到浏览器。在实际应用中,您会将其嵌入到您的HTML文件中,或者通过模板引擎来渲染。

3. 核心逻辑:JavaScript实现实时过滤

接下来是实现实时过滤的关键部分。我们将探讨两种JavaScript实现方式:一种是基于传统的onkeyup事件,另一种是更现代、更优化的input事件监听。

3.1 方案一:使用onkeyup事件(传统方式)

这种方法通过监听用户在搜索框中每次按键抬起(onkeyup)时触发一个函数来执行过滤逻辑。

在HTML中,将onkeyup="myFunction()"添加到input标签:

<input type="text" id="myInput" onkeyup="myFunction()" placeholder="在此搜索..." title="输入关键词进行搜索" autocomplete="off">

在script.js文件中,定义myFunction:

// script.js
function myFunction() {
  var input, filter, table, tr, td, i, txtValue;

  // 获取搜索框和其值
  input = document.getElementById("myInput");
  filter = input.value.toUpperCase(); // 将搜索关键词转为大写,进行不区分大小写的匹配

  // 获取表格和所有行
  table = document.getElementById("myTable");
  tr = table.getElementsByTagName("tr"); // 获取所有行,包括表头

  console.log("当前过滤关键词:", filter); // 调试输出

  // 遍历表格的所有行
  // 注意:通常我们希望跳过表头行(thead),从tbody开始遍历
  // 如果你的tr包含了thead的行,需要额外处理,或者直接获取tbody内的tr
  for (i = 0; i < tr.length; i++) {
    // 假设我们要搜索的是表格的第6列(索引为5,从0开始计数)
    // 对应HTML中的 'Name' 列
    td = tr[i].getElementsByTagName("td")[5]; 

    // 确保当前行有td元素且是数据行(非表头)
    // 简单判断:如果td存在,且不是表头行(即td而不是th)
    if (td && tr[i].getElementsByTagName("th").length === 0) { 
      txtValue = td.textContent || td.innerText; // 获取单元格文本内容

      // 如果单元格内容包含过滤关键词,则显示该行,否则隐藏
      if (txtValue.toUpperCase().indexOf(filter) > -1) {
        tr[i].style.display = ""; // 显示行
      } else {
        tr[i].style.display = "none"; // 隐藏行
      }
    }
  }
}

注意事项:

  • ID大小写: 确保JavaScript中document.getElementById()使用的ID与HTML中定义的ID完全匹配(包括大小写)。
  • 表头处理: 原始代码中的tr = table.getElementsByTagName("tr")会获取包括<thead>中的行。在遍历时,需要确保只处理<tbody>中的数据行。上述代码通过tr[i].getElementsByTagName("th").length === 0进行了简单判断。更健壮的做法是直接获取tbody元素,然后遍历其子行。
  • 隐藏字符: 确保JavaScript代码中没有隐藏的Unicode字符(如零宽度空格),这可能导致脚本解析错误。

3.2 方案二:使用input事件(现代化与优化)

input事件在input、textarea或contenteditable元素的值发生任何变化时都会触发,包括键盘输入、粘贴、剪切、拖放等,比keyup更全面。同时,我们可以利用更现代的DOM操作方法来简化代码。

在HTML中,移除onkeyup属性:

<input type="text" id="myInput" placeholder="在此搜索..." title="输入关键词进行搜索" autocomplete="off">

在script.js文件中,使用addEventListener来监听input事件:

// script.js
window.addEventListener("load", () => { // 确保DOM完全加载后再执行
  const searchInput = document.getElementById("myInput");
  const tableBodyRows = document.querySelectorAll("#myTable tbody tr"); // 直接获取tbody内的所有行

  searchInput.addEventListener("input", (e) => {
    const filter = e.target.value.toUpperCase(); // 获取并转换为大写

    tableBodyRows.forEach(row => {
      // 假设我们要搜索的是表格的第6列(索引为5,从0开始计数)
      const targetCell = row.cells[5]; // 使用row.cells访问td元素集合

      if (targetCell) {
        const txtValue = targetCell.textContent || targetCell.innerText;
        // 如果filter不为空,并且当前单元格内容不包含filter,则隐藏该行
        // 否则,显示该行
        row.hidden = filter && !txtValue.toUpperCase().includes(filter);
      }
    });
  });
});

优点:

  • 更全面的事件触发: input事件覆盖了所有导致输入框值变化的场景。
  • 代码简洁: 利用querySelectorAll和forEach简化了循环和DOM选择。
  • row.hidden属性: 直接设置row.hidden = true或false比操作style.display更语义化和简洁。
  • 性能: querySelectorAll("#myTable tbody tr")直接获取tbody内的行,避免了对thead的额外判断。

4. CSS样式

为了让搜索框和表格看起来更专业,我们可以添加一些CSS样式。

在style.css文件中:

/* style.css */
* {
  box-sizing: border-box;
}

body {
  font-family: Arial, sans-serif;
  padding: 20px;
}

#myInput {
  background-image: url('/css/searchicon.png'); /* 假设有一个搜索图标 */
  background-position: 10px 10px;
  background-repeat: no-repeat;
  width: 100%;
  font-size: 16px;
  padding: 12px 20px 12px 40px; /* 左侧留出空间放置图标 */
  border: 1px solid #ddd;
  margin-bottom: 12px;
  border-radius: 4px;
}

#myTable {
  border-collapse: collapse; /* 合并边框 */
  width: 100%;
  border: 1px solid #ddd;
  font-size: 18px;
}

#myTable th,
#myTable td {
  text-align: left;
  padding: 12px;
}

#myTable tr {
  border-bottom: 1px solid #ddd; /* 行之间有分隔线 */
}

#myTable thead tr.header {
  background-color: #f2f2f2;
  color: #333;
}

#myTable tbody tr:hover {
  background-color: #f1f1f1; /* 鼠标悬停时改变背景色 */
}

5. 注意事项与总结

  • 目标列索引: 在JavaScript代码中,td = tr[i].getElementsByTagName("td")[5]; 或 row.cells[5]; 中的数字 5 代表您希望搜索的表格列的索引(从0开始)。请根据您的表格结构调整此值。
  • 性能优化: 对于包含成千上万行数据的巨型表格,直接的DOM操作可能会导致性能问题。在这种情况下,可以考虑以下优化:
    • 防抖 (Debouncing): 使用防抖函数限制input事件的触发频率,例如在用户停止输入500ms后才执行搜索。
    • 虚拟滚动 (Virtual Scrolling): 只渲染可见区域的行,大大减少DOM元素的数量。
    • 后端搜索: 对于数据量极大的情况,将搜索请求发送到后端处理通常是更优的选择。
  • 可访问性: 确保搜索输入框有合适的placeholder和title属性,提升用户体验。
  • 错误处理: 在实际项目中,考虑添加对getElementById或querySelectorAll可能返回null或空列表的检查。

通过本教程,您应该已经掌握了使用JavaScript实现表格数据实时搜索过滤功能的核心技术。无论是采用传统的onkeyup方法,还是更现代、简洁的input事件监听,关键在于理解DOM操作和字符串匹配逻辑。选择适合您项目需求和团队规范的方案,即可为您的Web应用带来更流畅、高效的用户体验。

热门AI工具

更多
WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

相关专题

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

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

2095

2023.08.07

json是什么
json是什么

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

3142

2023.08.23

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

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

1056

2023.10.13

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

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

3579

2025.09.10

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

549

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

1678

2024.03.01

php中foreach用法
php中foreach用法

本专题整合了php中foreach用法的相关介绍,阅读专题下面的文章了解更多详细教程。

758

2025.12.04

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

1698

2023.08.03

Linux 新手先学哪些命令
Linux 新手先学哪些命令

Linux新手命令专题汇集终端基础、文件目录操作、文本查看、软件安装和权限管理等入门文章,帮助按实际任务练习常用命令并建立命令行操作习惯。

0

2026.10.15

热门下载

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

精品课程

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

共14课时 | 1.5万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 5.9万人学习

CSS教程
CSS教程

共754课时 | 97.3万人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn