JavaScript页面内Table搜索

页面内搜索,不需要再次数据库查询,将选择符合条件的添加变成红色字体

效果图


css

        .searchSpan {
            color:#d2b48c
        }

html

<table id="dataTable" class="t1" style=" width: 99%;">
        <thead>
        <tr>
            <th> 表名称 </th>
            <th> 表描述 </th>
            <th colspan="2"> 操作 </th>
        </tr>
        </thead>
        <tbody>
        <tr  data-type='data'  id="data-0" class="a1 ui-jqgrid ui-widget-content">
            <td> bus_account </td>
            <td>  </td>
            <td data-type="btn"><input type="button" value="查看" class="button" οnclick="Read('bus_account')"/></td>
        </tr>
	<tr data-type='data' id="data-1" class="a1 ui-jqgrid ui-widget-content">
            <td> bus_type </td>
            <td>  </td>
            <td data-type="btn"><input type="button" value="查看" class="button" οnclick="Read('bus_type')"/></td>
        </tr>
	<tr data-type='data' id="data-2" class="a1 ui-jqgrid ui-widget-content">
            <td> sys_user </td>
            <td>  </td>
            <td data-type="btn"><input type="button" value="查看" class="button" οnclick="Read('sys_user')"/></td>
        </tr>
        </tbody>
    </table>

JavaScript

/**
 * 模糊查找
 * 指定table中是否存在指定字符,存在则改变颜色,不存在则隐藏,如果字符为空,这显示所有
 * @param {} find 查找数据
 * @param {} tableId 要操作标的id
 * @param {} callBack 回调函数,当find为控制,指定执行方法,
 *           如果callBack==undefind||callBack==null时,显示所有行,
*/
function SearchTable(find, tableId, callBack) {
    this.find = find.replace(" ", "");
    this.flg = false;
    this.callBack = callBack;
    this.table = document.getElementById(tableId);
    this.tbody = this.table.getElementsByTagName("tbody")[0];
    this.tr = this.tbody.getElementsByTagName("tr");
    this.dataType = function (tr) {
        var d = tr.getAttribute("data-type");
        return d;
    }
    this.tdfor = function () {
        var flg = false;
        var td = this.td;
        for (var d = 0; d < td.length; d++) {
            if (td[d].innerText.toLowerCase().indexOf(this.find) >= 0 && this.find.length > 0) {
                var _html = "<span class='searchSpan'>" + td[d].innerText + "<span>";
                td[d].innerText = "";
                td[d].innerHTML = _html;
                flg = true;
            } else {
                var span = td[d].getElementsByClassName("searchSpan");
                if (span.length <= 0) {
                    continue;
                }
                for (var s = 0; s < span.length; s++) {
                    var te = span[s].innerText;
                    td[d].innerText += te;
                }
            }
        }
        return flg;
    }
    this.trfor= function() {
        for (var i = 0; i < this.tr.length; i++) {
            var t = this.tr[i];
            if (this.dataType(t)!=="data") {
                continue;
            }
            this.td = t.getElementsByTagName("td");
            this.flg=this.tdfor();
            var innerHTML = t.innerHTML;
            if (innerHTML.toLowerCase().indexOf(this.find) >= 0) {
                t.style.display = "";
            } else {
                t.style.display = "none";
            }
            t.style.display = this.flg ? "" : "none";
        }
    }
    this.trforShow= function() {
        for (var r = 0; r < this.tr.length; r++) {
            if (this.dataType(this.tr[r]) !== "data") {
                continue;
            }
            this.td = this.tr[r].getElementsByTagName("td");
            this.flg = this.tdfor();
            this.tr[r].style.display = "";
        }
    }
    this.callbacks = function () {
        if (this.callBack === undefined || this.callBack == null) {
            this.trforShow();
            return;
        } else {
            this.callBack();
        }
    }
    this._init = function () {
        if (this.find.length > 0) {
            this.trfor();
        } else {
            this.callbacks();
        }
    }
    this._init();
}

2018/05/06更新算法

更新日志:提供缓存,更改算法,提高效率

var tableCache = {};

/**
 * 模糊查找
 * 指定table中是否存在指定字符,存在则改变颜色,不存在则隐藏,如果字符为空,这显示所有
 * @param {} find 查找数据
 * @param {} tableId 要操作标的id
 * @param {} callBack 回调函数,当find为控制,指定执行方法,
 *           如果callBack==undefind||callBack==null时,显示所有行,
*/
function SearchTable(find, tableId, callBack, isCache) {
    isCache = isCache || true;
    find = find.replace(" ", "");
    var table = document.getElementById(tableId);
    var tbody = table.getElementsByTagName("tbody")[0];
    var bodyInnerHTML = isCache == false || tableCache[tableId] == undefined || tableCache[tableId] == "" ?
        tbody.innerHTML.replace(/[\r\n\t]/g, '').replace(/[>]\s*[<]/g, "><").replace(/["]/g, "\"").replace(/[']/g, "\'") :
        tableCache[tableId];
    if (find == "") {
        tbody.innerHTML = bodyInnerHTML;
        if (callBack != null) {
            callBack();
        }
        return;
    }
    var inerArry = bodyInnerHTML.split('</tr><tr');
    for (var i = 0; i < inerArry.length; i++) {
        var iner = inerArry[i];
        var regex = new RegExp("([>](\\s?[^<>]*" + find + "[^<>]*\\s?)+[<])");
        var tr = "";
        if (regex.test(iner)) {
            //显示该列
            tr="<tr ";
            //设置该列颜色
            //分组匹配到需要的数据,然后进行替换
            inerArry[i] = iner.replace(RegExp.$1, RegExp.$1.replace(find, "<span class='searchSpan'>" + find + "</span>"));
        } else {
            tr = "<tr style='display:none'";
        }
        inerArry[i] = inerArry[i].indexOf("<tr") >= 0 ? inerArry[i].replace("<tr", tr) : (tr + inerArry[i]);
        inerArry[i] = inerArry[i].indexOf("</tr>") >= 0 ? inerArry[i] : (inerArry[i] + "</tr>");
    }
    tbody.innerHTML = inerArry.join('');
}

有需要的大兄弟可以借鉴一下,不过里边有部分是需要修改的
调用1
var find = document.getElementById("columnInfo").value;
            SearchTable(find, "dataTable"); 
调用2
var find = document.getElementById("columnInfo").value;
            SearchTable(find, "dataTable", function () {
                RemoveTr('data');
                loadData();
            }); 

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值