jQuery 插件 DataTables:如何突出显示当前搜索文本?

IT技术 javascript jquery datatables
2021-03-17 05:28:16

我已经开始使用jQuery (v1.4.2)DataTables插件 (v1.6.2) ,我想问你是否知道一个设置插件可以让我在过滤的行上突出显示搜索文本框中使用的文本.

先感谢您

6个回答

我不得不建议突出显示插件:)

我现在在大致相同的场景中使用它,到目前为止它没有给我任何问题。

用法非常简单:

$("#myTable").highlight($("#searchBox").val());

只需将高亮 CSS 类放在您想要的样式表样式中,就是这样:

.highlight { background-color: yellow }
是的,这是一个很棒的小插件,而且代码很清楚,它是如何做这种事情的一个很好的例子。
2021-04-21 05:28:16
更好: $table.on('search.dt', function () { $table.on('draw.dt', function() { var api = $table.api(); $('tbody', $ table).highlight(api.search()); }) });
2021-04-30 05:28:16
@iamrohitbanga - 它只是<input type="text" />页面上的一些元素,可以触发此 onchange 或 keyup、按钮单击...无论您想要什么 UI。
2021-05-06 05:28:16
@SebastiaanHilbers 这适用于新的 API: $table.on('search.dt', function () { $(this).dataTable().on('draw.dt', function () { var term = $(this ).dataTable().api().search(); $('tbody', this).highlight(term); }); });
2021-05-15 05:28:16
但是默认情况下,数据表中没有带有 id searchBox 的元素。你是怎么添加的?
2021-05-20 05:28:16

您可以通过处理此内容来使用此功能:

jQuery.fn.dataTableExt.oApi.fnSearchHighlighting = function(oSettings) {
    oSettings.oPreviousSearch.oSearchCaches = {};       
    oSettings.oApi._fnCallbackReg( oSettings, 'aoRowCallback', function( nRow, aData, iDisplayIndex, iDisplayIndexFull) {
    // Initialize search string array
    var searchStrings = [];
    var oApi = this.oApi;
    var cache = oSettings.oPreviousSearch.oSearchCaches;
    // Global search string
    // If there is a global search string, add it to the search string array
    if (oSettings.oPreviousSearch.sSearch) {
        searchStrings.push(oSettings.oPreviousSearch.sSearch);
    }
    // Individual column search option object
    // If there are individual column search strings, add them to the search string array
    if ((oSettings.aoPreSearchCols) && (oSettings.aoPreSearchCols.length > 0)) {
        for (var i in oSettings.aoPreSearchCols) {
            if (oSettings.aoPreSearchCols[i].sSearch) {
            searchStrings.push(oSettings.aoPreSearchCols[i].sSearch);
            }
        }
    }
    // Create the regex built from one or more search string and cache as necessary
    if (searchStrings.length > 0) {
        var sSregex = searchStrings.join("|");
        if (!cache[sSregex]) {
            var regRules = "("
            ,   regRulesSplit = sSregex.split(' ');

            regRules += "("+ sSregex +")";
            for(var i=0; i<regRulesSplit.length; i++) {
              regRules += "|("+ regRulesSplit[i] +")";
            }
            regRules += ")";

            // This regex will avoid in HTML matches
            cache[sSregex] = new RegExp(regRules+"(?!([^<]+)?>)", 'ig');
        }
        var regex = cache[sSregex];
    }
    // Loop through the rows/fields for matches
    jQuery('td', nRow).each( function(i) {
        // Take into account that ColVis may be in use
        var j = oApi._fnVisibleToColumnIndex( oSettings,i);
        // Only try to highlight if the cell is not empty or null
        if (aData[j]) {         
            // If there is a search string try to match
            if ((typeof sSregex !== 'undefined') && (sSregex)) {
                this.innerHTML = aData[j].replace( regex, function(matched) {
                    return "<span class='filterMatches'>"+matched+"</span>";
                });
            }
            // Otherwise reset to a clean string
            else {
                this.innerHTML = aData[j];
            }
        }
    });
    return nRow;
}, 'row-highlight');
return this;
};

里面 :

dataTables.search-highlight.js

像这个例子一样调用它:

<script type="text/javascript" src="jquery.dataTables.js"></script>
<script type="text/javascript" src="dataTables.search-highlight.js"></script>
<script type="text/javascript">
    $(document).ready(function() {
       var oTable = $('#example').dataTable();
       oTable.fnSearchHighlighting();
    } );
</script>

并将此代码添加到您的 css 文件中:

.filterMatches{
    background-color: #BFFF00;
}
代码有很多错误,因为它不处理将 json 数据加载到数据表时的情况,无论是否有服务器端处理。
2021-05-04 05:28:16

我知道这个问题现在已经超过 6 年了,这里的答案在提问时可能对您有所帮助。但是对于仍在搜索此内容的人来说,有一个新插件可以将mark.js(一种 JavaScript 关键字荧光笔)集成到数据表中:datatables.mark.js

用法很简单:

$("table").DataTables({
    mark: true
});

这是一个例子:https : //jsfiddle.net/julmot/buh9h2r8/

这是最干净的方法,并且还为您提供了所有给定解决方案都没有提供的选项。

现在有一篇官方 DataTables博客文章可用。

我确认这也有效并且是一种有效的方法。
2021-04-28 05:28:16
<link href="https://cdn.datatables.net/plug-ins/1.10.13/features/mark.js/datatables.mark.min.css" rel="stylesheet" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/mark.js/8.11.1/jquery.mark.js"></script>
<script src="https://cdn.datatables.net/plug-ins/1.10.13/features/mark.js/datatables.mark.js"></script>

$("#tableId").dataTable({
    mark: true
});

您可以使用以下添加

jQuery.fn.dataTableExt.oApi.fnSearchHighlighting = function(oSettings) {
    // Initialize regex cache
    oSettings.oPreviousSearch.oSearchCaches = {};

    oSettings.oApi._fnCallbackReg( oSettings, 'aoRowCallback', function( nRow, aData, iDisplayIndex, iDisplayIndexFull) {
        // Initialize search string array
        var searchStrings = [];
        var oApi = this.oApi;
        var cache = oSettings.oPreviousSearch.oSearchCaches;
        // Global search string
        // If there is a global search string, add it to the search string array
        if (oSettings.oPreviousSearch.sSearch) {
            searchStrings.push(oSettings.oPreviousSearch.sSearch);
        }
        // Individual column search option object
        // If there are individual column search strings, add them to the search string array

     //   searchTxt=($('#filter_input input[type="text"]')?$('#filter_input input[type="text"]').val():"");
        var searchTxt = $('input[type="search"]').val();
        // console.log("txt" + searchTxt);
        if ((oSettings.aoPreSearchCols) && (oSettings.aoPreSearchCols.length > 0)) {
            for (var i in oSettings.aoPreSearchCols) {
                if (oSettings.aoPreSearchCols[i].sSearch) {
                searchStrings.push(searchTxt);
                }
            }
        }
        // Create the regex built from one or more search string and cache as necessary
        /*if (searchStrings.length > 0) {
            var sSregex = searchStrings.join("|");
            if (!cache[sSregex]) {
                // This regex will avoid in HTML matches
                cache[sSregex] = new RegExp("("+escapeRegExpSpecialChars(sSregex)+")(?!([^<]+)?>)", 'i');
            }
            var regex = cache[sSregex];
        }*/
        if (searchStrings.length > 0) {
            var sSregex = searchStrings.join("|");
            if (!cache[sSregex]) {
                var regRules = "("
                ,   regRulesSplit = sSregex.split(' ');

                regRules += "("+ sSregex +")";
                for(var i=0; i<regRulesSplit.length; i++) {
                  regRules += "|("+ regRulesSplit[i] +")";
                }
                regRules += ")";

                // This regex will avoid in HTML matches
                cache[sSregex] = new RegExp(regRules+"(?!([^<]+)?>)", 'ig');
            }
            var regex = cache[sSregex];
        }

        // Loop through the rows/fields for matches
        jQuery('td', nRow).each( function(i) {

            // Take into account that ColVis may be in use
            var j = oApi._fnVisibleToColumnIndex( oSettings,i);
            // Only try to highlight if the cell is not empty or null
         //   console.log("data "+ aData[j] + " j " + j);
         //   console.log("data 1  "+ nRow);
            if (aData) {
                // If there is a search string try to match
                if ((typeof sSregex !== 'undefined') && (sSregex)) {
                    //console.log("here :: "+$(this).text());
                    this.innerHTML = $(this).text().replace( regex, function(matched) {

                        return "<span class='filterMatches'>"+matched+"</span>";
                    });
                }
                // Otherwise reset to a clean string
                else {
                    this.innerHTML = $(this).text();//aData[j];
                }
            }
        });
        return nRow;
    }, 'row-highlight');
    return this;
};

这个解决方案对我有用。注意:目前它不支持单列过滤,但您只需在代码中取消注释即可。

searchTxt=($('#filter_input input[type="text"]')?$('#filter_input input[type="text"]').val():"");

我已经用数据表 1.10.2 和 jquery 1.9.2 版本对此进行了测试。