首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >过滤元素与同位素的组合

过滤元素与同位素的组合
EN

Stack Overflow用户
提问于 2011-10-25 08:54:21
回答 1查看 10.7K关注 0票数 3

我目前正在使用同位素来过滤出版物列表,但是我希望能够将标准的、文档化的链接过滤器方法与select元素结合起来,因为我的第二个过滤器列表相当长。

我要解决的问题是处理两种不同类型的元素,并将选定的值组合到一个选项数组中。我可以让过滤器彼此独立工作(下面的代码),但是它们需要一起工作。如何将两个不同的操作(单击或更改)和两个属性(class=或value=)组合到一个选项数组中,以传递给等顶筛选器?

代码语言:javascript
复制
    var $container = $('#library');
// select ccskills publications by default
$container.isotope({ filter: '.ccskills' });

var $optionSets = $('#library-options .option-set'),
$optionLinks = $optionSets.find('a');

$optionLinks.click(function(){
    var $this = $(this);
    // don't proceed if already selected
    if ( $this.hasClass('selected') ) {
    return false;
    }
    var $optionSet = $this.parents('.option-set');
    $optionSet.find('.selected').removeClass('selected');
    $this.addClass('selected');

    // make option object dynamically, i.e. { filter: '.my-filter-class' }
    var options = {},
    key = $optionSet.attr('data-option-key'),
    value = $this.attr('data-option-value');

    // parse 'false' as false boolean
    value = value === 'false' ? false : value;
    options[ key ] = value;
    $container.isotope( options );
    return false;
});

    // using the 'chozen' plugin to style my select element
$(".chzn-select").chosen().change(
    function() {
        var industry = $("option:selected", this).val();
        $container.isotope({filter: industry});
    }
);
EN

回答 1

Stack Overflow用户

发布于 2013-12-10 09:21:39

您需要一个多维数组,每个过滤器类型都有一个数组维度.我以前也这样做过,并且有一个现场演示示例这里

这里!为了js。

编辑(二零二零年二月):到演示和JavaScript的链接已经用回程机器urls更新到2020年

在我的js文件中,您将对名为getComboFilters(过滤器)的end函数感兴趣。

代码语言:javascript
复制
function getComboFilter( filters ) {
    var i = 0;
    var comboFilters = [];
    var message = [];
    for ( var prop in filters ) {
        message.push( filters[ prop ].join(' ') );
        var filterGroup = filters[ prop ];
        // skip to next filter group if it doesn't have any values
        if ( !filterGroup.length ) {
            continue;
        }
        if ( i === 0 ) {
            // copy to new array
            comboFilters = filterGroup.slice(0);
        }
        else {
            var filterSelectors = [];
            // copy to fresh array
            var groupCombo = comboFilters.slice(0); // [ A, B ]
            // merge filter Groups
            for (var k=0, len3 = filterGroup.length; k < len3; k++) {
                for (var j=0, len2 = groupCombo.length; j < len2; j++) {
                    filterSelectors.push( groupCombo[j] + filterGroup[k] ); // [ 1, 2 ]
                }
            }
            // apply filter selectors to combo filters for next group
            comboFilters = filterSelectors;
        }
        i++;
    }
    comboFilters.sort();
    var comboFilter = comboFilters.join(', ');
    return comboFilter;
}

此函数处理各种筛选器数组的所有推送、拼接和排序,但要使用它,需要将其添加到筛选例程中.我说的是例程,但它确实是例程,因为您似乎将过滤器方法分别调用了2次:

代码语言:javascript
复制
$container.isotope({ filter: '.ccskills' });

后来:

代码语言:javascript
复制
 $container.isotope({filter: .industry});

如果要一起过滤类型,那么所有过滤器类型都必须相互了解,这意味着它们必须位于相同的javascript附件中,并且过滤器方法只需要调用一次,然后根据所有过滤器类型条件对其进行测试。

使用getComboFilter( filters )函数,您可以调用组合过滤器方法,如下所示:

代码语言:javascript
复制
var $container = $('#library');
var filters = {};
var comboFilter = getComboFilter( filters );
$container.isotope({ filter: comboFilter });

最后,将完全集成到您的文件中如下所示:

代码语言:javascript
复制
var $container = $('#library');
var filters = {};
var comboFilter = getComboFilter( filters );
$container.isotope({ filter: comboFilter });

// This next part targets all the possible filter items
// i.e. '.option-set a' just like your example

$('.option-set a').click(function(){
        // exit directly if filter already disabled
        if ($(this).hasClass('disabled') ){
            return false;
        }
        var $this = $(this);
        var $optionSet = $(this).parents('.option-set');
        var group = $optionSet.attr('data-filter-group');
        // store filter value in object
        var filterGroup = filters[ group ];
        if ( !filterGroup ) {
            filterGroup = filters[ group ] = [];
        }
        var comboFilter = getComboFilter( filters );
        $container.isotope({ filter: comboFilter });
});
function getComboFilter( filters ) {
    var i = 0;
    var comboFilters = [];
    var message = [];
    for ( var prop in filters ) {
        message.push( filters[ prop ].join(' ') );
        var filterGroup = filters[ prop ];
        // skip to next filter group if it doesn't have any values
        if ( !filterGroup.length ) {
            continue;
        }
        if ( i === 0 ) {
            // copy to new array
            comboFilters = filterGroup.slice(0);
        }
        else {
            var filterSelectors = [];
            // copy to fresh array
            var groupCombo = comboFilters.slice(0); // [ A, B ]
            // merge filter Groups
            for (var k=0, len3 = filterGroup.length; k < len3; k++) {
                for (var j=0, len2 = groupCombo.length; j < len2; j++) {
                    filterSelectors.push( groupCombo[j] + filterGroup[k] ); // [ 1, 2 ]
                }
            }
            // apply filter selectors to combo filters for next group
            comboFilters = filterSelectors;
        }
        i++;
    }
    comboFilters.sort();
    var comboFilter = comboFilters.join(', ');
    return comboFilter;
}

希望这能帮上忙!演示很流畅。

票数 16
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7886882

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档