Отфильтровать таблицу из ввода ‹select› с помощью jQuery

Я пытаюсь отфильтровать таблицу из алфавитного ввода <select> с помощью jQuery.

У меня есть имя и фамилия в двух столбцах таблицы, и я хотел бы отфильтровать строки по любому из них.

У меня есть выбор ввода, настроенный так:

<select>
    <option value="A">A</option>
    <option value="B">B</option>
    <option value="C">C</option>
    ...
</select>

и я хотел бы отфильтровать эту таблицу:

<tr>
    <td>Joe</td>
    <td>Schmoe</td>
    <td>$2482.79</td>
    <td>172.78.200.124</td>
    <td>http://gmail.com</td>
</tr>
<tr>
    <td>John</td>
    <td>Doe</td>
    <td>$2776.09</td>
    <td>119.232.182.142</td>
    <td>http://www.example.com</td>
</tr>

Как мне фильтровать таблицу с помощью jQuery?


person peehskcalba    schedule 08.07.2009    source источник


Ответы (5)


Это будет работать, если у вас есть только один выбор и одна таблица, структурированная, как ваш пример.

$(document).ready(function($) {
    var rows = $('table tr').each(function() {
        var row = $(this);
        var columns = row.children('td');

        row.data('name-chars', [
            columns.eq(0).html()[0].toUpperCase(),
            columns.eq(1).html()[0].toUpperCase(),
        ]);
    });

    $('select').change(function() {
        var char = $(this).val().toUpperCase();

        rows.each(function() {
            var row = $(this);
            var chars_to_match = row.data('name-chars');
            if($.inArray(char, chars_to_match) > -1) {
                row.show();
            }
            else {
                row.hide();
            }
        });
    });
});
person howardr    schedule 08.07.2009
comment
Превосходно! Теперь, как я могу включить <option>, чтобы показать все строки? - person peehskcalba; 09.07.2009
comment
Добавьте первый параметр как «Все» и в функции изменения, если значение равно «Все», выполните $('table tr').show(), и все готово. - person SolutionYogi; 09.07.2009
comment
Почему вы сохраняете первые два символа, используя метод «данные» для каждой строки? Если вы собираетесь перебирать все строки, вы можете также получить эти первые два символа по запросу. - person SolutionYogi; 09.07.2009
comment
классная функция, использовал ее для своих скриптов! - person Gordon; 14.01.2011

Я придумал это. Очень похоже на то, что придумал Эльзо, но ограничивает его первыми двумя столбцами таблицы.

 $('select').change( function(e) { 
   var letter = $(this).val();
     if (letter === 'ALL') {
         $ ('tr').show ();
     }
     else {
         $('tr').each( function(rowIdx,tr) {
             $(this).hide().find('td').each( function(idx, td) {
                 if( idx === 0 || idx === 1) {
                     var check = $(this).text();
                     if (check && check.indexOf(letter) == 0) {
                         $(tr).show();
                     }
                 }
             });             

         });
     }             
 });

Он не игнорирует регистр и предполагает, что у вас есть один выбор, и единственные tr на странице — это те, которые вы хотите отфильтровать.

ИЗМЕНИТЬ Добавлен параметр "ВСЕ" для повторного отображения строк.

person seth    schedule 08.07.2009

Если идентификатор вашей таблицы sel, а таблица — tab, это сработает. Измените eq(0), чтобы изменить столбец для поиска. Пустое значение в поле выбора приведет к повторному отображению всех trs.

var selSelection = $("#sel").val();
if(!selSelection) $("#tab tr").show();
else $("#tab tr").show().filter(function(index){
    return $("td:eq(0)", this).html().indexOf(selSelection) == -1;
}).hide();
person AKX    schedule 08.07.2009

$("td:not(:contains('" + input_value + "'))").remove();

Это чувствительно к регистру ... что конкретно вы пытаетесь фильтровать?

person webwires    schedule 08.07.2009

Попробуй это. При необходимости замените y на $(y).

$('tr').hide();
$('select').change( function(){
    var letter = $(this).val();
    var dataset = $('#tableID').find('td');
    $.each(dataset, function(x, y){
        if( y.substr(0,1) == letter){
            y.parent().show();
        }
    });
});

Изменить

@SolutionYogi. Ты прав. Думаю, эту строку можно переписать так:

var dataset = $('#tableID').find('tr').children('td').slice(0,1);

Хотя никогда этого не пробовал.

ИЗМЕНИТЬ 2

Я проверил это. Я надеюсь, что это достаточно элегантно, и у меня не будет больше ошибок.

$('tr').hide();
$('select').change( function(){
    var letter = $(this).val();
    var dataset = $('#tableID').find('tr');
        $.each(dataset, function(x, y){
            var data = $(y).children().slice(0,2);
                $.each(data, function(a, b){
                    if( $(b).html().substr(0,2) == letter){
                        $(b).parent().show();
                    }
             });
       });
});
person Elzo Valugi    schedule 08.07.2009
comment
Ваш код ищет все столбцы, тогда как автор хочет искать только первые два столбца. - person SolutionYogi; 08.07.2009
comment
Разве этот код не будет искать только первые две ячейки первой строки? - person SolutionYogi; 09.07.2009
comment
Вы снова правы. Я попытаюсь найти другое решение, чтобы вы не анализировали весь набор td. - person Elzo Valugi; 09.07.2009
comment
Автор хочет найти первые две буквы, где вы соответствуете только одному символу. - person SolutionYogi; 09.07.2009
comment
Я изменил на substr (0,2). Этот код больше похож на концепцию решения проблемы, чем на написание кода для людей. Люди должны иметь возможность изменять, понимать и адаптировать код, который мы представляем здесь, иначе результат будет бесполезен. Истинный? - person Elzo Valugi; 09.07.2009