如何在页面加载时从表中加载一定数量的行,并且仅在用户加载更多行时加载它们?

2023-12-23

我有一个使用 DataTables 的表,它包含大量行,因此这会导致页面加载非常缓慢,因为我假设浏览器会等到表格填满后再显示页面。

我只想加载表格的一页(10 行),并且仅在用户浏览表格时显示更多数据,显示加载标志也很棒。

我研究并听说过一个名为“deferRender”的 DataTables 函数,它应该可以满足我的需要,但我无法让它与我的表一起使用。

我的表有 8 列 + html 是使用 PHP 生成的,PHP 根据文本文件中的数据构建表:

<?php


     $tdcount = 1; $numtd = 8; // number of cells per row
     $str = "<table id=\"table1\" class=\"table1 table table-striped table-bordered\">
                                     <thead>
                                     <th>1</th>
                                     <th>2</th>
                                     <th>3</th>
                                     <th>4</th>
                                     <th>5</th>
                                     <th>6</th>
                                     <th>7</th>
                                     <th>8</th>
                 </thead>
                                     <tbody>

 ";
     $f = fopen("tabledata.txt", "r");
     if ( $f === FALSE ) {
 exit;
    }
     while (!feof($f)) {
         $arrM = explode(",",fgets($f));
         $row = current ( $arrM );
         if ($tdcount == 1)
             $str .= "<tr>"; $str .= "<td>$row </td>";
         if ($tdcount == $numtd) {
             $str .= "</tr>";
             $tdcount = 1;
         } else {
             $tdcount++;
         }
     }
     if ($tdcount!= 1) {
         while ($tdcount <= $numtd) {
             $str .= "<td>&nbsp;</td>"; $tdcount++;
         } $str .= "</tr>";
     }
     $str .= "</tbody></table>";
     echo $str;

然后我使用以下代码将其转换为数据表:

<script>
        $(document).ready(function() {
        $('#table1').basictable({
          forceResponsive: false
          });
        $('#table1').DataTable( { "order": [[ 0, "desc" ]] } );

          });

</script>

我已阅读此处的说明:https://datatables.net/examples/server_side/defer_loading.html https://datatables.net/examples/server_side/defer_loading.html并且知道我需要向 JS 添加参数:

"processing": true,
"serverSide": true,
"ajax": "scripts/server_processing.php",
"deferLoading": 57

并使用 server_processing 脚本,但是该示例仅显示如何在连接到数据库时使用它,而不是在使用 php 从文本文件加载数据时使用它。

我怎样才能做到这一点?


这将纯粹关注“服务器端”解决方案的数据表方面。如何编写支持它所需的服务器端逻辑超出了本答案的范围。但我希望这些注释至少能够澄清该逻辑需要是什么,以及如何实现它。

假设

假设您有一个文本文件,其中包含 1,000 行这样的数据(或一百万行 - 但太多行,无法一次发送到浏览器和 DataTables)。该文本文件是一个简单的管道分隔文件,具有三个字段:

id|name|description
1|widget_1|This is a description for widget 1
2|widget_2|This is a description for widget 2
3|widget_3|This is a description for widget 3
...
1000|widget_1000|This is a description for widget 1000

您希望使用服务器端处理一次向 DataTables 发送 10 个项目。

您的数据映射到一个简单的 JSON 结构,如下所示 - 一组对象(每个对象是一个记录):

[
    {
        "id": 1,
        "name": "widget_1",
        "description": "This is a description for widget 1"
    },
    {
        "id": 2,
        "name": "widget_2",
        "description": "This is a description for widget 2"
    },
    ... // more records...
]

数据表定义

您的数据表定义如下所示 - 在此阶段,它故意非常简单:

<body>

<div style="margin: 20px;">

<table id="demo" class="display dataTable cell-border" style="width:100%">
</table>

</div>

<script type="text/javascript">

  $(document).ready(function() {
    $('#demo').DataTable({
      serverSide: true,
      ajax: {
        url: 'http://localhost:7000/data',
        type: 'POST'
      },
      columns: [
        { title: 'ID',
          data: 'id' },
        { title: 'Name',
          data: 'name' },
        { title: 'Description',
          data: 'description' }
      ]
    });

  });
</script>

</body>

初步反应

当网页首次显示时,它将向 URL (http://localhost:7000/数据 http://localhost:7000/data),并且它将期望从 Web 服务器接收 JSON 响应,其中包含要显示的数据。

因为 DataTables 正在使用serverSide: true,DataTables 期望 JSON 具有特定的结构,如所述here https://datatables.net/manual/server-side#Returned-data.

具体来说,服务器必须添加所有必填字段(draw, recordsTotal, recordsFiltered, and data) 到它发送到 DataTables 的 JSON。

在我们的例子中,它看起来像这样 - 请注意,它只是我们之前提到的 JSON 结构,添加了一些额外的元数据字段:

{
    "draw": 1,
    "recordsTotal": 1000,
    "recordsFiltered": 1000,
    "data": [{
        "id": 1,
        "name": "widget_1",
        "description": "This is a description for widget 1"
    }, {
        "id": 2,
        "name": "widget_2",
        "description": "This is a description for widget 2"
    }, {
        "id": 3,
        "name": "widget_3",
        "description": "This is a description for widget 3"
    }, {
        "id": 4,
        "name": "widget_4",
        "description": "This is a description for widget 4"
    }, {
        "id": 5,
        "name": "widget_5",
        "description": "This is a description for widget 5"
    }, {
        "id": 6,
        "name": "widget_6",
        "description": "This is a description for widget 6"
    }, {
        "id": 7,
        "name": "widget_7",
        "description": "This is a description for widget 7"
    }, {
        "id": 8,
        "name": "widget_8",
        "description": "This is a description for widget 8"
    }, {
        "id": 9,
        "name": "widget_9",
        "description": "This is a description for widget 9"
    }, {
        "id": 10,
        "name": "widget_10",
        "description": "This is a description for widget 10"
    }]
}

服务器负责构建此 JSON - 服务器数据集的前 10 条记录。服务器还告诉 DataTables 它总共有 1,000 条记录,并且它尚未过滤掉任何数据 - 因此过滤后总共也有 1,000 条记录。

DataTables 需要所有这些信息,因此它知道要显示多少个分页按钮以及要显示哪些分页数据。

请注意,完成所有这些工作完全是服务器的责任 - 这就是为什么它被称为“服务器端”处理。

客户端(浏览器)只有 10 条记录需要渲染 - 所以速度很快。

(我刚刚注意到屏幕截图提到“500 条记录”——这是我的服务器端代码中的一个错误——没有过滤器,所以我需要修复它)。

后续请求

当用户单击页面导航按钮(例如页面“4”)时,会触发从 DataTables 到服务器的新请求。 DataTables 使用描述的字段自动构建此请求here https://datatables.net/manual/server-side#Sent-parameters.

该请求作为表单数据发送。

在我们的示例中,请求如下所示:

"Form data": {
    "draw": "5",
    "columns[0][data]": "id",
    "columns[0][name]": "",
    "columns[0][searchable]": "true",
    "columns[0][orderable]": "true",
    "columns[0][search][value]": "",
    "columns[0][search][regex]": "false",
    "columns[1][data]": "name",
    "columns[1][name]": "",
    "columns[1][searchable]": "true",
    "columns[1][orderable]": "true",
    "columns[1][search][value]": "",
    "columns[1][search][regex]": "false",
    "columns[2][data]": "description",
    "columns[2][name]": "",
    "columns[2][searchable]": "true",
    "columns[2][orderable]": "true",
    "columns[2][search][value]": "",
    "columns[2][search][regex]": "false",
    "order[0][column]": "1",
    "order[0][dir]": "asc",
    "start": "30",
    "length": "10",
    "search[value]": "",
    "search[regex]": "false"
}

这些字段告诉服务器它需要知道的一切,以便它可以准备正确的响应。

在我们的例子中,最重要的字段是:

"start": "30",
"length": "10"

从第 30 行开始,提供 10 条记录。

同样,服务器有责任准备准确反映所请求数据的 JSON 响应。

在我们的例子中,这意味着服务器需要具有逻辑来读取文本文件到正确的起点(数据行 31 - 记住偏移量从零开始),总共 10 行(第 31 行到第 40 行)。

上述来自 DataTables 的请求中的其他字段描述了如何对数据进行排序和过滤。在我们的例子中没有过滤器"search[value]": "",- 数据将按第一列升序排序。

最后的注释

我故意不描述以下内容:

1) 服务器端代码如何处理发送回 DataTables 的 JSON 响应的创建;

2) 服务器端代码如何解析从 DataTables 收到的表单请求。

这完全取决于您的服务器端技术是什么。数据表不在乎。它只是传递 JSON 消息 - 它与服务器端实现分离 - 正如它应该的那样。

关于描述的“延迟渲染”选项here https://datatables.net/reference/option/deferRender,如果您觉得需要,您可以选择添加该增强功能。但我建议首先让一个更基本的服务器端实现工作起来。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在页面加载时从表中加载一定数量的行,并且仅在用户加载更多行时加载它们? 的相关文章

  • 需要 mysqli_fetch_all 的替代方案

    我有一个 php mysqli 代码 可以找到一个我的本地服务器 但是在我的服务器上使用它时 我得到了一个 Fatal error Call to undefined function mysqli fetch all in home3 t
  • 登录后所有页面都应该是https吗?

    这有点难以解释 但我会尽力 有一个网站 每个页面上都有登录表单 其中包含用户名 密码字段 这些页面未使用 SSL 用户填写用户名 密码并提交表单后 表单将被发送到 https 的身份验证页面 对于这种情况我有几个疑问 向 https 页面提
  • 疯狂的 crond 行为。不断使 bash 进程失效

    我有一个看起来像这样的 crontab SHELL bin bash PATH sbin bin usr sbin usr bin MAILTO root HOME 0 59 var www html private fivemin zda
  • AngularJS Youtube 播放器嵌入非常大的播放列表

    我目前正在构建一个 AngularJS 应用程序 我知道它有点过时 但我对它很有信心 我的应用程序需要嵌入一个 YouTube 播放器 其中包含一个非常大的播放列表 大约 1500 个项目 但我无法对其进行编码 以便它实际上可以嵌入超过 2
  • 使用 php 和 symfony 从数组创建 Excel 文件

    我正在尝试使用 PHP 和 symfony 将数组导出为 XLS 文件 如下面的代码所示 创建 XLS 文件后 我只能获取数组的最后一行 并且它显示在文件的第一行中 似乎 lignes 变量没有增加 我不明白出了什么问题 有人可以帮忙吗 f
  • 将 MathJax 脚本添加到 Office 365 Sharepoint 中的页面

    我正在尝试将 Mathjax 库添加到 SharePoint 库 以便我们可以使用 LaTex 语法来添加方程 我在网上搜索时看到了多种方法 但似乎没有一种方法可以与最新版本的 MathJax 和 Office 365 版本的 ShareP
  • JavaScript 匿名函数语法

    下面两个块有什么区别 block 1 console log anonymous block block 2 function anon console log anonymous block 2 我在 Netbeans 中运行了这个 使用
  • iOS 11 getUserMedia 不起作用?

    苹果公司发表声明称getUserMedia将在 iOS 11 上完全正常运行 安装 iOS 11 Beta 版本 5 后 我确实收到一条消息 表明我的网站请求访问我的相机和麦克风 但似乎是这样的 video src window URL c
  • php向多个收件人发送邮件

    我可以通过在邮件程序中定义 id 来将电子邮件发送到一个电子邮件 id 但是当用户在表单中键入 消息和电子邮件 id 时 我无法理解如何发送到多个收件人 例如 我正在显示一个带有两个文本区域的表单 一个用于电子邮件 ID 一个用于自定义消息
  • JavaScript 点击事件在 Android 4.0.4 默认浏览器上的 Samsung Galaxy SIII 上不起作用

    我在 Android 4 0 4 上使用 Samsung Galaxy SIII 的默认浏览器时遇到了最奇怪的问题 对于以下页面 单击链接将不会触发 JavaScript 处理程序 从其中一个 div 的内容中删除单个 a 字母使它们再次工
  • 使用带有箭头的 MaterializeCSS 轮播 - 如何使用普通 javascript 进行初始化

    我正在尝试使用 MaterializeCSS 创建带有箭头的轮播 我正在尝试使用这个代码笔 https codepen io Paco Cervantes pen ZLxKpj取得有限的成功 我想使用普通的 javascript 而不是 j
  • IE7 问题 - 当禁用文件下载自动提示时无法下载流式文件

    我的应用程序是基于 J2EE JSP Servlet 的 当我尝试从 JSP 打开新窗口 弹出窗口 并调用 Servlet 操作 例如 Streamer do 以在该弹出窗口内传输 PDF 文件时 我遇到了问题 问题 当 IE 7 gt 工
  • Chrome 上的 contenteditable 中未显示编辑光标

    当您打开此页面时 请参阅现场演示 http jsfiddle net gs3p1a6r 3 show 与 Chrome span span CSS myspan border 0 outline 0 JS myspan focus the
  • CSS交付优化:如何推迟CSS加载?

    我在尝试着优化 CSS 交付遵循针对开发人员的谷歌文档https developers google com speed docs insights OptimizeCSSDelivery example https developers
  • 哪个 PHP 5 版本最常用?

    当我开发将在不同配置的客户端 Web 服务 通常使用共享托管 上使用的应用程序时 我应该假设大多数 Web 服务器都具有哪个 PHP 5 版本 例如 5 2 x 5 3 x 等 在所有使用 PHP 版本 5 的网站中 有 84 9 使用版本
  • jQuery可排序发布数据,但没有数据

    谁能告诉我我在这里缺少什么 我的数据似乎总是空的 我做错了什么 document ready function nav sortable connectWith nav axis y update function event ui var
  • 如何在不刷新页面的情况下更新页面 html 和 url

    我想知道是否有人可以指出我学习如何在不刷新页面的情况下更新页面 html 和 url 的方向 是否有任何现有的 javascript 库可以处理这个问题 或者有一本涵盖此类事情的好书 这是使用该效果的示例网站 http onedesignc
  • 如何防止IE11弹出(您确定要离开此页面)

    我正在处理一个页面 除了一个下拉菜单可供选择外 我无需输入任何内容 但在 IE11 中 当我尝试转到下一页时 它会弹出该消息 我想阻止这种弹出的发生 所以我只是想知道 IE11 中弹出窗口的默认行为是什么 因为它不会出现在 Chrome 或
  • HTML:JavaScript:阻止表单提交并调用 Javascript 函数

    我想在按下表单中的提交按钮时进行 AJAX 调用 事实上我无法删除
  • PHP 中的 Zip 流

    我有一个 PHP 脚本 可以动态创建 zip 文件并强制浏览器下载该 zip 文件 问题是 我可以直接将zip文件写入连接到用户浏览器的输出流 而不是先将其保存为服务器上的真实文件 然后发送文件吗 提前致谢 如果您的 Web 服务器运行的是

随机推荐

  • 具有非常大的 HDF5 文件的 Tensorflow-IO 数据集输入管道

    我有非常大的训练 30Gb 文件 由于我的可用 RAM 无法容纳所有数据 因此我想批量读取数据 我看到有 Tensorflow io 包实施了一种方式 https www tensorflow org io api docs python
  • 为什么Java类应该实现comparable?

    为什么是JavaComparable用过的 为什么有人要实施Comparable在课堂上 您需要实施比较的现实生活示例是什么 这是一个现实生活中的例子 注意String还实现了Comparable class Author implemen
  • 链表中的递归

    我一直在练习链表并想在其上实现递归 尽管在某些情况下我能够有效地实现它 但在其他情况下我却惨败 我想知道一种进行递归的方法 以便不必使用 while 来遍历链接列表 我已经使用递归来遍历数组 但是当我想在这种情况下做类似的事情时它失败 我在
  • Svg矩阵分解

    在 svg 中我们有方法element getCTM 它返回一个SVGMatrix as a c e b d f 0 0 1 我想从这个矩阵计算 sx sy 和旋转角度 关于这个主题有很多东西需要阅读和学习 我将给出一个基本的答案 但请注意
  • D3 - 显示/隐藏仅单击节点的文本

    我试图在单击时显示 隐藏 D3 中节点的文本 我尝试使用以下代码 var node svg selectAll node data json nodes node on click function if textShowing node
  • 如何手动更改 8086 的标志(在汇编代码中)?

    有没有办法手动更改每个标志 或者您是否必须使用一个您知道会改变它们的结果的命令 基本上我正在使用命令RCL 而且我不想一开始就得到1 所以我想改变CF到 0 我知道我可以使用如下命令 mov al 0 shl al 1 但我想知道是否有其他
  • 美国和加拿大的颜色网格单元

    我想为美国和加拿大的网格单元格着色 我的目标与这个问题非常相似 R 在地图上绘制填充的经纬度网格单元 https stackoverflow com questions 11164974 r plot filled longitude la
  • 使用 bash 在目录树中按名称查找文件

    Using bash 如何在目录树中的某处找到具有特定名称的文件pwd 更清楚地说 我想找到位于工作目录根目录中的文件 但我不知道根目录在哪里 而且我的pwd可能在根以下的任何地方 Find file txt直到根 x pwd while
  • 当我尝试对列表进行排序时,出现错误“dict”对象没有属性

    我创建列表的代码是 choices for bet in Bet objects all Here is code that skip loop if bet choice exist in choices temp choice bet
  • Keras ValueError:输入 0 与层 conv2d_1 不兼容:预期 ndim=4,发现 ndim=5

    我已经检查了所有解决方案 但仍然面临同样的错误 我的训练图像形状是 26721 32 32 1 我相信它是 4 维 但我不知道为什么错误显示它是 5 维 model Sequential model add Convolution2D 16
  • FastAPI 作为 Windows 服务

    我正在尝试将 FastAPI 作为 Windows 服务运行 找不到任何文档或任何文章来将 Uvicorn 作为 Windows 服务运行 我也尝试使用 NSSM 但我的 Windows 服务停止了 我设法使用 NSSM 将 FastAPI
  • 如何检查浏览器是否打开

    如何检查浏览器是否打开 我知道我可以检查进程 但有时进程正在运行 但计算机上的浏览器仍在启动 我只需要 Chrome 和 Firefox 两种浏览器 下面的代码获取所有正在运行的进程的文件名 如果 firefox exe 存在于返回哈希集列
  • 分页库 - 无法停止加载项目

    我正在使用分页库直接从网络加载日期 我是否必须实现逻辑来停止获取数据 就我而言 这可能是当收到的项目计数低于页面大小时 目前 当我到达列表末尾时 库会不断加载新页面 理论上 PageKeyedDataSource有一个结果回调 PageKe
  • 在 PHP 中转换日期时“调用非对象上的成员函数 format()”

    我无法摆脱这个错误消息 调用非对象上的成员函数 format 所以 我继续谷歌搜索并找到一些好的来源 例如这个 StackOverflow 问题 https stackoverflow com questions 2167916 conve
  • 如何通过单个查询删除除主键之外的所有索引

    我计划删除除主键之外的所有索引 我自己制作了主键 但所有其他索引都是 SQL Server 的建议 删除所有非主键索引后 计划使用 SQL Server Profiler 调优模板作为数据库调优顾问并创建索引 通过这种方式 计划不要有未使用
  • 计算一个月中的天数

    有没有什么方法可以计算一个月的天数 Yes Const July As Integer 7 Const Feb As Integer 2 daysInJuly gets 31 Dim daysInJuly As Integer System
  • Swift 从 Firebase 数据库获取特定值

    我正在尝试从 Firebase 数据库获取特定值 我查阅了一些文档 比如Google的 但我无法做到 这是数据库的 JSON 文件 Kullan c ahmetozrahat25 E Mail email protected cdn cgi
  • jQuery 中的去抖动函数

    我正在尝试使用 Ben Alman 的 jquery debounce 库对按钮的输入进行去抖动 http benalman com code projects jquery throttle debounce examples debou
  • 如何使用 Sharepoint 服务器作为 Inno 安装文件的源?

    我正在使用 Inno Setup 进行应用程序设置 此应用程序中包含的许多数据文件都存储在 Microsoft Sharepoint 服务器上 当我尝试使用 Sharepoint 在 来源 中提供的路径时 Files Source http
  • 如何在页面加载时从表中加载一定数量的行,并且仅在用户加载更多行时加载它们?

    我有一个使用 DataTables 的表 它包含大量行 因此这会导致页面加载非常缓慢 因为我假设浏览器会等到表格填满后再显示页面 我只想加载表格的一页 10 行 并且仅在用户浏览表格时显示更多数据 显示加载标志也很棒 我研究并听说过一个名为