.javascript中的测试未按预期工作

.javascript中的测试未按预期工作,javascript,jquery,html,regex,Javascript,Jquery,Html,Regex,我已经创建了一个自定义选择菜单的小插件。我必须在下拉列表中实现搜索功能。然而,我添加了功能,但有时它没有给出正确的结果,例如。如果您在输入框中键入“a”,则它应显示如下所示的结果 但我的插件给出了下面的结果。它还将大写字母替换为小写字母。 我正试图解决这个问题,但没有任何想法来解决它 这解决了部分问题小写字母加上无用的高光跨度: 这解决了部分问题小写字母加上无用的高光跨度: 不匹配项的问题在于,对多个元素使用同一个RegExp对象的测试方法 但将移动每个匹配的起始位置,以便在同一字符串上匹配后续

我已经创建了一个自定义选择菜单的小插件。我必须在下拉列表中实现搜索功能。然而,我添加了功能,但有时它没有给出正确的结果,例如。如果您在输入框中键入“a”,则它应显示如下所示的结果

但我的插件给出了下面的结果。它还将大写字母替换为小写字母。 我正试图解决这个问题,但没有任何想法来解决它


这解决了部分问题小写字母加上无用的高光跨度:


这解决了部分问题小写字母加上无用的高光跨度:


不匹配项的问题在于,对多个元素使用同一个RegExp对象的测试方法

但将移动每个匹配的起始位置,以便在同一字符串上匹配后续匹配

因此,您应该为每个元素创建一个新的RegExp对象。或者使用。匹配并检查其长度

要将字符替换为您输入的字符,请使用匹配的文本而不是用户提交的文本,您需要在RegExp中创建一个组,并使用该捕获替换匹配

    highlight: function (val) {
        var nn = new RegExp('(' + (val||'^$') + ')', 'gi');
        var txt = $(this).find('label').text();
        txt = txt.replace(nn, "<span class='highlight'>$1</span>");
        $('label', this).html(txt)
    }
最后,在创建选项时需要重置li变量


演示在

不匹配项的问题是,您对多个元素使用同一个RegExp对象的测试方法

但将移动每个匹配的起始位置,以便在同一字符串上匹配后续匹配

因此,您应该为每个元素创建一个新的RegExp对象。或者使用。匹配并检查其长度

要将字符替换为您输入的字符,请使用匹配的文本而不是用户提交的文本,您需要在RegExp中创建一个组,并使用该捕获替换匹配

    highlight: function (val) {
        var nn = new RegExp('(' + (val||'^$') + ')', 'gi');
        var txt = $(this).find('label').text();
        txt = txt.replace(nn, "<span class='highlight'>$1</span>");
        $('label', this).html(txt)
    }
最后,在创建选项时需要重置li变量


演示时,您在使用g标志创建的同一正则表达式上重复调用该方法。当您这样做时,后续的.测试将从开始继续。以下是字符串a的匹配过程:

匹配测试返回位置的lastIndex字符串子字符串 ----- -------- --------- ------- ---- 0沃尔沃虚假 0萨博真正的萨博2 3沃尔沃lvo错误 0萨博真正的萨博2 3梅赛德斯-塞德斯假 0奥迪真实1 2所有常驻人员均为假常驻人员 0所有商业所有商业真实1
这就解释了为什么不显示所有常驻标头。解决方案是删除g标志,因为您只想测试每个字符串一次。

您在使用g标志创建的同一正则表达式上重复调用该方法。当您这样做时,后续的.测试将从开始继续。以下是字符串a的匹配过程:

匹配测试返回位置的lastIndex字符串子字符串 ----- -------- --------- ------- ---- 0沃尔沃虚假 0萨博真正的萨博2 3沃尔沃lvo错误 0萨博真正的萨博2 3梅赛德斯-塞德斯假 0奥迪真实1 2所有常驻人员均为假常驻人员 0所有商业所有商业真实1
这就解释了为什么不显示所有常驻标头。解决方案是删除g标志,因为您只想测试每个字符串一次。

如果您不介意修复代码中的键入错误并将其缩进:您希望使用匹配的文本,而不是键入的值。如果您不介意修复代码中的键入错误并将其缩进:您希望使用匹配的文本,而不是键入的值。谢谢,我认为这是我见过的答案的最好解释,我认为这是我见过的答案的最好解释
searchItem: function () {
    var patt = new RegExp(this.value, 'gi')
    var val = this.value;

    $('#options li').each(function () {
        var nMatch= $(this).text().match(patt);
        if(nMatch){
                $(this).show();
                apply.highlight.call(this, val)
        }
        else{
            $(this).hide();
        }
    })

    $('#options h2').each(function () {
         var nMatch= $('label', this).text().match(patt);
         if(nMatch){
                $(this).show();
                apply.highlight.call(this, val)
        }
        else{
            $(this).hide();
        }
    })

}
searchItem: function () {
        var pattValue = this.value;
        var val = this.value;
        $('#options li').each(function () {
            var patt = new RegExp(pattValue, 'gi');
            if (!patt.test($(this).text())) {
                $(this).hide();
            } else {
                $(this).show();
                apply.highlight.call(this, val);
            }
        });

        $('#options h2').each(function () {
            var patt = new RegExp(pattValue, 'gi');
            if (!patt.test($('label', this).text())) {
                $(this).hide();
            } else {
                $(this).show();
                apply.highlight.call(this, val);
            }
        });
    }
    highlight: function (val) {
        var nn = new RegExp('(' + (val||'^$') + ')', 'gi');
        var txt = $(this).find('label').text();
        txt = txt.replace(nn, "<span class='highlight'>$1</span>");
        $('label', this).html(txt)
    }