3

そこにいるすべての jQuery ヒーローに助けが必要です! (また)

インターネットで同様の質問を見つけましたが、これまでのところ回答がありませんでした:-/

jquery同位体でたくさんのアイテムをフィルタリングしたい。プラグインのホームページから組み合わせフィルターの例を採用しました。これは正常に機能し、次のようになります。

$(function () {
var $container = $('#container'),
    filters = {};
$container.isotope({
    itemSelector: '.item',
    filter: '',
});

// filter links
$('.filter a').click(function () {
    var $this = $(this);
    // don't proceed if already selected
    if ($this.hasClass('selected')) {
        return;
    }

    var $optionSet = $this.parents('.option-set');
    // change selected class
    $optionSet.find('.selected').removeClass('selected');
    $this.addClass('selected');

    // store filter value in object
    // i.e. filters.color = 'red'
    var group = $optionSet.attr('data-filter-group');
    filters[group] = $this.attr('data-filter-value');

    // convert object into array
    var isoFilters = [];
    for (var prop in filters) {
        isoFilters.push(filters[prop])
    }
    var selector = isoFilters.join('');
    $container.isotope({
        filter: selector
    });
    return false;
}); });

フィルタ メニューのいくつかの html:

<div id="nav">
    <ul class="filter option-set" data-filter-group="who">
        <li><a href="#filter-who-any" data-filter-value="" class="selected">Any</a></li>
        <li><a href="#filter-who-boys" data-filter-value=".boys">Boys</a></li>
        <li><a href="#filter-who-girls" data-filter-value=".girls">Girls</a></li>
    </ul>

</div>

組み合わせ可能な 3 つのフィルター カテゴリを使用して、フィドルデモをセットアップしました。

ここで、各カテゴリから複数のタグを選択できるようにしたいと思います。

カテゴリ 1: aまたはbまたはc

カテゴリ 2: aまたはbまたはc

カテゴリ 3: aまたはbまたはc

desandroによるcheck-box-exampleがありますが、カテゴリ間の AND 条件を維持したいので、これは私が探しているものではありません。基本的に、それぞれにいくつかのチェックボックスを備えた3つのフィルターカテゴリが必要です(またはリンクですが、チェックボックスの方が機能的だと思います)。両方の例で使用されているメソッドはまったく異なると思います。それらの機能を組み合わせる方法がわかりません。

あなたが私の主張を理解し、誰かが私が解決策を見つけるのを手伝ってくれることを願っています.

前もって感謝します!

4

6 に答える 6

13

metafizzy 同位体フィルタリングで複数のフィルター タイプを使用するには、各フィルター タイプの配列を保持するために多次元配列が必要です。

ここにライブの例があります

そして、例のjsはここにあります

完全なコードの説明については、この質問に対する私の回答を参照してください

于 2013-12-10T09:49:45.980 に答える
10

ここを見てください

http://codepen.io/desandro/pen/btFfG

DrewT による回答と同じですが、Isotope チームからの回答です。

フィルタリングするために必要なのは、すべてのグループを同じオブジェクトの下に置くことだけです

var filters = {}; // should be outside the scope of the filtering function
 
//filtering function
$a.click(function() {       
    var group = $optionSet.attr('data-filter-group');
    var filterGroup = filters[group];
    if (!filterGroup) {
        filterGroup = filters[group] = [];
    }
    filters[group].push($this.attr('data-filter-value'));
})
       

getComboFilter 関数を呼び出すだけです (getComboFilter 内のコードを理解する必要はありません。アイソトープの一部と考えてください)。

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++;
   }
 
   var comboFilter = comboFilters.join(', ');
   return comboFilter;
 }
于 2015-05-25T22:30:35.023 に答える
0

私はそれを機能させることができましたが、最初に思ったほど簡単ではありませんでした。次の 2 つの点に注意する必要があると思います。

  1. 制限的な AND 条件を使用する場合は、 「data-filter-value」オプションを使用しないことをお勧めします。代わりに、フィルタ変数を classes として配置してください。次に、onclick イベントで同位体関数を自分で起動する必要があります。これは、そうしないと、ユーザーがボタンをクリックしたときに「デフォルト」の同位体関数を起動し、前述の制限的な AND を達成できないためです。

  2. 同じ方向で、使用するネストされたフィルター オプションの組み合わせごとに、新しい変数名 (新しいクラス)を使用する必要があります。それ以外の場合、(現時点では) 制限的な AND 条件を取得する方法は他にありません。

制限的および非制限的な AND 句に関するこの概念は、外部結合と内部結合の違いに似ています。これは、2 つのフィルター (一方は他方のサブフィルター) を処理する場合に使用する必要がある概念です。
一例として、ブランドでフィルタリングできる電子ブックのリストや、それらが属するさまざまな価格帯に基づくサブフィルターなどがあります。

このアイデアを実装するコード例を以下に示します。これは、私が何を意味するかのヒントを与えることができます。

HTML:

<!--Filters section -->
<div id="filters">
    <ul id="optionSet1" class="option-set" data-option-key="filter">
           <li><a id="filter10" href="#filter" class="selected">Everything</a></li>
        <c:forEach var="brand" items="${brands}" varStatus="status" >
             <li><a id="filter1${status.count}" href="#filter" class='${brand}'>${brand}</a></li>
        </c:forEach>
    </ul>
    <ul id="optionSet2" class="option-set" data-option-key="filter">
        <li><a id="filter20" href="#filter" class="selected">Any Price</a>  </li>
    <c:forEach var="brandPrice" items="${brandPrices}" varStatus="status" >
        <li><a id="filter2${status.count}" href="#filter" class='${brandPrice}'>${brandPrice}</a></li>
    </c:forEach>
    </ul>
</div>  


<!--Elements to filter -->
<div id="portfolio-wrapper" class="row">
    <c:forEach var="publication" items="${publications}" varStatus="status" >               
        <div class='span4 portfolio-item ${publication.filterOption1} ${publication.filterOption2} ${publication.filterOption3}...'>
<!-- filterOption3 would be the combination of filterOption1 and filterOption2, you can make this building a string as the addition of filterOption1 and filterOption2 strings-->
            <!--Content to display-->           
    </c:forEach>
</div>

JavaScript:

$(function(){

        $("a[id^='filter1']").on('click', function() {
//          alert($(this).attr('class'));
//          alert($('#optionSet2 .selected').attr('class'));
            var myclass = $('#optionSet2 .selected').attr('class');
            myclass = myclass.replace(' selected','');
            myclass = myclass.replace('selected','');
            var myclass2 = $(this).attr('class');
            myclass2 = myclass2.replace(' selected','');
            myclass2 = myclass2.replace('selected','');
            if($(myclass=='' && myclass2==''){
                $('#portfolio-wrapper').isotope({ filter: '*'});
            }else if(myclass==''){
                $('#portfolio-wrapper').isotope({ filter: '.'+ myclass2+'' });
            }else if(myclass2==''){
                $('#portfolio-wrapper').isotope({ filter: '.'+myclass+'' });
            }else{

                $('#portfolio-wrapper').isotope({ filter: '.'+myclass2+myclass+''});
            }   
        });

        $("a[id^='filter2']").on('click', function() {
//          alert($(this).attr('class'));
//          alert($('#optionSet1 .selected').attr('class'));
            var myclass = $('#optionSet1 .selected').attr('class');
            myclass = myclass.replace(' selected','');
            myclass = myclass.replace('selected','');
            var myclass2 = $(this).attr('class');
            myclass2 = myclass2.replace(' selected','');
            myclass2 = myclass2.replace('selected','');
            if(myclass=='' && myclass2==''){
                $('#portfolio-wrapper').isotope({ filter: '*'});
            }else if(myclass==''){
                $('#portfolio-wrapper').isotope({ filter: '.'+ myclass2+'' });
            }else if(myclass2==''){
                $('#portfolio-wrapper').isotope({ filter: '.'+myclass+'' });
            }else{

                $('#portfolio-wrapper').isotope({ filter: '.'+myclass+myclass2+''});
            }
        });

});
于 2013-09-09T17:29:32.257 に答える