【问题标题】:Combining elements for filtering with Isotope将用于过滤的元素与同位素组合
【发布时间】:2011-12-14 18:31:46
【问题描述】:

我目前正在使用 Isotope 过滤出版物列表,但希望能够将标准的、记录在案的链接过滤器方法与选择元素结合起来,因为我的第二个过滤器列表很长。

我正在努力处理两种不同类型的元素并将选择的值组合一个选项数组中。我可以使过滤器彼此独立工作(下面的代码),但它们需要一起工作。如何将两个不同的操作(单击或更改)和两个属性(class= 或 value=)组合到一个选项数组中以传递给同位素过滤器?

    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});
    }
);

【问题讨论】:

  • 你不可能这样做,因为用户不能同时做出这两个动作。否则使用全局变量来收集数据并使用数组 merge[r] 或类似的东西
  • 谢谢瓦尔。我想将过滤器组合为两个单独的操作 - 我只需要确保这种过滤器组合一起执行。否则我会得到我目前拥有的东西,这是覆盖前一个动作的最后一个动作!我会看看你建议的合并。
  • 我想我已经弄清楚了(有点不雅!) - 我正在检查每个功能的“其他”列表并将过滤器附加到我正在更新的那个。像这样: ` $("#industry-dropdown").chosen().change( function() { var Industry = $("option:selected", this).val(); var publisher = $optionSets.find( 'a.selected').attr('data-option-value'); $container.isotope({filter: Industry+publisher}); } );`
  • 抱歉,我的评论似乎无法很好地格式化
  • 使用打勾按钮通常在键盘上的选项卡按钮顶部,类似于单引号

标签: jquery select click jquery-isotope


【解决方案1】:

您需要一个多维数组,每个过滤器类型都有一个数组维度。我以前做过,有一个现场演示示例here

here!对于js。

编辑(2020 年 2 月):演示和 JavaScript 的链接已在 2020 年更新,包含回程机器网址

在我的 js 文件中,您会对名为 getComboFilters(filters) 的 end 函数感兴趣

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次:

$container.isotope({ filter: '.ccskills' });

及以后:

 $container.isotope({filter: .industry});

如果您要一起过滤类型,那么所有过滤器类型都必须相互了解,这意味着它们必须位于同一个 javascript 外壳中,并且过滤器方法只需调用一次什么时候会针对您的所有过滤器类型条件进行测试。

使用 getComboFilter( filters ) 函数,您可以像这样调用组合过滤器方法:

var $container = $('#library');
var filters = {};
var comboFilter = getComboFilter( filters );
$container.isotope({ filter: comboFilter });

最后,完全集成到您的文件中将是这样的:

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;
}

希望这对某人有所帮助!演示非常漂亮。

【讨论】:

  • 嗨 Drew,我认为您的演示很棒,但我无法根据自己的需要调整它,我选择了一个复选框,而不是按钮、多重检查、没有类别。我希望过滤器显示文本具有可点击的 div,就像您在演示中一样。当您单击过滤器选择的显示文本时,它将取消选中复选框并删除过滤器。这是我的 stackoverflow 问题:stackoverflow.com/questions/55943895/… 希望您能提供帮助,因为您是我找到的最接近的解决方案。
  • @crystallove18 - 我回复了你的帖子
  • 帖子中链接的演示不再有效。
  • 嘿,很抱歉@beta 我忘记了这篇文章,最近那个旧服务器被关闭了。我会立即更新我的帖子并进行修复!
猜你喜欢
  • 2015-06-25
  • 2016-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-08
  • 1970-01-01
相关资源
最近更新 更多