【问题标题】:Modify this find function to accommodate more than one value修改此查找函数以容纳多个值
【发布时间】:2013-03-15 10:42:51
【问题描述】:

此功能允许用户按颜色过滤产品(使用data-attributes)。如何修改它以容纳多个值?

我希望该函数返回与任何数据属性值匹配的所有项目,并在删除其中一个过滤器时恢复为其余过滤器的更严格标准(通过取消选中特定值或所有颜色值)。我在这里发布了一个简单的函数示例:http://jsfiddle.net/chayacooper/WZpMh/21/。小提琴目前在<li> 标签内有data-attributes,但我想使用复选框以允许多项选择。

编辑 - 产品在数据颜色中可以有多个值(即黑色、白色),表明它有两种颜色可供选择,并且可以是多种颜色的 em>(即黑白)

我假设我应该使用 $('input:checkbox:checked').data('color') 之类的东西而不是 $(this).data('color') ,但我不确定如何构建它。

$(document).ready(function () {
    $('#attributes-Colors *').click(function () {
        var attrColor = $(this).data('color');
        $('#attributes-Colors').removeClass('active');
        $(this).parent().addClass('active');
        if (attrColor == 'All') {
            $('#content').find('*').show();
        } else {
            $('#content').find('li:not([data-color="' + attrColor + '"])').hide();
            $('#content').find('[data-color ~="' + attrColor + '"]').show();
        }
        return false;
    });
});   

【问题讨论】:

  • 我会尝试保留一个值数组。单击时,检查是否在数组中,如果是,则将其删除,如果不添加。然后遍历这些值并显示匹配的元素。
  • @j08691 - 这很有意义 :-) 你介意给我看一下代码吗?
  • @j08691 - 我假设不是 $(this).data('color');我应该使用 $('input:checkbox:checked').data('color'); 之类的东西,但我不确定如何正确构造它
  • 您介意在
  • 元素上使用类的解决方案吗?
  • 我建议使用类,因为每个元素可能有不止一种颜色,并且可以在元素上使用多个类
  • 标签: jquery find


    【解决方案1】:

    这是一种方法:

    http://jsfiddle.net/WZpMh/20/

    我没有为“所有颜色”链接添加任何处理,但这应该很容易做到

        var selected = [];
        $('#attributes-Colors *').click(function () {
            var attrColor = $(this).data('color');
            var $this = $(this);
            if ($this.parent().hasClass("active")) {
                $this.parent().removeClass("active");
                selected.splice(selected.indexOf(attrColor), 1);
            } else {
                $this.parent().addClass("active");
                selected.push(attrColor);
            }
            $("#content").find("*").hide();
            $.each(selected, function (index, item) {
                $('#content').find('[data-color ~="' + item + '"]').show();
            });
            return false;
        });
    

    基本思想是保留所选颜色的数组,并且任何时候单击颜色按钮时,您将隐藏所有项目,然后重新显示与selected 数组中所有颜色匹配的项目。

    对于all colors,您可以简单地添加一些额外的逻辑来空白所有其他项并使您的所有项目可见。

    【讨论】:

    • 太完美了 :-D 一个问题 - 当我按多个数据属性过滤时,您介意告诉我如何使用它吗?我将它与另一个数据属性jsfiddle.net/chayacooper/WZpMh/29 的代码结合起来,但这个函数比我写的要复杂得多;-)
    • 这可能不重要,但我想我应该让你知道我删除了'return false;'为了让复选框接受输入
    • 我遇到了一个小问题 - 在删除所有过滤器后如何让它恢复显示所有项目?
    • @ChayaCooper: 加个检查看看selected是否为空,如果是,则做$("#content").find("*").show()
    猜你喜欢
    相关资源
    最近更新 更多
    热门标签