Таблица фильтрации от <select>ввода с использованием jQuery - PullRequest
5 голосов
/ 08 июля 2009

Я пытаюсь отфильтровать таблицу из алфавитного <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?

Ответы [ 5 ]

6 голосов
/ 08 июля 2009

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

$(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();
            }
        });
    });
});
2 голосов
/ 08 июля 2009

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

 $('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 на странице - это те, которые вы хотите отфильтровать.

РЕДАКТИРОВАТЬ Добавлена ​​опция 'ВСЕ', чтобы снова показывать строки.

0 голосов
/ 08 июля 2009

$ ("td: not (: содержит ('" + input_value + "'))"). Remove ();

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

0 голосов
/ 08 июля 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();
0 голосов
/ 08 июля 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();
                    }
             });
       });
});
...