Hướng dẫn tạo Filter table với Javascript

DEMO

Filter table cũng giống với Filter list, chúng sẽ cho phép người dùng lọc lại các kết quả mà họ muốn lấy từ một danh sách dữ liệu. Tuy nhiên khác với Filter list, Filter table sẽ hiển thị các dữ liệu đó dưới dạng một bảng thay vì một giá trị đơn giản.

Trong bài này mình sẽ cùng các bạn tạo ra một Filter table đơn giản nhé. Let's do it!

1. Xây dựng giao diện

Việc đầu tiên là chúng ta cần tạo ra các thành phần trong ứng dụng, chúng đóng vai trò như nền móng của các ứng dụng. Các bạn tạo file index.html và đặt đoạn code sau vào trong thẻ body:

Code RUN
<div class="container">
  <h2>Freetuts.net hướng dẫn tạo Filter Table</h2>

  <input type="text" id="myInput" placeholder="Search for Club.." title="Type in a name of Club">

  <table id="myTable">
    <tr class="header">
      <th style="width:60%;">Club</th>
      <th style="width:40%;">Country</th>
    </tr>
    <tr>
      <td>Arsenal</td>
      <td>England</td>
    </tr>
    <tr>
      <td>Atletico Madrid</td>
      <td>Spain</td>
    </tr>
    <tr>
      <td>Barcelona</td>
      <td>Spain</td>
    </tr>
    <tr>
      <td>Liverpool</td>
      <td>England</td>
    </tr>
    <tr>
      <td>Real Madrid</td>
      <td>Spain</td>
    </tr>
    <tr>
      <td>Bayern Munich</td>
      <td>Germany</td>
    </tr>
    <tr>
      <td>Borussia Dortmund</td>
      <td>Germany</td>
    </tr>
    <tr>
      <td>Paris Saint-Germain</td>
      <td>France</td>
    </tr>
    <tr>
      <td>Manchester United</td>
      <td>England</td>
    </tr>
    <tr>
      <td>Monaco</td>
      <td>France</td>
    </tr>
  </table>
</div>

Trong phần này, mình tạo ra hai thành phần chính của một filter table, đó là một ô input để nhập giá trị tìm kiếm và một phần bảng(table) để hiện thị các kết quả tìm được dựa vào giá trị nhập ở ô input. Mình cũng đặt tất cả các thành phần trong thẻ div có class="container" để dễ dạng định dạng cho toàn bộ các thành phần.

OK vậy là xong phần giao diện, chúng ta đến bước tiếp theo nhé.

2. Thêm CSS để định dạng các thành phần

Trong bước này chúng ta sẽ sử dụng CSS để định dạng cho các thành phần của trang, các bạn dán đoạn mã sau vào bên trong thẻ style:

Code RUN
* {
  box-sizing: border-box;
}
.container {
  width: 500px;
  margin: auto;
}

#myInput {
  background-position: 10px 12px;
  background-repeat: no-repeat;
  width: 100%;
  font-size: 16px;
  padding: 15px;
  border: 1px solid #ddd;
  margin-bottom: 12px;
}

#myTable {
  display: none;
  border-collapse: collapse;
  width: 100%;
  border: 1px solid #ddd;
  font-size: 18px;
}

#myTable th, #myTable td {
  text-align: left;
  padding: 12px;
}

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

#myTable tr.header, #myTable tr:hover {
  background-color: #f1f1f1;
}

Tất cả đều là các thuộc tính cơ bản trong CSS nên mình không giải thích nữa, các bạn chỉ cần lưu ý một điểm là chúng ta sẽ mặc định ẩn phần bảng chứa kết quả đi với thuộc tính display: none;, sau khi người dùng tiến hành filter thì ta mới hiển thị các phần tử phù hợp. Nếu các bạn muốn hiển thị tất cá các kết quả ngay khi load xong trang thì bỏ dòng này đi nhé.

3. Thêm xử lý Javascript

Trong bước cuối cùng này, chúng ta sẽ sử dụng javascript để tìm kiếm các kết quả dựa vào giá trị người dùng nhập vào và hiển thị các kết quả phù hợp, các bạn thêm giúp mình đoạn mã script này vào sau thẻ body:

Code RUN
<script>
  // lấy thẻ input
  var input = document.getElementById("myInput");
  // định nghĩa hàm xử lý myFunction
  function myFunction() {
    var filter, table, tr, td, i;
    // lấy giá trị người dùng nhập
    filter = input.value.toUpperCase();

    // lấy phần bảng hiển thị kết quả
    table = document.getElementById("myTable");
    // lấy tất cả các thẻ tr
    tr = table.getElementsByTagName("tr");

    //Nếu filter không có giá trị ẩn các kết quả
    if (!filter) {
      table.style.display = "none";
    }else{
      // lặp qua tất cả các thẻ tr
      for (i = 0; i < tr.length; i++) {
        // lấy giá trị của thẻ td đầu tiên đại diện cho tên club
        td = tr[i].getElementsByTagName("td")[0];
        if (td) {
          // kiểm tra giá trị filter có tồn tại trong thẻ tr không
          if (td.innerHTML.toUpperCase().indexOf(filter) > -1) {
            //nếu có hiển thị chúng
            table.style.display = "table";
            tr[i].style.display = "";
          } else {
            // nếu không ẩn chúng
            tr[i].style.display = "none";
          }
        }       
      }
    }
  }
  //gán sự kiện cho thẻ input
  input.addEventListener("keyup", myFunction);
</script>

Mình đã giải thích rất cụ thể, các bạn đọc ghi chú để hiểu rõ về các bước hoạt động của đoạn mã script này nhé. Có một điểm cần lưu ý là mình đều sử dụng phương thức toUpperCase() cho cả giá trị fillter và giá trị bên trong thẻ td chứa tên club(cái mà chúng ta sẽ so sánh) khi kiểm tra để chúng cùng là chữ in hoa, vậy nên filter table của chúng ta sẽ không biệt chữ hoa chữ thường.

Giờ chạy file index.html để xem thành quả nhé!

4. Lời kết

Như vậy, qua bài viết này mình đã cùng các bạn xây dựng thành công một Filter table đơn giản, hi vọng rằng nó sẽ giúp đỡ các bạn phần nào trong quá trình xây dựng website của mình. Nếu các bạn muốn tạo một filter list với các kết quả là các giá trị đơn giản, hãy tham khảo qua bài viết Filter List.

Nếu có bất cứ thắc mắc nào các bạn có thể để lại trong phần bình luận, hẹn gặp lại trong các bài viết tiếp theo trên freetuts.net.

Tham khảo: w3schools.com

Nguồn: freetuts.net

KHÓA HỌC ĐANG GIẢM GIÁ

FEDU - 30 – HTML CSS cơ bản

(Giảng viên: Nguyễn Đức Việt)

XEM
FEDU - 25 – Thiết kế hiệu ứng bằng Javascript và illustrator

(Giảng viên: NGUYỄN ĐỨC VIỆT )

XEM
FEDU - 03: Thành thạo lập trình jquery qua 20 bài tập thực hành

(Giảng viên: Nguyễn Đức Việt)

XEM
FEDU - 22 – Học tất tần tật về Javascript từ đầu

(Giảng viên: Nguyễn Đức Việt)

XEM
FEDU - 19: Học lập trình Back-end PHP/MySql/Jquery nâng cao

(Giảng viên: Nguyễn Đức Việt)

XEM