Hướng dẫn tạo filter list với Javascript

DEMO

Filter list là một danh sách các kết quả tìm kiếm có thể được lọc lại mỗi khi người dùng nhập vào một kí tự. Chúng ta thường gặp một filter list trong ô tìm kiếm của các website bán hàng hoặc tin tức. Trong bài này mình sẽ hướng dẫn các bạn tạo một filter list đơn giản với Javascript.

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

Việc đầu tiên là chúng ta cần tạo file chạy chính, các bạn tạo file index.html và tạo các thành phần của filter list bằng đoạn mã sau:

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

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

  <ul id="myUL">
    <li><a href="#">Athens</a></li>
    <li><a href="#">Amsterdam</a></li>
    <li><a href="#">Atlanta</a></li>
    <li><a href="#">Alaska</a></li>
    <li><a href="#">Barcelona</a></li>
    <li><a href="#">Bologna</a></li>
    <li><a href="#">Berlin</a></li>
    <li><a href="#">Bordeaux</a></li>
    <li><a href="#">Copenhagen</a></li>
    <li><a href="#">Cardiff</a></li>
    <li><a href="#">Caen</a></li>
    <li><a href="#">Cannes</a></li>
  </ul>
</div>

Trong phần này, mình tạo ra hai thành phần chính của một filter list, đó là một ô input để nhập giá trị tìm kiếm và một phần ul để hiện thị các kết quả tìm được dựa vào giá trị nhập ở ô input và 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;
}

#myUL {
  list-style-type: none;
  display: none;
  padding: 0;
  margin: 0;
}

#myUL li a {
  border: 1px solid #ddd;
  margin-top: -1px; 
  background-color: #f6f6f6;
  padding: 12px;
  text-decoration: none;
  font-size: 18px;
  color: black;
  display: block
}

#myUL li a.header {
  background-color: #e2e2e2;
  cursor: default;
}

#myUL li a:hover:not(.header) {
  background-color: #eee;
}

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 ul 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, ul, li, a, i;
      // lấy giá trị người dùng nhập
      filter = input.value.toUpperCase();
      ul = document.getElementById("myUL");
      li = ul.getElementsByTagName("li");
      // Nếu filter không có giá trị thị ẩn phần kết quare\
      if (!filter) {
        ul.style.display = "none";
      }else{
        // lặp qua tất cả các thẻ li chứa kết quả
        for (i = 0; i < li.length; i++) {
            // lấy thẻ a trong các thẻ li
            a = li[i].getElementsByTagName("a")[0];
            // kiểm tra giá trị nhập có tôn tại trong nội dung thẻ a
            if (a.innerHTML.toUpperCase().indexOf(filter) > -1) {
              //nếu có hiển thị phàn tử ul và các thẻ li đó
                ul.style.display = "block";
                li[i].style.display = "";
            } else {
              // nếu không ẩn các thẻ li
                li[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ẻ a khi kiểm tra để chúng cùng là chữ in hoa, vậy nên filter list 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 list đơ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ó 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