javascript - 每列中的 DataTables 全局正则表达式搜索
问题描述
我想实现一个功能,您可以在其中开始搜索字符串,$
以便在所有可搜索列中进行 startsWith 搜索。这是我迄今为止尝试过的:
$('#myinput').on('keyup', (event) => {
let searchValue = $(event.currentTarget).val();
if (searchValue.startsWith('$')) {
searchValue = `^${searchValue.substr(1)}`;
}
this.dataTable.search(searchValue, true, false, false).draw();
});
但显然,这只在第一列中搜索。如果我不在^
搜索中使用,它会搜索所有列。如何检查是否有任何列以myValue
而不是整个行数据开头?
可以在https://datatables.net/examples/api/regex.html上复制。启用全局正则表达式并搜索 ^Airi,然后搜索 ^Accountant。
您将获得 Airi 的结果,但不会获得 Accountant 的结果。
我怎样才能使搜索^Accountant
仍然显示第一个条目,因为第二列以 Accountant 开头?
解决方案
发生这种情况是因为当全局正则表达式设置为true
它将整行视为文本。因此,您的搜索应如下所示:
$('#myinput').on('keyup', (event) => {
let searchValue = $(event.currentTarget).val();
if (searchValue.startsWith('$')) {
searchValue = `\b${searchValue.substr(1)}`;
}
this.dataTable.search(searchValue, true, false, false).draw();
});
正则表达式令牌\b
代表“边界”。每个单词的开头都会创建一个新边界(这里是正则表达式规范:https ://regex101.com/r/s0MdwW/1 )。您还可以通过搜索“\bTok”来尝试它在 Datatables 网站中的工作原理,这应该会显示“Airi”。
但请注意,有一个问题:搜索“Sat”将匹配“Airi Satou”,因为单词之间存在边界。如果您想避免这种特殊情况,那么您只需要执行,然后收集所有结果。每列正则表达式搜索仅使用列内容进行匹配:^
正则表达式搜索(如您当前的代码),但对于每一列
更新:好的,所以每列搜索肯定比预期的更复杂,因为简单地搜索每列会创建一个 AND 搜索。例如,搜索“Airi”还需要“Airi”在所有其他列中。
为了解决这个问题,必须构建一个自定义搜索功能。在这里你可以找到它:https ://codepen.io/adelriosantiago/pen/XWKGoLx?editors=1011
此自定义函数 OR 使用该函数搜索列$.fn.dataTable.ext.search.push
。
推荐阅读
- rest-assured - 如何放心提取请求的URL?
- python - 如何在 python 中将“日/月”字符串转换为日期并将其与 Odoo 日期字段进行比较?
- javascript - React Router更改地址但不加载第二页
- python - 如何使用 Python Selenium 获取部分 html 源代码?
- html - 如何在弹性框中居中 h6 标签
- c# - 如何使用多个主键表动态创建 DevExpress XPO?
- python - 使用 sklearn 进行 Python 高斯过程回归
- java - 如何使用流创建地图?
- javascript - React 表单只发送状态的一个属性,而不是整个状态
- neo4j - neo4j 3.5 中的子查询(用于分页)