将输入字符串与 text/element 匹配并突出显示反应式

Match String of Input to text/element and highlight reactive

HTML(翡翠)

p#result Lorem ipsum is javascript j s lo 1 2 4 this meteor thismeteor. meteor
input.search

JS

Template.pg.events({
    'keyup .search': function(e){
        e.preventDefault();

        var text = $('p#result').text();
        var splitText = text.match(/\S+\s*/g);
        var input = $(e.target).val();
        var splitInput = input.match(/\S+\s*/g);

        if(_.intersection(splitText, splitInput)) {
            var match = _.intersection(splitText, splitInput);
            var matchToString = match.toString();
        $('p#result').text().replace(matchToString, '<b>'+matchToString+ '</b>')
        }

        console.log(splitText); //check what I get
        console.log(splitInput); //check what I get

    }
})

我有上面的代码。

我要做的是匹配输入字段的值,然后匹配文本。我将它的功能添加到 keyup 以便这是反应式的。

当字段和文本匹配时,它将bold tags添加到匹配的字符串(文本)中。

我想我快到了,但还没到。

我将如何从这里继续?

MeteorPad Here

在你的代码中,你似乎只匹配整个单词,尽管你的问题没有具体说明。如果您想匹配输入中的 任何 文本(例如,如果您键入 "a",文本中的所有 "a" 都会变为粗体),您可以使用 javascript splitjoin 字符串方法相对容易地做到这一点:

Template.pg.events({
    'keyup .search': function(e){
        e.preventDefault();

        var text = $('p#result').text();
        var input = $(e.target).val();
        var splitText = text.split(input); // Produces an array without whatever's in the input
        console.log(splitText);
        var rep = splitText.join("<b>" + input + "</b>"); // Produces a string with inputs replaced by boldened inputs
        console.log(rep);
        $('p#result').html(rep);
    }
});

值得注意的是,您必须使用 $('p#result').html() 替换页面上的文本,这在您的 MeteorPad 示例中是缺失的。另请注意,这是区分大小写的实现;您可以使用正则表达式来执行 split,但是当您想要替换 join 中的文本时,它会变得有点复杂。你可以在这个 MeteorPad 上玩弄它。

要不区分大小写地执行此操作,拆分非常简单——您可以像这样使用 RegExp:

...
var regex = new RegExp($(e.target).val(), 'gi'); // global and case-insensitive, where `input` used to be

棘手的事情是提取你想要取出的东西的正确大小写,然后把它放回去——你不能用简单的 join 做到这一点,所以你必须交错两个数组。您可以看到交错数组的示例 here, which was taken from this question。我已经修改了一点以处理不均匀的数组长度,这里:

var interleave = function(array1, array2) { 
  return $.map(array1, function(v, i) { 
    if (array2[i]) { return [v, array2[i]]; } // deals with uneven array lengths
    else { return [v]; }
  });
}

我还创建了另一个 MeteorPad,您可以使用它来完成所有这些工作。 lo 是一个很好的测试字符串。