什么是在html文档中突出显示不同字符串的最快方法?

时间:2014-12-09 04:58:35

标签: javascript jquery html performance highlight

我正在尝试在html页面中搜索字符串,我有一个包含1000个名字的对象,我需要找到这些名称是否存在于html文档中。如果它们确实存在,那么我需要将它们包裹在一个范围内,然后应用一个类。

我一直在使用这个jQuery Highlight Plugin,但扫描并突出显示整个页面需要大约17秒,这显然取决于页面上有多少不同的名称。

我尝试了一些不同的插件,但没有发现任何更快的速度,有没有办法在vanilla JS中做得更快?它只需要在Chrome中运行。

任何帮助都会非常感激。

由于

编辑:包含名称的对象的结构:

var PEOPLE = { "fred" : { loaded : false, elements : [] }, "dave" : { loaded : false, elements : [] }, "bob" : { loaded : false, elements : [] } }

2 个答案:

答案 0 :(得分:3)

普通的javascript。

基本上我遍历你的对象并提取所有相关的名字。一旦我有了这个,我将数组传递给highlightString函数,在那里我连接你想要与管道字符匹配的所有字符串,并创建一个全局运行并忽略大小写的正则表达式。这导致被搜索的div仅被搜索一次。这应该会带来相当大的加速。

var PEOPLE = {
  "fred" : {
    loaded : false,
    elements : []
  },
  "dave" : {
    loaded : false,
    elements : []
  },
  "bob" : {
    loaded : false,
    elements : []
  }
},
name,
search = [];

for (name in PEOPLE) {
  search.push(name);
}    

function highlightStrings(input, toMatch) {
  var reg = new RegExp('(' + toMatch.join('|') + ')', "gi");
  input.innerHTML = input.innerHTML.replace(reg, '<span class="myHighLight">$1</span>');  
}

highlightStrings(document.getElementById("test"), search);
.myHighLight {background-color:yellow;}
<div id="test">
  test1 test2 fred test4 test5 test6 test7 test8 dave test10 test11 test12 bob test14 test15
</div>

答案 1 :(得分:0)

试试这个。

jQuery.expr[':'].contains = function(a, i, m) {
        return jQuery(a).text().toUpperCase()
        .indexOf(m[3].toUpperCase()) >= 0;
    }; // this is just for ignore case

    $("#id_of_Input_Tag").keyup(function() {
        $(".UserItem a").hide(); // hide all content 
        var rows = $(".UserItem").find("a");
        var data = this.value.split("~");
        $.each( data, function(i, v) {
            rows.filter(":contains('" + v + "')").show(); // this will only show the maching content.
            if(v == '' ){
                $(".UserItem a").show(); // when input is empty then show all 

            }

        });

    });