Javascript 在我认为应该报告的时候不报告真实,而是报告所有错误

Javascript 在我认为应该报告的时候不报告真实,而是报告所有错误,javascript,jquery,filter,Javascript,Jquery,Filter,(在输入框中键入“bye”) 脚本的用途:每个li都包含标记词。当用户在input框中键入其中一个标记词时,它将隐藏所有不包含该标记词的li。如果超过1个li的标记词与任何单词匹配,则可以在input中键入多个单词在输入,然后显示它们。因此,它基本上是一个过滤列表,允许多个单词,并显示所有匹配的li,其中包含在输入中键入的任何单词。它只匹配整个单词,而不是部分单词,并且只应在另一个完整单词被删除时更新匹配列表这是我们的目标 我的问题是,它错误地报告这段代码中存在匹配项: if (matches

(在输入框中键入“bye”)

脚本的用途:每个
li
都包含标记词。当用户在
input
框中键入其中一个标记词时,它将隐藏所有不包含该标记词的
li
。如果超过1个
li
的标记词与任何单词匹配,则可以在
input
中键入多个单词在
输入
,然后显示它们。因此,它基本上是一个过滤列表,允许多个单词,并显示所有匹配的
li
,其中包含在
输入
中键入的任何单词。它只匹配整个单词,而不是部分单词,并且只应在另一个完整单词被删除时更新匹配列表这是我们的目标

我的问题是,它错误地报告这段代码中存在匹配项:

 if (matches == true) {
    alert('matched true')  //incorrectly reports  
 } else {
    alert('matched false') //incorrectly reports  
 }
当这段代码正确报告时:

if (regex.test($(this).text()) === true) {
    matches = true;
    // alert('tis true') //correctly reports  
} else {
       matches = false;
       // alert('tis false') //correctly reports   
}
为什么报告不正确?(正确,如:我希望它报告什么)


如果有人精通Javascript,知道我想做什么,并且知道如何帮助我,那就太好了。我正在努力解决这个问题,因为还有一些事情要做。

让我知道这是否是你想要完成的():


我认为问题在于,您在所有列表项中循环使用以下内容:

$("#list li").each(function() {
然后在每次迭代中,您都会循环使用以下单词列表:

$.each(inputWords, function(i, a_filter) {
然后在内部循环中,再次使用以下方法处理所有li元素:

var containing = $('#list li').filter(function () {
因此,在内部部分,您会对正在处理的内容感到困惑。我认为您需要做的是循环遍历每个元素,测试它是否与输入单词列表匹配,然后根据需要隐藏或显示该元素。类似如下:

var inputWords = inputValue.toLowerCase().split(/[\s,]+/);

$("#list li").each(function() {
    var matches = false,
        $currentElement = $(this);

    $.each(inputWords, function(i, a_filter) {
        if ($.trim(a_filter)==="") return; // skip blank items

        var regex = new RegExp('\\b(' + a_filter + ')(s|es|\'s)?\\b', 'i');
        if (regex.test($currentElement.text())) {
            matches = true;
            return false;  // return false breaks out of the $.each
                           // (no need to continue once a match is found)
        }
     });

     if (matches)
        $currentElement.slideDown(400);
     else
        $currentElement.slideUp();
});
工作演示:

编辑:您拆分输入单词列表的方式对我也不起作用:

var inputWords = $('.filterinput').text().toLowerCase().split(/[\s,]+/);
// I've changed that to
var inputWords = inputValue.toLowerCase().split(/[\s,]+/);

您不想使用
.text()
在输入上,并且在任何情况下,
inputValue
已经被初始化以保存该输入的文本。我上面的代码和演示已经更新。

是否匹配一个全局变量?可能会被覆盖。您是否尝试过将调试器语句放在正则表达式之后并检查匹配的值?哦,伙计,您太棒了。您真的吗理解我并知道该怎么做,这很漂亮。但有一件事我注意到我不明白:在第一个单词后,我点击空格或逗号,它将再次显示整个列表。我无法让它继续只显示带有匹配项的li。因此,用户只在匹配新li时看到列表动画/显示/隐藏,或者用户删除了一个单词/字母(导致该单词不再匹配),这有意义吗?我已经稍微更新了我的答案(包括指向更新的小提琴的链接)。问题是当空格或逗号是最后一项时分割输入(或者如果在一行中输入了多个空格或逗号)您在inputWords数组中得到了空字符串,因此围绕这些空字符串形成的正则表达式与每个列表项都匹配。因此,我添加了一行
if($.trim(a_filter)==“”)return;
跳到
$的下一个迭代。当当前项为空时,每个
都是空的。哦,当我在执行时,我将正则表达式声明更改为不区分大小写,因为不区分大小写(假设您将搜索字符串更改为小写)如果你能帮我解决最后两个小错误,我会非常感激,如果你没有时间,我理解-你帮了我很多。如果你开始在输入框中输入,并且有超过2个字符,但还没有一个匹配,它隐藏了所有的LI。有没有一种方法可以让所有的LI保持可见,直到你有了匹配,然后滑动/向下滑动需要隐藏/显示的内容?-所以用户不开始键入,然后当没有匹配时,所有的LI都消失了?
var inputWords = $('.filterinput').text().toLowerCase().split(/[\s,]+/);
// I've changed that to
var inputWords = inputValue.toLowerCase().split(/[\s,]+/);