<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>搜索功能</title>
<link rel="stylesheet" href="https://www.jq22.com/jquery/bootstrap-4.2.1.css">
<style>
.content1 {
width: 600px;
height: 600px;
display: inline-block;
margin-top: 50px;
margin-left: 100px;
}
.content2 {
width: 600px;
height: 600px;
display: inline-block;
margin-top: 50px;
margin-left: 100px;
}
#lin {
margin: 20px 0;
height: 30px;
padding: 5px;
box-sizing: border-box;
}
.names {
width: 300px;
margin-bottom: 30px;
}
</style>
</head>
<body>
<div class="content1">
<!-- <input type="text" id="lin" placeholder="请输入需要搜索的内容"> -->
<input type="text" class="form-control names" id="lin" placeholder="请输入需要搜索的内容">
<table class="table table-striped table-bordered" id="table-1">
<thead class="thead-dark">
<tr>
<th>姓名</th>
<th>性别</th>
<th>年龄</th>
<th>电话</th>
<th>地址</th>
</tr>
</thead>
<tbody>
<tr>
<td>林兵</td>
<td>男</td>
<td>18</td>
<td>12345678941</td>
<td>富顺</td>
</tr>
<tr>
<td>赖玉英</td>
<td>女</td>
<td>18</td>
<td>12345678942</td>
<td>南充</td>
</tr>
<tr>
<td>潘旭</td>
<td>女</td>
<td>20</td>
<td>12345678912</td>
<td>富顺</td>
</tr>
<tr>
<td>王威平</td>
<td>男</td>
<td>20</td>
<td>97543152146</td>
<td>广元</td>
</tr>
<tr>
<td>李丹</td>
<td>女</td>
<td>30</td>
<td>14725836910</td>
<td>江安</td>
</tr>
<tr>
<td>陈志樑</td>
<td>男</td>
<td>20</td>
<td>31546287451</td>
<td>富顺</td>
</tr>
<tr>
<td>郭仕宏</td>
<td>男</td>
<td>20</td>
<td>51240316845</td>
<td>南充</td>
</tr>
</tbody>
</table>
</div>
<div class="content2">
<select class="form-control names" id="select">
<option>请选择地址</option>
<option>富顺</option>
<option>南充</option>
<option>广元</option>
<option>江安</option>
<option>成都</option>
<option>内江</option>
</select>
<table class="table table-striped table-bordered" id="table-2">
<thead class="thead-dark">
<tr>
<th>姓名</th>
<th>性别</th>
<th>年龄</th>
<th>电话</th>
<th>地址</th>
</tr>
</thead>
<tbody>
<tr>
<td>林兵</td>
<td>男</td>
<td>18</td>
<td>12345678941</td>
<td>富顺</td>
</tr>
<tr>
<td>赖玉英</td>
<td>女</td>
<td>18</td>
<td>12345678942</td>
<td>南充</td>
</tr>
<tr>
<td>潘旭</td>
<td>女</td>
<td>20</td>
<td>12345678912</td>
<td>富顺</td>
</tr>
<tr>
<td>王威平</td>
<td>男</td>
<td>20</td>
<td>97543152146</td>
<td>广元</td>
</tr>
<tr>
<td>李丹</td>
<td>女</td>
<td>30</td>
<td>14725836910</td>
<td>江安</td>
</tr>
<tr>
<td>陈志樑</td>
<td>男</td>
<td>20</td>
<td>31546287451</td>
<td>富顺</td>
</tr>
<tr>
<td>郭仕宏</td>
<td>男</td>
<td>20</td>
<td>51240316845</td>
<td>南充</td>
</tr>
</tbody>
</table>
</div>
<script src="https://www.jq22.com/jquery/jquery-1.10.2.js"></script>
<script src="https://www.jq22.com/jquery/bootstrap-4.2.1.js"></script>
<!-- <script src="lin_search.js"></script> -->
<script>
function Search(objId, inputId, color) {
/* 方法说明
此方法依赖于 jquery 开发的,必须先导入 jquery
下拉框筛选时默认以第一个 option 的值 代表所有,即当选择第一个 option 时,返回所有数据,不进行搜索
*@param{String} objId 需要被搜索内容表格的id或class
*@param{String} inputId 搜索框的id或class || 下拉框的id或class
*@param{String} color 搜索内容以什么颜色返回,不传默认为红色
*/
// 表格搜索
this.tableSearch = function () {
$('#content-null').remove(); // 每次进入先移出掉上次搜索产生的tr
this.objId.find('tr span').css({// 每次搜索开始,先把所有字体颜色恢复初始状态
'color': "black",
'font-weight': 'normal'
});
var tableTrTdContent = this.objId.find('tr td:contains("' + this.inpIdContents + '")'); // 获取所有含有搜索内容的td,类似于集合存储
if (this.inpIdContents != '') { // 如果搜索内容为空,就不用去更改样式,直接还原所有
if (tableTrTdContent.length == 0) {// 判断集合长度是否为0,为0则表示搜索的内容在表格里不存在
this.objId.find('tr:not(:eq(0))').css({ // 先将所有tr隐藏
display: "none"
})
var tableColspanNumber = this.objId.find('tr').eq(0).find('th').length || this.objId.find('tr').eq(0).find('td').length; // 获取表头的列数
var tr = $(`
<tr id="content-null">
<td colspan='${tableColspanNumber}' style="text-align: center;">暂无你搜索的内容</td>
</tr>
`); // 创建搜索不到时,显示的tr
this.objId.append(tr)
} else if (tableTrTdContent.length > 0) {// 集合长度不为0,则表示搜索的内容在表格里
// console.log("我在")
// console.log(tableTrTdContent)
$('#content-null').remove();
this.objId.find('tr:not(:eq(0))').css({ // 先将所有tr隐藏
display: "none"
})
for (var a = 0; a < tableTrTdContent.length; a++) {// 遍历找到的td集合,进行每个渲染颜色
// console.log(tableTrTdContent[a].parentNode)
tableTrTdContent[a].parentNode.style.display = "table-row"; // 让含有搜索内容的 tr 进行显示
var contents = tableTrTdContent.eq(a).text(); // 获取到含有搜索内容的td里的集体内容,即字符串
var contentsArr = contents.split(this.inpIdContents); // 以搜索框中的内容将td的值进行分割成数组
var contentArrFirst = contentsArr[0]; // 将数组里的第一个值取出
for (var j = 1; j < contentsArr.length; j++) {// 将分割出来的内容进行染色后重新组合在一起
contentArrFirst += `<span style=';color:${this.color};font-weight:bolder'>` + this.inpIdContents + "</span>" + contentsArr[j];
};
tableTrTdContent.eq(a).html(contentArrFirst); // 将td里的值从新解析成html
console.log(tableTrTdContent.length - 1)
}
}
} else {
this.objId.find('tr:not(:eq(0))').css({
display: "table-row"
});
$('#content-null').remove();
}
}
// 初始化,判断需要搜索标签的类型
this.init = function () {
this.color = color || 'red';
console.log(this.color)
if (typeof $ == "undefined") {// 判断是否引入 jquery
throw new Error("该搜索功能依赖于jquery插件,需要引入jquery");
}
if (typeof objId[0] == "undefined") {// 判断是通过jquery获取的id还是原生获取的id,需要把原生的转换成jquery
this.objId = $(objId); // 需要搜索的对象的id
} else {
this.objId = objId; // 需要搜索的对象的id
}
if (typeof inputId[0] == "undefined") {// 判断搜索框获取的方式,转换成jquery获取
var inp = $(inputId);
} else {
var inp = inputId;
}
// console.log('inp',inp)
// if (typeof inp == 'string' || typeof inp == 'number') { // 判断传来的是 input 标签,还是一个搜素内容
// this.inpIdContents = inp.trim()
// } else {
// }
if (inp[0].tagName == "SELECT") { // 如果是以下拉框来筛选,则下拉框第一个选项为显示所有信息,即不搜索
if (inp.val().trim() == inp.find('option:first').val()) {
this.inpIdContents = '' // 搜索的内容为空
} else {
this.inpIdContents = inp.val().trim() // 获取搜索框里的值,去除首尾空格
}
} else {
this.inpIdContents = inp.val().trim() // 获取搜索框里的值,去除首尾空格
}
// console.log(inp[0].tagName)
// console.log(this.inpIdContents)
// console.log(typeof inp)
this.objType = this.objId[0].tagName; // 获取需要被搜索对象的标签类型,将jquey转化为原生js获取标签类型
// console.log(this.objId.find("tr th").length)
// if (this.objId.find("tr th").length == 0) {// 判断表格是否有表头,没有就创建错误信息
// throw new Error("你要搜索的表格没有表头 <th> 标签,请规范好表格");
// }
switch (this.objType) {// 判断搜索对象
case 'TABLE': this.tableSearch(); break; // 对象是表格,进行表格搜索
}
}
this.init()
}
// 表1
$("#lin").on('keyup', function () {
var table1 = $("#table-1");
var input = $(this);
new Search(table1, input)
})
// 表2
$('#select').on('change', function () {
var content = $('#select') // 下拉框
var table2 = $('#table-2')
new Search(table2, content, '#6332f6')
})
</script>
</body>
</html>