Lọc sản phẩm với Javascript là bài hướng dẫn lọc sản phẩm theo thương hiệu, giá, màn hình… – tính năng rất thường thấy trên các website bán điện thoại, laptop, đồ công nghệ…
Bài viết dành cho các bạn mới học javascript, không khó và chúng ta sẽ code hoàn toàn bằng javascript thuần.
Tham khảo mẫu : //www.nguyenkim.com/dien-thoai-di-dong/
- Sử dụng các hàm getElementsByClass , tag label
- 2 cách đưa dữ liệu ra trang web: tay, js
- Sử dụng for, if
- Hiện sản phẩm theo nhiều cột với css display grid
1. Tạo trang web điện thoại và định dạng
Code html
Xiaomi Redmi 9A 2GB/32GB Xanh dương
2.290.000 VNĐ
Samsung Galaxy A52 4G 8GB/128GB Xanh
8.290.000 VNĐ
Samsung Galaxy A32 4G 6GB/128GB Xanh
5.990.000 VNĐ
Xiaomi Redmi 9C 3GB/64GB Xám
2.990.000 VNĐ
OPPO A55 4GB/64GB Xanh
4.550.000 VNĐ
iPhone 11 64GB Trắng
11.990.000 VNĐ
iPhone 13 Pro 128GB Vàng Đồng
27.990.000 VNĐ
iPhone 11 64GB Tím
11.990.000
Vivo Y15s 3GB/32GB Xanh Đen
3.190.000 VNĐ
Vivo Y72 5G 8GB/128GB Đen
6.890.000 VNĐ
Vivo V23e 8GB/128GB Đen
7.390.000 VNĐ
Samsung Galaxy S21 Ultra 5G 12GB/128GB Bạc
24.990.000 VNĐ
Samsung Galaxy A13 4GB/128GB Đen
4.290.000 VNĐ
Samsung S21 FE 5G 8GB/128GB Tím
14.490.000 VNĐ
Samsung Galaxy S20 FE 8GB/256GB Xanh
10.990.000 VNĐ
Định dạng CSS
#list1 {
display: grid;
grid-template-columns: 33.3% 33.3% 33.3% ;
}
#list1 > .dt {
text-align: center; border: 2px solid darkcyan; margin: 10px;
}
#list1 > .dt >img {
max-width: 90%; height: 200px; margin-top: 10px;
}
2. Hiện menu thương hiệu, giá màn hình
Code html:
Thương hiệu
Apple
Oppo
Samsung
Xiaomi
Vivo
Giá bán
Dưới 5 triệu
Từ 5 đến 10 triệu
Từ 10 đến 15 triệu
Trên 15 triệu
Màn hình
Dưới 5 inch
Từ 5 inch trở lên
Định dạng CSS
#accordion>.cap {
background: lightseagreen; padding: 8px 10px;
font-weight: bold; text-transform: uppercase;
cursor: pointer; color: white;font-size: 18px;
}
#accordion > .ct > label {
margin: 8px 0 8px 30px;
font-size: 18px;
display: block;
cursor: pointer;
}
#accordion > .ct input { width: 16px; height: 16px; margin-right: 10px;}
Kết quả:
Nhập dữ liệu [điện thoại ] và định dạng
Code html trong tag cotphai
Xiaomi Redmi 9A 2GB/32GB Xanh dương
2.290.000 VNĐ
Samsung Galaxy A52 4G 8GB/128GB Xanh
8.290.000 VNĐ
Samsung Galaxy A32 4G 6GB/128GB Xanh
5.990.000 VNĐ
Xiaomi Redmi 9C 3GB/64GB Xám
2.990.000 VNĐ
OPPO A55 4GB/64GB Xanh
4.550.000 VNĐ
iPhone 11 64GB Trắng
11.990.000 VNĐ
iPhone 13 Pro 128GB Vàng Đồng
27.990.000 VNĐ
iPhone 11 64GB Tím
11.990.000
Vivo Y15s 3GB/32GB Xanh Đen
3.190.000 VNĐ
Vivo Y72 5G 8GB/128GB Đen
6.890.000 VNĐ
Vivo V23e 8GB/128GB Đen
7.390.000 VNĐ
Samsung Galaxy S21 Ultra 5G 12GB/128GB Bạc
24.990.000 VNĐ
Samsung Galaxy A13 4GB/128GB Đen
4.290.000 VNĐ
Samsung S21 FE 5G 8GB/128GB Tím
14.490.000 VNĐ
Samsung Galaxy S20 FE 8GB/256GB Xanh
10.990.000 VNĐ
CSS định dạng
#list1 {
display: grid;
grid-template-columns: 33.3% 33.3% 33.3% ;
}
#list1 > .dt {
text-align: center; border: 2px solid darkcyan; margin: 10px;
}
#list1 > .dt >img {
max-width: 90%; height: 200px; margin-top: 10px;
}
Kết quả:
Chuyển dữ liệu thành mảng data để hiển thị bằng javascript
Tạo mảng sau từ dữ liệu các điện thoại:
var arrDT =[
{
tenDT:'Xiaomi Redmi 9A 2GB/32GB Xanh dương',
gia:2290000 ,
hinh:'hinh/xiaomi-9a-xanh-duong.jpg',
thuonghieu:'Xiaomi',
manhinh:"4.5"
},
{
tenDT:'Samsung Galaxy A52 4G 8GB/128GB Xanh',
gia: 8290000,
hinh:'hinh/samsung-galaxy-a52-xanh.jpg',
thuonghieu:'Samsung',
manhinh:"5.2"
},
{
tenDT:'Samsung Galaxy A32 4G 6GB/128GB Xanh',
gia: 5990000,
hinh:'hinh/samsung-galaxy-a32-xanh.jpg',
thuonghieu:'Samsung',
manhinh:"4.8"
},
{
tenDT:'Xiaomi Redmi 9C 3GB/64GB Xám',
gia: 2990000,
hinh:'hinh/xiaomi-9c-xam.jpg',
thuonghieu:'Xiaomi',
manhinh:"4.6"
},
{
tenDT:'OPPO A55 4GB/64GB Xanh',
gia: 4550000,
hinh:'hinh/oppo-a55-xanh.jpg',
thuonghieu:'OPPO',
manhinh:"4.9"
},
{
tenDT:'iPhone 11 64GB Trắng',
gia: 11990000,
hinh:'hinh/iphone-11-64gb-trang.jpg',
thuonghieu:'Apple',
manhinh:"6.0"
},
{
tenDT:'iPhone 13 Pro 128GB Vàng Đồng',
gia:27990000 ,
hinh:'hinh/iphone-13-vang-dong.jpg',
thuonghieu:'Apple',
manhinh:"5.5"
},
{
tenDT:'iPhone 11 64GB Tím',
gia: 11990000,
hinh:'hinh/iphone-11-64gb-tim.jpg',
thuonghieu:'Apple',
manhinh:"5.8"
},
{
tenDT:'Vivo Y15s 3GB/32GB Xanh Đen',
gia: 3190000,
hinh:'hinh/vivo-y15s-xanh-den.jpg',
thuonghieu:'6.2',
manhinh:"4.8"
},
{
tenDT:'Vivo Y72 5G 8GB/128GB Đen',
gia: 6890000,
hinh:'hinh/vivo-y72-5g-den.jpg',
thuonghieu:'Vivo',
manhinh:"6.5"
},
{
tenDT:'Vivo V23e 8GB/128GB Đen',
gia:7390000 ,
hinh:'hinh/vivo-v23e-den.jpg',
thuonghieu:'Vivo',
manhinh:"6.4"
},
{
tenDT:'Samsung Galaxy S21 Ultra 5G 12GB/128GB Bạc',
gia: 24990000,
hinh:'hinh/samsung-galaxy-s21-bac.jpg',
thuonghieu:'Samsung',
manhinh:"6.5"
},
{
tenDT:'Samsung Galaxy A13 4GB/128GB Đen',
gia: 4290000,
hinh:'hinh/samsung-galaxy-a13-den.jpg',
thuonghieu:'Samsung',
manhinh:"4.9"
},
{
tenDT:'Samsung S21 FE 5G 8GB/128GB Tím',
gia: 14490000,
hinh:'hinh/samsung-s21-5g-tim.jpg',
thuonghieu:'Samsung',
manhinh:"5.8"
},
{
tenDT:'Samsung Galaxy S20 FE 8GB/256GB Xanh',
gia:10990000 ,
hinh:'hinh/samsung-galaxy-s20-xanh.jpg',
thuonghieu:'Samsung',
manhinh:"5.7"
}
]
Xóa toàn bộ code html trong div có id là list1, chừa lại div rỗng
Định nghĩa hàm hiện điện thoại và gọi hàm
Chọn điện thoại theo thương hiệu
Trong sự kiện onchange của các thương hiệu, gọi hàm chonDT[]
Định nghĩa hàm chonDT[]
Bổ sung tham số thuonghieuchon_arr vào hàm hienDT
function hienDT[thuonghieuchon_arr=[]]{
Bỏ qua các điện thoại không phải thuộc thương hiện user chọn
Code trước lệnh list1.innerHTML+=
Chọn điện thoại theo giá
Trong sự kiện onchange của các giá, gọi hàm chonDT[]
Chỉnh hàm chonDT[]
Xem user chọn khoảng giá nào, để đưa vào hàm hienDT
Bổ sung tham số giaban_arr vào hàm hienDT
function hienDT[thuonghieuchon_arr=[] , giaban_arr=[] ]{
Bỏ qua các điện thoại không phải thuộc giá do user chọn
Code trước lệnh list1.innerHTML+=
Chọn điện thoại theo màn hình
Trong sự kiện onchange của các loại màn hình, gọi hàm chonDT[]
Chỉnh hàm chonDT[]
Xem user chọn loại màn hình nào, để đưa vào hàm hienDT
Bổ sung tham số manhinh_arr vào hàm hienDT
function locDT[thuonghieu_arr=[] , giaban_arr=[] , manhinh_arr=[] ]{
Bỏ qua các điện thoại không phải thuộc màn hình do user chọn
Code trước lệnh list1.innerHTML+=
Hiện số đếm điện thoại
Thêm tag h4 có id là soDTDuocHien ở sau list1
Định dạng CSS
#soDTDuocHien {
background-color: darkcyan; color: yellow; padding: 8px;
text-transform: uppercase; font-size: 1.2em; text-align: center;
}
Code trong hàm hienDT
- Khai báo biến ở đầu hàm :
var soDTDuocHien=0;
- Tăng giá trị biến đếm ở trước lệnh list1.innerHTML+=:
soDTDuocHien++;
- Hiện số đếm sau vòng lặp for
document.getElementById['soDTDuocHien'].innerHTML= `Số điện thoại : ${soDTDuocHien}`;
Gắn sự kiện click cho các checkbox bằng code
- Bỏ sự kiện onchange của các tag input trong cột trái rồi chạy thử, sẽ không thấy lọc được điện thoại nữa
- Code javascript để gắn sự kiện onchange cho các tag input bằng code javascript
- Chạy lại sẽ thấy tác dụng như cũ
- Tối ưu code javascript
Thay code javascript vừa code trên thành, cũng có cùng tác dụng
Tới đây chúng ta đã thực hiện xong trang web Lọc sản phẩm với Javascript, bạn xem video để rõ trình tự nhé, tránh sai sót, chúc thành công, vui không nào 🙂
Bài viết khác liên quan đến javascript, bạn xem bài này nhé : Ứng dụng javascript: code nhỏ hữu ích