服务端处理

有些情况下,读取 DOM 数据可能会过慢或过于繁重,特别是在处理数千或数百万数据行时。为了解决这个问题,DataTables 的服务端处理功能提供了一种方法,可让数据库引擎在服务端执行所有“繁重工作”(毕竟,它们经过高度优化,专门用于此类使用场景!),然后再将该信息绘制到用户的网络浏览器中。因此,您可以轻松显示包含数百万行的数据表。

在使用服务端处理时,DataTables 会向服务端发送一个 Ajax 请求,用于页面上的每条信息绘制(即翻页、排序、搜索等)。DataTables 会向服务端发送许多变量,以便其执行所需的处理,然后以 DataTables 所需的格式返回数据。

通过使用 serverSide 选项启用服务端处理,并通过使用 ajax 进行配置。有关配置选项的更多信息,请参见下文。

发送的参数

在通过服务端处理向服务端发出请求时,DataTables 为了让服务端了解所需的数据,会发送以下数据

参数名称 类型 说明
draw 整数 绘制计数器。DataTables 使用此项来确保服务端处理请求返回的 Ajax 按 DataTables 顺序绘制(Ajax 请求是异步的,因此可能会乱序返回)。这用作 draw 返回参数的一部分(见下文)。
start 整数 分页第一条记录指示符。这是当前数据集中起始位置(从 0 开始的索引 - 即 0 是第一条记录)。
length 整数 当前绘制中表格可显示的记录数。预期返回的记录数将等于此数字,除非服务端要返回的记录数较少。请注意,此项可以是 -1,表示应返回所有记录(尽管这会否定服务端处理的所有优点!)
search[value] 字符串 全局搜索值。应用于 searchabletrue 的所有列。
search[regex] 布尔值 如果在高级搜索中全局筛选器应视为正则表达式,则为 true ,否则为 false 。请注意,出于性能原因,在大型数据集中,服务端处理脚本通常不会对正则表达式进行搜索,但从技术角度而言这是可能的,由您的脚本自行决定。
order[i][column] 整数 应应用排序的列。这是提交到服务端的 columns 信息数组的索引引用。
order[i][dir] 字符串 此列的排序方向。它将分别为 ascdesc 以表示升序或降序。
columns[i][data] 字符串 列的数据源,由 columns.data 定义。
columns[i][name] 字符串 列的名称,由 columns.name 定义。
columns[i][searchable] 布尔值 标志以指示此列是否可搜索(true)或否(false)。这由 columns.searchable 控制。
columns[i][orderable] 布尔值 标志以指示此列是否可排序(true)或否(false)。这由 columns.orderable 控制。
columns[i][search][value] 字符串 应用于此特定列的搜索值。
columns[i][search][regex] 布尔值 标志以指示针对此列的搜索词是否应视为正则表达式(true)或否(false)。与全局搜索一样,出于性能原因,通常服务器端处理脚本不会对大型数据集合执行正则表达式搜索,但从技术上讲,这是可行的,并且由您的脚本来决定。

发送到服务器的 order[i]columns[i] 参数是信息数组

  • order[i] - 是一个数组,用于定义正在对多少列进行排序 - 即,如果数组长度为 1,则执行单列排序,否则执行多列排序。
  • columns[i] - 一个数组,用于定义表中的所有列。

在这两种情况下,i 均为一个整数,会发生更改以指示数组值。在大多数现代服务器端脚本环境中,这些数据会自动以数组的形式提供给您。

返回数据

一旦 DataTables 使用上述发送到服务器的参数请求数据,它便会期望将 JSON 数据返回给它,并设置以下参数

参数名称 类型 说明
draw 整数 作为数据请求的一部分发送的 draw 参数中的此次对象的绘制计数器。请注意,出于安全原因,强烈建议您将此参数转换为整数,而不是简单地向客户端回显其在 draw 参数中发送的内容,以防止跨站脚本 (XSS) 攻击。
recordsTotal 整数 过滤前的数据记录总数(例如,数据库中的数据记录总数)
recordsFiltered 整数 过滤后的数据记录总数(例如,应用过滤后的数据记录总数 - 并非仅为此数据页面返回的数据记录数)。
data array 要在表中显示的数据。这是一个数据源对象数组,每个行一个,DataTables 将使用此数组。请注意,可以使用 ajax 选项的 dataSrc 属性来更改此参数的名称。
error 字符串 可选:如果在运行服务器端处理脚本期间出现错误,您可以通过使用此参数传递要显示的错误消息来通知用户此错误。如果没有错误,请不要包含。

除了控制整个表的上述参数外,DataTables 还可以对每个单独行的 data source 对象使用以下可选参数,以便为您执行自动操作

参数名称 类型 说明
DT_RowId 字符串 tr 节点的 ID 属性设置为该值
DT_RowClass 字符串 将该类添加到 tr 节点
DT_RowData 对象 使用 jQuery data() 方法将对象中包含的数据添加到行中以设置数据,该数据随后也可用于以后的检索(例如,针对单击事件)。
DT_RowAttr 对象 将对象中包含的数据作为属性添加到 tr 节点行中。对象键用作属性键,值用作对应的属性值。此操作使用 jQuery param() 方法执行。请注意,此选项需要 1.10.5 版或更高版本 的 DataTables。

以下“示例数据”部分展示了使用这些选项返回示例的外观。

配置

通过使用 serverSide 选项启用 DataTables 中的服务器端处理。只需将其设置为 true,DataTables 就会在服务器端处理模式下运行。您还需要使用 ajax 选项来指定 DataTables 应从中获取其 Ajax 数据的 URL。因此,最简单的服务器端处理初始化是

$('#example').DataTable( {
    serverSide: true,
    ajax: '/data-source'
} );

DataTables 如何发出 Ajax 请求的配置通过 ajax 选项进行配置。在上述示例中,我们将其用作字符串,指示 DataTables 使用其默认设置来发出 Ajax 请求。但是,您可以通过以下列方式传入 ajax 来自定义这些设置:

$('#example').DataTable( {
    serverSide: true,
    ajax: {
        url: '/data-source',
        type: 'POST'
    }
} );

有关 DataTables 中可用的 Ajax 选项的更多信息,请参考 ajax 文档。

传统

旧版本的 DataTables (1.9-) 使用了一组不同的参数来向服务器发送和从服务器接收数据。因此,为 DataTables 1.10+ 编写的脚本将无法在 DataTables 1.9- 中运行。但是,DataTables 1.10 确实具有针对为 1.9- 编写的脚本的兼容模式。此兼容模式通过使用旧的 sAjaxSource 参数(而不是新的 ajax 参数)或通过设置 $.fn.dataTable.ext.legacy.ajax = true; 来触发。

有关执行服务器端处理的 1.9- 方法的文档,请参考 旧文档

示例数据

服务器端处理返回的示例,使用数组作为表格的数据源(完整示例

{
    "draw": 1,
    "recordsTotal": 57,
    "recordsFiltered": 57,
    "data": [
        [
            "Angelica",
            "Ramos",
            "System Architect",
            "London",
            "9th Oct 09",
            "$2,875"
        ],
        [
            "Ashton",
            "Cox",
            "Technical Author",
            "San Francisco",
            "12th Jan 09",
            "$4,800"
        ],
        ...
    ]
}

服务器端处理返回的示例,使用对象(还包括 DT_RowIdDT_RowData)作为表格的数据源(完整示例

{
    "draw": 1,
    "recordsTotal": 57,
    "recordsFiltered": 57,
    "data": [
        {
            "DT_RowId": "row_3",
            "DT_RowData": {
                "pkey": 3
            },
            "first_name": "Angelica",
            "last_name": "Ramos",
            "position": "System Architect",
            "office": "London",
            "start_date": "9th Oct 09",
            "salary": "$2,875"
        },
        {
            "DT_RowId": "row_17",
            "DT_RowData": {
                "pkey": 17
            },
            "first_name": "Ashton",
            "last_name": "Cox",
            "position": "Technical Author",
            "office": "San Francisco",
            "start_date": "12th Jan 09",
            "salary": "$4,800"
        },
        ...
    ]
}

可在本网站的 示例部分 中找到一组完整示例,探讨服务器端处理的可用选项。