Как я могу заставить эти два метода фильтрации работать одновременно?

#jquery #wordpress #filter

#jquery #wordpress #Фильтр

Вопрос:

Я работаю над функцией поиска по списку людей. В настоящее время у меня есть два метода, которые могут фильтровать список (который представляет собой таблицу данных) — один метод представляет собой фильтр поиска, другой — выпадающее меню доступных вариантов. Вы можете увидеть это здесь: http://cambridgefellows.com/directory-of-fellows /

Функция поиска использует этот код:

     $(document).ready(function() {
       $('input[name=searchFilterInput]').keyup(function() { 
                var searchFilterVal = $('input[name=searchFilterInput]').val();
        searchFilterVal = searchFilterVal.replace(/ /g, '-');
        searchFilterVal = searchFilterVal.toLowerCase();

        if(searchFilterVal == '') {
            $('tr.hide').fadeIn('slow').removeClass('hide');
        } else {

            $('tr.fellows').each(function() {
            var pattern = $(this).attr('class');    // the pattern to be matched 
            var match = pattern.match(searchFilterVal);//If pattern matches it returns the match

            if(!match) {
                    $(this).fadeOut('normal').addClass('hide');

                } else {
                    $(this).fadeIn('slow').removeClass('hide');
                }
            });
        }
   });
});
  

И выпадающий фильтр использует этот код:

 $(document).ready(function() {
    $('ul#filter a').click(function() {
        $(this).css('outline','none');
        $('ul#filter.current').removeClass('current');
        $(this).parent().addClass('current');

        //var filterVal = $(this).text().toLowerCase().replace(' ','-');

        var filterVal = $(this).text();
        filterVal = filterVal.replace(/ /g, '-');
        filterVal = filterVal.toLowerCase();

        if(filterVal == 'all') {
            $('tr.hidden').fadeIn('slow').removeClass('hidden');
                            $('tr.hide').fadeIn('slow').removeClass('hide');
                        $('#searchFilterID').val('');
        } else {

            $('tr.fellows').each(function() {
                if(!$(this).hasClass(filterVal)) {
                    $(this).fadeOut('normal').addClass('hidden');
                } else {
                    $(this).fadeIn('slow').removeClass('hidden');
                }
            });
        }

        return false;
    });
});
  

Мой вопрос: как я могу заставить их функционировать вместе? Сейчас я не понимаю, почему они этого не делают. Мне нужно иметь возможность фильтровать список одним фильтром, а затем дополнительно фильтровать его вторым фильтром. Например, я мог бы захотеть использовать выпадающее меню, чтобы выбрать только стипендии «Центр общественного лидерства Эмиратской инициативы лидерства», а затем дополнительно уточнить свой поиск, введя слово «conf», чтобы сузить длинный список до только Тарига Хилала, у которого в основных областях есть слово «Конфликт». Однако прямо сейчас, когда я начинаю сужать поле поиска, фильтрация, выполняемая выпадающим фильтром, больше не влияет на список.

Думаю, я понимаю, почему это не работает, но у меня нет никаких идей о том, как изменить мою логику, чтобы заставить их работать вместе. Я хотел бы получить несколько предложений! Спасибо.

Редактировать: Я вроде как заставил это работать, удалив функции «else» из обоих фильтров и удалив классы «hide» при первоначальном вызове каждого фильтра. Это работает, но очень «размытым» способом — это немного странно. Должен быть способ получше. Я определенно оценил бы любые предложения.

 $(document).ready(function() {
$('ul#filter a').click(function() {
    $('tr.hidden').fadeIn('slow').removeClass('hidden');
    $(this).css('outline','none');
    $('ul#filter.current').removeClass('current');
    $(this).parent().addClass('current');

    //var filterVal = $(this).text().toLowerCase().replace(' ','-');

    var filterVal = $(this).text();
    filterVal = filterVal.replace(/ /g, '-');
    filterVal = filterVal.toLowerCase();

    if(filterVal == 'all') {
        $('tr.hidden').fadeIn('slow').removeClass('hidden');
                    $('tr.hide').fadeIn('slow').removeClass('hide');
                    $('#searchFilterID').val('');
    } else {

        $('tr.fellows').each(function() {
            if(!$(this).hasClass(filterVal)) {
                $(this).fadeOut('normal').addClass('hidden');
            } else {
            }
        });
    }

    return false;
});
});
  

и

 $(document).ready(function() {
       $('input[name=searchFilterInput]').keyup(function() { 
    var searchFilterVal = $('input[name=searchFilterInput]').val();
    searchFilterVal = searchFilterVal.replace(/ /g, '-');
    searchFilterVal = searchFilterVal.toLowerCase();
    $('tr.hide').fadeIn('slow').removeClass('hide');

    if(searchFilterVal == '') {
        $('tr.hide').fadeIn('slow').removeClass('hide');
    } else {

        $('tr.fellows').each(function() {
        var pattern = $(this).attr('class');    // the pattern to be matched 
        var match = pattern.match(searchFilterVal);//If pattern matches it returns the match

        if(!match) {
                $(this).fadeOut('normal').addClass('hide');

            } else {
            }
        });
    }
   });
});
  

Ответ №1:

Попросите один из методов фильтрации вызвать другой фильтр, предоставив необходимые параметры.

Комментарии:

1. Звучит многообещающе, но я не уверен, как бы я это сделал. Я только что заставил это работать, удалив else из каждого фильтра. Но тогда пользователь должен выполнить сброс после каждого поиска. Но это шаг в правильном направлении.

2. То, что вы упомянули, уже работает, я проверил, проверьте это еще раз.

3. Я отредактировал свой первоначальный вопрос, включив в него то, что я сделал, чтобы заставить фильтры работать вместе, но поскольку я очищаю фильтр при каждом нажатии клавиши, возникает некоторое мигание и небольшая задержка, если вы вводите много символов в поле поиска. Это заставляет меня задуматься, нет ли более элегантного решения, чем то, что я собрал до сих пор. Но я отмечу вопрос как ответ, поскольку он, по крайней мере, работает.