728x90

화면에 출력되는 Table 데이터를 Filtering 하여 보여주는 jQuery 코드 예제다.

화면에 이미 출력된 데이터 중에서 Filtering 한다고 보면 된다.


테스트에 사용한 코드는

jQuery_TableFiltering-01.php


테이블 필터링 예제는 https://www.jqueryscript.net/demo/jQuery-Plugin-To-Filter-Rows-Of-An-Html-Table-Table-Filtering/ 등 검색하면 많이 나온다.



위와 같은 테이블에서 검색어를 입력하면 해당 검색어를 포함하는 리스트만 출력하는 jQuery 에 대해 정리해둔다.


 $(document).ready(function() {
    $("#mykeyword").on("keyup", function() {
        var value = $(this).val().toLowerCase();
        $("#myTable_tbody tr").filter(function() {
            $(this).toggle($(this).text().toLowerCase().indexOf(value) > -1)
        });
    });
});


위 jQuery 코드는 테이블내에 일치하는 모든 결과를 출력한다. (번호열 검색 제외)

단, 한글을 검색하는 경우에는 즉각적으로 표시되지 않으므로 입력한 엔터키를 한번 눌러야 한다.

- keyup 이벤트는 키보드의 키를 눌렀다 뗄 때 요소에 이벤트를 발생시킨다.

- $("#mykeyword").on("keyup", function() {} 또는 $("#mykeyword").keyup(function() {} 으로 해도 된다.

- toLowerCase() : 문자열에서 영문 대문자를 모두 소문자로 바꾼다.

- indexOf("찾을 문자") : 문자열에서 왼쪽부터 찾을 문자와 일치하는 문자를 찾아 최초로 일치하는 문자의 인덱스 번호를 반환한다. 만일 찾는 문자가 없다면 -1 을 반환한다.


 $(document).ready(function() {
    $("#mykeyword").on("keyup", function() {
        var value = $(this).val().toLowerCase();
        $("#myTable > tbody > tr").hide();
        var temp = $("#myTable > tbody > tr > td:nth-child(5n+4):contains('" + value + "')");
        $(temp).parent().show();
    });
});


Using a formula (an + b) : a 는 테이블의 칼럼 갯수라고 보면 된다. b 는 1부터 시작한다.

td:nth-child(5n+4) : 칼럼 갯수가 5개인 테이블에서 4번째 즉 학과에 대한 검색결과를 출력한다.

5n + 1 로 변경하고 검색(Filtering)하면 번호열 검색결과를 반환한다.


CSS 에

#myTable > tbody > tr td:nth-child(5n-1) {
    align: right;
    text-align: right;
}

를 추가해보면 테이블 정렬이 어떻게 되는지 확인할 수 있다.

-1 은 오른쪽부터 0, -1, -2 라고 보면 된다.

5n 대신에 2n, 3n, 4n 등으로 숫자를 변경해보면 어떻게 변하는지 확인할 수 있다.


첨부파일 코드 내용

<!DOCTYPE html>
<html>
<head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<script>
$(document).ready(function() {
    $("#mykeyword").keyup(function() {
        var value = $(this).val().toLowerCase();
        $("#myTable_tbody tr").filter(function() {
            $(this).toggle($(this).text().toLowerCase().indexOf(value) > -1)
        });
        // $("#myTable > tbody > tr").hide();
        // var temp = $("#myTable > tbody > tr > td:nth-child(5n+4):contains('" + value + "')");
        // $(temp).parent().show();
    });
});
</script>
<style>
#container {width: 900px; margin: 0 auto;}
#myTable {
    font-family: arial, sans-serif;
    border-collapse: collapse;
    width: 100%;
    border: 1px solid #ddd;
}

#myTable td, th {
    border: 1px solid #dddddd;
    text-align: center;
    padding: 8px;
}

#myTable tr {border-bottom: 1px solid #ddd;}

#myTable tr:nth-child(even) {
    background-color: #f1f1f1;
}

#myTable > tbody > tr td:nth-child(5n) {
    align: right;
    text-align: right;
}

#myTable > thead > tr { background-color: #ddee33; color:#000fff; }
#myTable > tbody > tr:hover { background-color: #d1f1f1; }
</style>
</head>
<body>
<div id="container">
    <h2>Filterable Table</h2>
    <input type="text" id="mykeyword" placeholder="검색어를 입력하세요">
    <br>
    <br>
    <table id='myTable'>
        <thead>
            <tr>
                <th>번호</th>
                <th>이름</th>
                <th>생년월일</th>
                <th>학과</th>
                <th>학번</th>
            </tr>
        </thead>
    
        <tbody id="myTable_tbody">
            <tr>
                <td>1</td>
                <td>박진희</td>
                <td>1991.09.07</td>
                <td>경영정보학과</td>
                <td>2014290031</td>
            </tr>
            <tr>
                <td>2</td>
                <td>김보연</td>
                <td>1991.07.07</td>
                <td>경영학과</td>
                <td>2016290032</td>
            </tr>
            <tr>
                <td>3</td>
                <td>하석진</td>
                <td>1991.05.15</td>
                <td>사회학과</td>
                <td>2017290033</td>
            </tr>
            <tr>
                <td>4</td>
                <td>유희열</td>
                <td>1991.08.07</td>
                <td>건축학과</td>
                <td>2011290038</td>
            </tr>
            <tr>
                <td>5</td>
                <td>송승헌</td>
                <td>1989.04.07</td>
                <td>물리학과</td>
                <td>2011290039</td>
            </tr>
            <tr>
                <td>6</td>
                <td>김태희</td>
                <td>1988.02.07</td>
                <td>의류학과</td>
                <td>2010290040</td>
            </tr>
            <tr>
                <td>7</td>
                <td>정지훈</td>
                <td>1988.07.25</td>
                <td>식품학과</td>
                <td>2012290042</td>
            </tr>
            <tr>
                <td>8</td>
                <td>박진영</td>
                <td>1981.02.07</td>
                <td>영어영문학과</td>
                <td>2015290031</td>
            </tr>
            <tr>
                <td>9</td>
                <td>양현석</td>
                <td>1993.09.07</td>
                <td>역사학과</td>
                <td>2017290055</td>
            </tr>
            <tr>
                <td>10</td>
                <td>유재석</td>
                <td>1995.09.07</td>
                <td>경영정보학과</td>
                <td>2013290056</td>
            </tr>
            <tr>
                <td>11</td>
                <td>고아라</td>
                <td>1993.09.07</td>
                <td>역사학과</td>
                <td>2017290060</td>
            </tr>
        </tbody>
    </table>
    <p>테이블 헤더 검색을 방지하기 위해 tbody 내에서 검색 시작</p>
</div>
</body>
</html>


블로그 이미지

Link2Me

,