Alexanderverd
@Alexanderverd
Человек разных интересов

Как настроить JAVASCRIPT фильтр таблиц?

В ходе разработки сайта была поставлена задача создать таблички с функцией фильтрации. Сам начинающий, поэтому нашел готовое решение, но столкнулся с тем, что не понимаю как размножить нужный мне фильтр и удалить мне не нужные.
Ниже разметка таблицы:
<table>
    <thead>
    <tr>
        <th>Символы</th>
        <th>Текст</th>
        <th>Цифры</th>
        <th>Цифры</th>
        <th>Текст</th>
    </tr>
    <tr>
        <td>
            <input type="checkbox" id="charA" value="A" />A
            <input type="checkbox" id="charB" value="B" />B
            <input type="checkbox" id="charC" value="C" />C
        </td>
        <td>
            <input id="text" />
        </td>
        <td>
            <select id="digits">
                <option value="">---</option>
                <option value="1">1</option>
                <option value="2">2</option>
                <option value="3">3</option>
            </select>
        </td>
        <td>
            <input type="radio" name="digit" id="radioZ" value="" checked="true" />-
            <input type="radio" name="digit" id="radioA" value="1" />1
            <input type="radio" name="digit" id="radioB" value="2" />2
            <input type="radio" name="digit" id="radioC" value="3" />3
        </td>
        <td>
            <input id="regexp" />
        </td>
    </tr>
    </thead>
    <tbody id="target">
    <tr>
        <td>B</td><td>Арбуз</td><td>2</td><td>3</td><td>Фанат</td>
    </tr>
    <tr>
        <td>B</td><td>Стрелок</td><td>1</td><td>2</td><td>Арба</td>
    </tr>
    <tr>
        <td>C</td><td>Фанат</td><td>3</td><td>1</td><td>Стрелок</td>
    </tr>
    <tr>
        <td>C</td><td>Стрелок</td><td>2</td><td>1</td><td>Фантомас</td>
    </tr>
    <tr>
        <td>B</td><td>Стрелок</td><td>1</td><td>2</td><td>Арбуз</td>
    </tr>
    <tr>
        <td>C</td><td>Фанат</td><td>3</td><td>3</td><td>Стрелок</td>
    </tr>
    <tr>
        <td>A</td><td>Арбуз</td><td>2</td><td>2</td><td>Арбуз</td>
    </tr>
    <tr>
        <td>A</td><td>Фанат</td><td>1</td><td>1</td><td>Стрелочник</td>
    </tr>
    <tr>
        <td>C</td><td>Фанат</td><td>3</td><td>3</td><td>Арбуз</td>
    </tr>
    <tr>
        <td>B</td><td>Фанат</td><td>2</td><td>3</td><td>Фантик</td>
    </tr>
    <tr>
        <td>C</td><td>Стрелок</td><td>1</td><td>1</td><td>Арбуз</td>
    </tr>
    <tr>
        <td>C</td><td>Фанат</td><td>3</td><td>2</td><td>Стрелка</td>
    </tr>
    </tbody>
</table>

Так подключаются фильтры в найденном решении:
filterTable( document.getElementById("target"), {
            /* Фильтр для первого столбца чекбоксы: */
            0: new filterTable.Filter([ /* Элементы фильтра */
                    document.getElementById("charA"),
                    document.getElementById("charB"),
                    document.getElementById("charC")
                ],
                /* Коллбэк ф-ция валидации */
                function (value, filters, i) {
                    /* Если чекбокс не отмечен - его значение не учавствует
                       в валидации поэтому мы обязаны вернуть true */
                    if (false === filters[i].checked) return true;
                    /* Далее, при проверке, мы должны одновременно проверять
                       значения всех элементов набора при условии чекбокс
                       отмечен */
                    return filters[0].checked && filters[0].value === value ||
                            filters[1].checked && filters[1].value === value ||
                            filters[2].checked && filters[2].value === value;
                }
            ),

            /* Фильтр для второго столбца текстовое поле - только точное совпадение: */
            1: document.getElementById("text"),

            /* Фильтр для третьего столбца выпадающий список: */
            2: document.getElementById("digits"),

            /* Фильтр для четвертого столбца радио кнопки: */
            3: new filterTable.Filter([/* Элеменеты фильтра */
                    document.getElementById("radioZ"),
                    document.getElementById("radioA"),
                    document.getElementById("radioB"),
                    document.getElementById("radioC")
                ],
                /* Коллбэк ф-ция валидации */
                function (value, filters, i) {
                    /* В filters[0] - у нас радио кнопка "Не выбрано", если она
                       установлена фильтр не участвует в валидации и мы
                       обязаны вернуть true */
                    if (true === filters[0].checked) return true;
                    /* Если какая то радиокнопка отмечена и содержимое проверяемой
                      ячейки совпало то вернем true */
                    return filters[1].checked && filters[1].value === value ||
                           filters[2].checked && filters[2].value === value ||
                           filters[3].checked && filters[3].value === value;
                }
            ),

            /* Фильтр для пятого столбца Постепенный ввод слова: */
            4: new filterTable.Filter(document.getElementById("regexp"),
                /* Коллбэк ф-ция валидации */
                function (value, filters, i) {
                    return value.indexOf(filters[i].value) === 0;
                },
                /* Будем вызывать валидацию по событию onkeyup фильтра */
                "onkeyup"
            )
        }
    );

Сам скрипт:
var filterTable=function(b,c){var d=b.getElementsByTagName("TR"),e={},a;for(a in c)c.hasOwnProperty(a)&&(e[a]=c[a]instanceof filterTable.Filter?c[a]:new filterTable.Filter(c[a]),e[a]._setAction("onchange",function(){var a,c,b;for(c=0;c<d.length;c+=1)for(b in a=d.item(c),e)if(e.hasOwnProperty(b))if(!1===e[b].validate(a.children[b].innerText)){a.style.display="none";break}else a.style.display=""}))};filterTable.Filter=function(b,c,d){if(!(this instanceof arguments.callee))return new arguments.callee(b,c,d);this.filters="[object Array]"=={}.toString.call(b)?b:[b];this.validate=function(c){for(var a=0;a<this.filters.length;a+=1)if(!1===this.__validate(c,this.filters[a],a))return!1};this.__validate=function(b,a,f){if("undefined"!==typeof c)return c(b,this.filters,f);a.value=a.value.replace(/^\s+jQuery/g,"");return!a.value||a.value==b};this._setAction=function(c,a){for(var b=0;b<this.filters.length;b+=1)this.filters[b][d||c]=a}};

Задача продублировать фильтр "digits" для всех столбцов кроме первого. Ниже разметка уже моей таблицы.
<table class="gooog">
        <thead>
<tr class="head2">
        <th>Название</th>
        <th>Длина, мм</th>
		<th>Ширина, мм</th>
		<th>Высота, мм</th>
		<th>Масса, тн</th>
    </tr>
   <tr class="head3">
        <td>
           <input id="text" />
        </td>
        <td class="head3">
            <select id="digits">
                <option value="">Все</option>
				<option value="6000">6000</option>
</select>                                                                                                 
        </td>
        <td class="head3">
            <select id="digits">
                <option value="">Все</option>
				<option value="2000">2000</option>
            </select>                                                          
        </td> 
		<td class="head3">
            <select id="digits">
                <option value="">Все</option>
               	<option value="140">140</option>
				<option value="180">180</option>
            </select>                                                        
        </td> 
        <td class="head3">
             <select id="digits">
                <option value="">Все</option>                
				<option value="4,2">4,2</option>
				<option value="5.4">5.4</option>
            </select>                                    	        	                                                                                       
        </td
    </tr>
    </thead>
    <tbody id="target">
<tr class="head" onclick="location.href=''">
<td>ПДН 6*2</td>
<td>6000</td>
<td>2000</td>
<td>140</td>
<td>4.2</td>
</tr>
<tr class="head" onclick="location.href=''">
<td>ПАГ-14</td>
<td>6000</td>
<td>2000</td>
<td>140</td>
<td>4.2</td>
</tr>
<tr class="head" onclick="location.href=''">
<td>ПАГ-18</td>
<td>6000</td>
<td>2000</td>
<td>180</td>
<td>5.4</td>
</tr>
</tbody>
</table>
  • Вопрос задан
  • 1522 просмотра
Пригласить эксперта
Ответы на вопрос 1
@dohera
Фронтенд разработчик
Начни с sorex на youtube. Раз 5 JavaScript посмотри. Потом переходи на литературу 'Выразительный JavaScript'. . Потом learn.JavaScript.ru. и все чательно втерать по часику(или три, но не больше) в день. Понимание придет. Сам такой же.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы