javascript - 从 DataTable 中的逗号分隔列填充下拉菜单
问题描述
我正在构建一个具有类似于此链接的搜索功能的 DataTable。
https://datatables.net/examples/api/multi_filter_select.html
但我想要一个标签搜索功能。我的表中有一个名为 Tag 列的列。Tag 列的每一行都包含一个逗号分隔的字符串。该表如下所示:
"#" |"Type"| "Tag Column"
1 | Type A | Tag1, Tag2, Tag3
2 | Type A | Tag1, Tag2
3 | Type B | Tag4, Tag5
4 | Type A | Tag6
如何从标签列中填充下拉菜单,使每个选项只有一个标签。
我希望它只显示过滤的行;例如,如果我为“类型 A”过滤“列类型”,下拉菜单必须显示以下标签:
Tag1
Tag2
Tag3
Tag6
我试过 yadcf(下面的代码),但是当我过滤“A 型”时,标签下拉菜单仍然显示所有标签 1--6。我希望它删除标签 4 和 5。
有什么建议吗?
<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" type="text/css" href="http://ajax.aspnetcdn.com/ajax/jquery.dataTables/1.9.4/css/jquery.dataTables.css">
<link href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.9.2/themes/base/jquery-ui.css" rel="stylesheet" type="text/css" />
<link href="jquery.datatables.yadcf.css" rel="stylesheet" type="text/css" />
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script>
<script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.9.2/jquery-ui.min.js"></script>
<script type="text/javascript" charset="utf8" src="http://ajax.aspnetcdn.com/ajax/jquery.dataTables/1.9.4/jquery.dataTables.min.js"></script>
<script src="jquery.dataTables.yadcf.js"></script>
<style>
.label {
padding: 0px 10px 0px 10px;
border: 1px solid #ccc;
-moz-border-radius: 1em; /* for mozilla-based browsers */
-webkit-border-radius: 1em; /* for webkit-based browsers */
border-radius: 1em; /* theoretically for *all* browsers*/
}
</style>
<script>
$(document).ready(function(){
$('#example').dataTable().yadcf([
{column_number : 1},
{column_number : 2, column_data_type: "html", html_data_type: "text", filter_default_label: "Select tag"}]);
});
</script>
<meta charset=utf-8 />
</head>
<body>
<div id="container">
<table id="example">
<thead>
<tr>
<th>#</th>
<th>Type</th>
<th>Tags</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>Type A</td>
<td><span class="label">Tag 1</span><span class="label lightblue">Tag 2</span><span class="label lightblue">Tag 3</span></td>
</tr>
<tr>
<td>2</td>
<td>Type A</td>
<td><span class="label lightblue">Tag 1</span><span class="label lightblue">Tag 2</span></td>
</tr>
<tr>
<td>3</td>
<td>Type B</td>
<td><span class="label lightblue">Tag 4</span><span class="label lightblue">Tag 5</span></td>
</tr>
<tr>
<td>4</td>
<td>Type A</td>
<td><span class="label lightblue">Tag 6</span></td>
</tr>
</tbody>
</table>
</div>
</body>
</html>
谢谢
解决方案
考虑到您的环境,我建议使用 jQuery 而不是 DataTables API。
以下代码演示了一种可能的解决方案:
//assign DataTable to a variable
const dataTable = $('#example').DataTable({
dom: 't'
})
//grab all unique 'tag' column entries into array
const tags = [...$('.label')].reduce((tags, tag) => {
tag = $(tag).text();
if(tags.indexOf(tag) == -1) tags.push(tag);
return tags;
}, []);
//populate <select> with available tag options
$('#tagSelector').html(tags.reduce((options, tag) => options+=`<option value="${tag}">${tag}</option>`, '<option value="" selected></option>'));
//apply tag search
$('#tagSelector').on('change', function(){
dataTable.column(2).search($(this).val()).draw();
});
.label {
padding: 0px 10px 0px 10px;
border: 1px solid #ccc;
-moz-border-radius: 1em; /* for mozilla-based browsers */
-webkit-border-radius: 1em; /* for webkit-based browsers */
border-radius: 1em; /* theoretically for *all* browsers*/
}
<!doctype html>
<html>
<head>
<script type="application/javascript" src="https://code.jquery.com/jquery-3.3.1.min.js"></script>
<script type="application/javascript" src="https://cdn.datatables.net/1.10.19/js/jquery.dataTables.min.js"></script>
<script type="application/javascript" src="test.js"></script>
<link rel="stylesheet" type="text/css" href="https://cdn.datatables.net/1.10.19/css/jquery.dataTables.min.css">
<link rel="stylesheet" type="text/css" href="test.css">
</head>
<body>
<select id="tagSelector"></select>
<table id="example">
<thead>
<tr>
<th>#</th>
<th>Type</th>
<th>Tags</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>Type A</td>
<td><span class="label">Tag 1</span><span class="label lightblue">Tag 2</span><span class="label lightblue">Tag 3</span></td>
</tr>
<tr>
<td>2</td>
<td>Type A</td>
<td><span class="label lightblue">Tag 1</span><span class="label lightblue">Tag 2</span></td>
</tr>
<tr>
<td>3</td>
<td>Type B</td>
<td><span class="label lightblue">Tag 4</span><span class="label lightblue">Tag 5</span></td>
</tr>
<tr>
<td>4</td>
<td>Type A</td>
<td><span class="label lightblue">Tag 6</span></td>
</tr>
</tbody>
</table>
</body>
</html>
推荐阅读
- python - 用于在 Python 中查找文本文件之间的重复子字符串的 Python 库
- google-apps-script - 使用 Google App Script 插入包含自定义公式的新过滤器视图
- python-3.x - 无法分隔变量中的名称
- javascript - 在 Laravel 项目中安装 FilePond,如何?
- java - 带有 CompletableFuture 的 Java 多线程工作速度较慢
- reactjs - 使用情感 css 显示背景图像
- java - 为什么仅在文本字段中打印最后一次迭代(999)的值?我希望在被下一个数字替换之前打印所有数字
- node.js - Aws Lamda 返回 null - Node 中的相同代码返回值
- excel - 对公式使用范围内的计算
- java - AWS 开发工具包 2.x DynamoDB DocumentAPI