【问题标题】:Isotope Filtering - Issues when reset to start position同位素过滤 - 重置到起始位置时的问题
【发布时间】:2018-10-31 05:45:53
【问题描述】:

我已经建立了一个同位素网格布局来显示项目,它还使用同位素过滤来更快地对项目进行排序。

过滤工作正常,直到您尝试将下拉菜单放回其默认位置“所有服务”和“所有部门”。然后所有项目都被隐藏,当它们都应该显示时。

http://www.ellyon.co.uk/wp/projects/

编辑:这可能是 Jquery 冲突吗?我已经添加了我的 functions.php,因为我不是 100% 确定我正确地添加了脚本。

functions.php

function add_isotope() {
    wp_register_script( 'isotope-init', get_template_directory_uri().'/js/isotope.js', array('jquery', 'isotope'),  true );
    wp_register_style( 'isotope-css', get_stylesheet_directory_uri() . '/styles/project.css' );

    wp_enqueue_script('isotope-init');
    wp_enqueue_style('isotope-css');
}
add_action( 'wp_enqueue_scripts', 'add_isotope' );

function modify_jquery() {
    if ( !is_admin() ) {
        wp_deregister_script( 'jquery' );
        wp_register_script( 'jquery', 'https://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.min.js', false, '3.2.1' );
        wp_enqueue_script( 'jquery' );
    }
}
add_action( 'init', 'modify_jquery' );

同位素.js

// Grid
var $grid = $('.grid').isotope({
  itemSelector: '.grid-item',
  layoutMode: 'packery',
  columnWidth: '.grid-sizer',
  packery: {
    gutter: '.gutter-sizer'
  }
});


// state variable
var $expandedItem;

// expand when clicked
$grid.on( 'click', '.grid-item', function( event ) {
  var isExpanded = $expandedItem && event.currentTarget == $expandedItem[0];
  if ( isExpanded ) {
    // exit if already expanded
    return;
  }
  // un-expand previous
  if ( $expandedItem ) {
    $expandedItem.removeClass('gigante');
  }
  // set new & expand
  $expandedItem = $( event.currentTarget ).addClass('gigante');
  $grid.isotope('layout');
});

$grid.on( 'click', '.close-button button', function( event ) {
  $expandedItem.removeClass('gigante');
  // reset variable
  $expandedItem = null;
  $grid.isotope('layout');
  event.stopPropagation();
});

// Select Filters
$(function() {
    var $container = $('.grid'),
        $select = $('div#filterGroup select');
    filters = {};

    $container.isotope({
        itemSelector: '.grid-item'
    });
        $select.change(function() {
        var $this = $(this);

        var $optionSet = $this;
        var group = $optionSet.attr('data-filter-group');
    filters[group] = $this.find('option:selected').attr('data-filter-value');

        var isoFilters = [];
        for (var prop in filters) {
            isoFilters.push(filters[prop])
        }
        var selector = isoFilters.join('');

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

        return false;
    });

    $grid.imagesLoaded().progress( function() {
      $grid.isotope('layout');
    });

});

【问题讨论】:

    标签: php jquery error-handling filtering jquery-isotope


    【解决方案1】:

    星号* 是一种特殊情况,需要与其他过滤器值不同的处理方式,例如:

    • 如果选择了一个或多个非星号值,则应忽略所有星号
    • 如果未选择非星号值,则默认为单个星号(显示全部)。

    必须有多种方法来实施这些规则。这是一个:

    // Select Filters
    $(function() {
        var $grid = $('.grid');
        var $selects = $('div#filterGroup select').change(function() {
            var selector = $selects.get().map(function(el) { // map the select elements ...
                return $(el).data('filter-value'); // ... to an array of filter-values
            }).filter(function(val) {
                return val !== '*' // filter out all '*' values
            }).join('') || '*'; // if joined array is empty-string, then default to a single '*'
            $grid.isotope({
                'filter': selector
            });
            return false;
        });
        ...
    });
    

    请注意,原始代码的filters 对象只会增加不必要的复杂性。 DOM 非常擅长表示自己的状态,因此与其在 javascript 中维护一个持久映射,不如将两个 select 元素直接映射到 Array 中,每次其中一个元素发生变化。

    如果 HTML 构造如下,代码会稍微简化:

    <select class="filter option-set" data-filter-group="services">
        <option value="">All Services</option>
        <option value='.cladding'>Cladding</option>
        ...
    </select>
    <select class="filter option-set" data-filter-group="sectors">
        <option value="">All Sectors</option>
        <option value='.commerical'>Commerical</option>
        ...
    </select>
    

    然后,.filter() 去掉星号的需要就会消失,留下:

    $(function() {
        var $grid = $('.grid');
        var $selects = $('div#filterGroup select').change(function() {
            var selector = $selects.get().map(function(el) { // map the select elements ...
                return $(el).val(); // ... to an array of values
            }).join('') || '*'; // if joined array is empty-string, then default to a single '*'
            $grid.isotope({
                'filter': selector
            });
            return false;
        });
        ...
    });
    

    【讨论】:

    • 感谢您的回复,抱歉我的回复延迟。
    猜你喜欢
    • 2012-11-22
    • 1970-01-01
    • 1970-01-01
    • 2016-07-07
    • 2013-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多