javascript - Jquery - 使用所选选项过滤 li

标签 javascript jquery html

我正在使用 jquery 根据选择框中的下拉列表来过滤列表。我正在使用预先分配的数据属性来过滤每个列表。如果列表项的数据属性等于所选选项的值,则不执行任何操作,否则进行过滤。

HTML:

<select id = 'mankList'>
<option value='ALL' selected>Filter By Item</option>
<option data-book1 =undefined data-book2=undefined data-book3='Vegetables' data-book4='Food' data-book5=undefined> Onions </option>
<option data-book1 ='Fruit' data-book2=undefined data-book3=undefined data-book4='Food' data-book5=undefined> Grapes </option>
<option data-book1 ='Fruit' data-book2=undefined data-book3=undefined data-book4='Food' data-book5=undefined> Oranges </option>
<option data-book1 =undefined data-book2='Candy' data-book3=undefined data-book4='Food' data-book5=undefined>Jolly Rancher </option>
<option data-book1 =undefined data-book2=undefined data-book3=undefined data-book4=undefined data-book5='NOA'> Chair </option></select>

<ul><li>Fruit</li>
    <li>Candy</li>
    <li>Food</li>
    <li>Vegetables</li>
</ul>

JS:

$(document).on('change', '#mankList', function() {


    var val1 = $('#mankList option:selected').val(),
        val2 = $('#mankList option:selected').data('book1'),
        val3 = $('#mankList option:selected').data('book2'),
        val4 = $('#mankList option:selected').data('book3'),
        val5 = $('#mankList option:selected').data('book4'),
        val6 = $('#mankList option:selected').data('book5'),
        val7 = $('#mankList option:selected').data('book6'),
        val8 = $('#mankList option:selected').data('book7'),
        val9 = $('#mankList option:selected').data('book8'),
        val10 = $('#mankList option:selected').data('book9'),
        val11 = $('#mankList option:selected').data('book10'),
        val12 = $('#mankList option:selected').data('book11'),
        val13 = $('#mankList option:selected').data('book12');



    if ( val1 === 'ALL')
    {

        $('li').each( function() {
            $(this).removeClass('hidden');
        });

    }
    else 
    {
        $('li').each(function() {
            if ($(this).text().indexOf(val2 || val3 || val4 || val5 ||val6 || val7 || val8 || val9 || val10 || val11 || val12 || val13) > 0) {
                console.log('not a match');
            }else{
                $(this).addClass('hidden'); 
            }
        });
    }

});

我的问题是,由于某种原因,程序在不应该跳过的情况下不断跳过 if 语句。我已经控制台记录了信息并且数据是正确的。我认为我的 if 语句有问题。

例如,如果选择“Jolly Rancher”,则应该对列表进行过滤,以便仅显示具有数据属性“Candy”的列表项。其他的则被隐藏。

我需要使用数据属性来过滤应用程序的其他部分,因此我无法更改它。这可能很简单,但希望得到任何帮助。下面是jsfiddle的演示

抱歉,变量名称很奇怪,必须保留一些内容。

jsfiddle

最佳答案

我发现了 2 个问题。第一个是“未定义”。如果任何'valx'变量未定义,它将导致indexOf调用每次都返回-1。

val1 = val1 == 'undefined' ? '' : val1;
val2 = val2 == 'undefined' ? '' : val2;
val3 = val3 == 'undefined' ? '' : val3;
val4 = val4 == 'undefined' ? '' : val4;
val5 = val5 == 'undefined' ? '' : val5;
val6 = val6 == 'undefined' ? '' : val6;

另一个问题是你的indexOf 检查。它应该检查索引是否 >-1,因为 0 可以是合法索引。

if ($(this).text().indexOf(val2 || val3 || val4 || val5 || val6) > -1)

编辑:

正如您在评论中指出的那样,上述方法有效,但如果一个元素具有多个数据值,那么它只会显示 1 li。为了解决这个问题,我会稍微改变一下存储和搜索 indexOf 的方式。

valx 值存储在数组中,而不是单独的变量

var values = new Array();
values.push(val1 == 'undefined' ? '' : val1);
values.push(val2 == 'undefined' ? '' : val2);
values.push(val3 == 'undefined' ? '' : val3);
values.push(val4 == 'undefined' ? '' : val4);
values.push(val5 == 'undefined' ? '' : val5);
values.push(val6 == 'undefined' ? '' : val6);

然后,不要在indexOf调用中使用||,只需在新数组中搜索$(this).text()值:

if(values.indexOf($(this).text()) > -1) { console.log('executed');}                
else{ $(this).hide(); }

我还在调用的开头添加了 $('li').show(); ,以便在每次更改下拉列表时重置列表。

新的 JSFiddle: http://jsfiddle.net/bh55ux8j/1/

关于javascript - Jquery - 使用所选选项过滤 li,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31618515/

相关文章:

javascript - 移动网络上的 SignalR?

Javascript 正则表达式代码到 PHP 正则表达式?

javascript - 如何将谷歌图表中的所有图表选项获取到js变量中?

javascript - 单击事件 getElementByClassName 返回未定义

javascript - Jquery 2.1 - 单击时堆叠调用

html - css div 渐变阴影/边框

html - 如何在html中为固定div创建视差效果

javascript - 如何从选择标签上的事件中检索对象?

javascript - 为什么 UTF-8 字符在 jquery textcomplete 中不起作用?

javascript - 如何制作 JavaScript HTML 5 Canvas 图像 "page flip",就像您在 Flash 中常见的那样?