Изотопная сетка: запомнить выбор фильтра после обновления - PullRequest
0 голосов
/ 17 сентября 2018

У меня есть рабочий множественный флажок и фильтр ползунка с изотопом (v3). Действительно хорошо работает.

Моя проблема заключается в том, что когда я обновляю страницу, выбранные флажки все еще отмечены, но в сетке отображаются все элементы. Должны отображаться только выбранные флажки фильтра.

Почему-то мне нужно хранить их в LocalStorage или по хеш-URL. Будем благодарны за любую помощь.

У меня есть сценарий здесь;

var $container = $('.items'),

prijsSlider = document.getElementById('prijs-slider'),
$prijsFrom = $('.prijs-from'),
$prijsTo = $('.prijs-to'),

tellerSlider = document.getElementById('teller-slider'),
$tellerFrom = $('.teller-from'),
$tellerTo = $('.teller-to'),

bouwjaarSlider = document.getElementById('bouwjaar-slider'),
$bouwjaarFrom = $('.bouwjaar-from'),
$bouwjaarTo = $('.bouwjaar-to'),

financieringSlider = document.getElementById('financiering-slider'),
$financieringFrom = $('.financiering-from'),
$financieringTo = $('.financiering-to'),

filters = {},
comboFilter;

    noUiSlider.create(prijsSlider, {
        start: [10000, 200000],
        connect: true,
        step: 500,
        range: {
            'min': 10000,
            'max': 200000
        }
    });

    noUiSlider.create(tellerSlider, {
        start: [0, 200000],
        connect: true,
        step: 500,
        range: {
            'min': 0,
            'max': 200000
        }
    });

    noUiSlider.create(bouwjaarSlider, {
        start: [2008, 2018],
        connect: true,
        step: 1,
        range: {
            'min': 2008,
            'max': 2018
        }
    });

    noUiSlider.create(financieringSlider, {
        start: [0, 3000],
        connect: true,
        step: 1,
        range: {
            'min': 0,
            'max': 3000
        }
    });

    prijsSlider.noUiSlider.on('update', function (values, handle) {
        (handle ? $prijsTo : $prijsFrom).text(parseInt(values[handle]));
        $container.isotope({
            filter: multipleFilter
        });
    });

    tellerSlider.noUiSlider.on('update', function (values, handle) {
        (handle ? $tellerTo : $tellerFrom).text(parseInt(values[handle]));
        $container.isotope({
            filter: multipleFilter
        });
    });

    bouwjaarSlider.noUiSlider.on('update', function (values, handle) {
        (handle ? $bouwjaarTo : $bouwjaarFrom).text(parseInt(values[handle]));
        $container.isotope({
            filter: multipleFilter
        });
    });

    financieringSlider.noUiSlider.on('update', function (values, handle) {
        (handle ? $financieringTo : $financieringFrom).text(parseInt(values[handle]));
        $container.isotope({
            filter: multipleFilter
        });
    });

    // do stuff when checkbox change
    $('#options').on('change', function (jQEvent) {
        var $checkbox = $(jQEvent.target);
        manageCheckbox($checkbox);
        comboFilter = getComboFilter(filters);
        $container.isotope({
            filter: multipleFilter
        });
    });

    function multipleFilter() {
        var that = this;

        function checkPrijs() {
            var prijs = $(that).find('.prijs').text();
            prijsFrom = parseInt($prijsFrom.text()) || 0;
            prijsTo = parseInt($prijsTo.text()) || 0;

            prijs = parseInt(prijs) || 0;

            return prijs >= prijsFrom && prijs <= prijsTo;
        }

        function checkTeller() {
            var teller = $(that).find('.teller').text();
            tellerFrom = parseInt($tellerFrom.text()) || 0;
            tellerTo = parseInt($tellerTo.text()) || 0;

            teller = parseInt(teller) || 0;

            return teller >= tellerFrom && teller <= tellerTo;
        }

        function checkBouwjaar() {
            var bouwjaar = $(that).find('.bouwjaar').text();
            bouwjaarFrom = parseInt($bouwjaarFrom.text()) || 0;
            bouwjaarTo = parseInt($bouwjaarTo.text()) || 0;

            bouwjaar = parseInt(bouwjaar) || 0;

            return bouwjaar >= bouwjaarFrom && bouwjaar <= bouwjaarTo;
        }

        function checkFinanciering() {
            var financiering = $(that).find('.financiering').text();
            financieringFrom = parseInt($financieringFrom.text()) || 0;
            financieringTo = parseInt($financieringTo.text()) || 0;

            financiering = parseInt(financiering) || 0;

            return financiering >= financieringFrom && financiering <= financieringTo;
        }

        return checkPrijs() && checkTeller() && checkBouwjaar() && checkFinanciering() && $(this).is(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;
    }

    function manageCheckbox($checkbox) {
        var checkbox = $checkbox[0];
        var group = $checkbox.parents('.option-set').attr('data-group');
        // create array for filter group, if not there yet
        var filterGroup = filters[group];
        if (!filterGroup) {
            filterGroup = filters[group] = [];
        }
        var isAll = $checkbox.hasClass('all');
        // reset filter group if the all box was checked
        if (isAll) {
            delete filters[group];
            if (!checkbox.checked) {
                checkbox.checked = 'checked';
            }
        }
        // index of
        var index = $.inArray(checkbox.value, filterGroup);
        if (checkbox.checked) {
            var selector = isAll ? 'input' : 'input.all';
            $checkbox.siblings(selector).removeAttr('checked');
            if (!isAll && index === -1) {
                // add filter to group
                filters[group].push(checkbox.value);
            }
        } else if (!isAll) {
            // remove filter from group
            filters[group].splice(index, 1);
            // if unchecked the last box, check the all
            if (!$checkbox.siblings('[checked]').length) {
                $checkbox.siblings('input.all').attr('checked', 'checked');
            }
        }
    }
...