jQuery từng là “xương sống” của hàng triệu website. Dù các API thuần (Vanilla JS) và framework hiện đại ngày càng mạnh, jQuery 3.6 vẫn hiện diện trong rất nhiều dự án kế thừa, chủ yếu để tương thích trình duyệt, thao tác DOM nhanh gọn và xử lý Ajax nhất quán. Bài viết này giúp bạn làm chủ jQuery 3.6, bảo trì dự án cũ, đồng thời lập lộ trình chuyển đổi dần sang JS hiện đại khi phù hợp.
jQuery 3.6 là gì và khi nào nên dùng
- jQuery là thư viện JavaScript giúp:
- Chọn phần tử HTML bằng selector CSS ngắn gọn.
- Thao tác DOM, class, thuộc tính, style thuận tiện.
- Bắt sự kiện nhất quán giữa các trình duyệt.
- Gọi Ajax, JSON/JSONP đơn giản với callback và Promise-like (Deferred).
- Nên dùng khi:
- Dự án kế thừa đã gắn chặt với jQuery.
- Cần giữ tương thích trình duyệt cũ mà chưa thể nâng cấp toàn diện.
- Cần hoàn thành nhanh các tác vụ DOM/Ajax đơn giản.
- Hạn chế:
- Kích thước tải thêm, trùng chức năng với API chuẩn hiện đại.
- Gây phụ thuộc nếu không có kế hoạch dọn dẹp mã.
Cài đặt và nhúng jQuery 3.6
- CDN: chèn vào cuối thẻ body để tối ưu hiệu năng tải
<script src="https://code.jquery.com/jquery-3.6.0.min.js" integrity="..." crossorigin="anonymous"></script>
- NPM/Yarn:
npm install jquery
hoặcyarn add jquery
- Import trong bundler:
import $ from 'jquery'
Mẹo hiệu năng: chỉ tải jQuery trên các trang thật sự cần; dùng defer khi phù hợp; gộp script để giảm request.
Cú pháp cốt lõi: chọn, xâu chuỗi, vòng đời
- Khởi chạy sau khi DOM sẵn sàng:
$(fn)
tương đương$(document).ready(fn)
- Chọn phần tử:
$('.item')
,$('#id')
,$('div[data-x]')
- Xâu chuỗi thao tác:
$('.btn').addClass('is-active').attr('aria-pressed', 'true')
- Lặp phần tử:
$('.row').each(function(i, el){ /* ... */ })
Lưu ý: Cache selector lặp lại để giảm chi phí quét DOM, ví dụ const $items = $('.item')
.
Thao tác DOM thường dùng
- Nội dung:
text()
,html()
(ưu tiêntext()
để tránh XSS) - Thuộc tính:
attr()
,removeAttr()
,prop()
- Class:
addClass()
,removeClass()
,toggleClass()
,hasClass()
- Chèn/xóa:
append()
,prepend()
,before()
,after()
,remove()
,empty()
- Sao chép nút:
clone()
- Kích thước/vị trí:
width()
,height()
,offset()
,position()
Mẹo: gom nhiều thay đổi DOM rồi chèn một lần để hạn chế reflow.
Sự kiện và ủy quyền sự kiện
- Lắng nghe:
on('click', handler)
; hủy:off('click', handler)
- Ủy quyền:
$(document).on('click', '.btn-dynamic', handler)
để bắt sự kiện phần tử tạo sau - Ngăn mặc định:
e.preventDefault()
; dừng nổi bọt:e.stopPropagation()
- Namespacing:
on('click.modal', handler)
giúp hủy chính xác quaoff('.modal')
Ủy quyền sự kiện cải thiện hiệu năng khi thao tác danh sách phần tử động.
Ajax và JSON/JSONP
- Ngắn gọn:
- GET:
$.get('/api/products', params, (data) => { ... })
- POST:
$.post('/api/login', payload, (data) => { ... })
- GET:
- Đầy đủ:
$.ajax({ url, method, data, dataType: 'json', timeout, headers, success, error, complete })
- Chuỗi bất đồng bộ:
$.ajax(...).done(fn).fail(fn).always(fn)
- Serialize form:
$('form').serialize()
gửiapplication/x-www-form-urlencoded
- JSONP (khi API hỗ trợ): thêm
dataType: 'jsonp'
hoặc dùngcallback=?
với endpoints tương thích
Khuyến nghị: với dự án mới, cân nhắc Fetch API hoặc thư viện như Axios. Với dự án jQuery cũ, chuyển dần các điểm gọi Ajax quan trọng sang Fetch để giảm phụ thuộc.
Bảo mật khi dùng jQuery
- Tránh chèn trực tiếp dữ liệu không tin cậy bằng
html()
. Ưu tiêntext()
hoặc sanitize trước khi render. - Không ghép chuỗi selector từ input người dùng (tránh CSS injection).
- Xử lý cẩn trọng dữ liệu JSON trả về; xác thực schema khi cần.
Hiệu năng và tối ưu
- Cache selector và kết quả tìm kiếm DOM.
- Ưu tiên ủy quyền sự kiện thay vì gắn trực tiếp trên nhiều node con.
- Kết hợp thay đổi DOM: tạo node trong bộ nhớ rồi append một lần.
- Hạn chế chạy layout liên tiếp (đọc thuộc tính layout như width/offset xen kẽ ghi).
- Tách script lớn bằng lazy-loading nếu trang không cần ngay.
Plugin và mở rộng
- Tạo plugin đơn giản qua
$.fn.myPlugin = function(options){ ...; return this }
- Quy ước: không đụng chạm state bên ngoài; cho phép cấu hình; trả về this để chain.
- Kiểm tra trùng tên, namespacing sự kiện, tài liệu hóa API giúp bảo trì dài hạn.
So sánh nhanh: jQuery vs API hiện đại
- Chọn phần tử: jQuery
$('.box')
≈ JSdocument.querySelectorAll('.box')
- Class: jQuery
addClass('x')
≈ JSel.classList.add('x')
- Sự kiện: jQuery
on('click', ...)
≈ JSaddEventListener('click', ...)
- Ajax: jQuery
$.ajax()
≈ JSfetch(url).then(res => res.json())
- Ready: jQuery
$(fn)
≈ JSdocument.addEventListener('DOMContentLoaded', fn)
Nếu đang bắt đầu dự án mới, ưu tiên API chuẩn; jQuery phù hợp bảo trì dự án cũ và cần tương thích lùi.
Lộ trình chuyển đổi khỏi jQuery theo bước nhỏ
- Kiểm kê: tìm tất cả chỗ dùng
$
,$.ajax
,$(document).on
, plugin bên thứ ba. - Thay thế dần:
- Selector và class chuyển sang
querySelectorAll
vàclassList
. - Sự kiện sang
addEventListener
+ ủy quyền quaevent.target
. - Ajax sang
fetch
vàasync/await
. - Animate đơn giản sang CSS transitions hoặc Web Animations API.
- Selector và class chuyển sang
- Viết wrapper tạm thời: tạo hàm tiện ích nhỏ bắt chéo API cũ và mới để giảm thay đổi ồ ạt.
- Kiểm thử: thêm test E2E/Unit trước khi refactor để an toàn.
Mẹo bảo trì dự án dùng jQuery 3.6
- Khóa phiên bản jQuery và plugin để tránh vỡ tính năng do cập nhật bất ngờ.
- Gỡ bỏ code chết: xóa selector không còn tồn tại, sự kiện không bao giờ bắn.
- Tách file: nhóm code theo module/chức năng, tránh “god file”.
- Thêm TypeScript dần với JSDoc/typedef để có gợi ý kiểu trong IDE.
- Theo dõi cảnh báo bảo mật và cập nhật khi có hotfix.
Câu hỏi thường gặp
- Có nên dùng jQuery năm 2025?
- Có, nếu bạn đang bảo trì dự án cũ hoặc cần tương thích rộng nhanh chóng. Dự án mới nên ưu tiên API chuẩn và framework hiện đại.
- jQuery có “nặng” không?
- Bản nén ~30KB gzip. Với trang tối giản, đó là chi phí đáng cân nhắc. Với trang kế thừa, lợi ích nhất quán DOM/Ajax có thể lớn hơn.
- jQuery có dùng chung với TypeScript?
- Được. Cài đặt kiểu
@types/jquery
để có IntelliSense và kiểm tra kiểu cơ bản.
- Được. Cài đặt kiểu
Kết luận
jQuery 3.6 vẫn là công cụ thực tế để duy trì và cải thiện các dự án web kế thừa: nhanh, gọn và tương thích tốt. Tuy nhiên, để tối ưu hiệu năng, bảo mật và trải nghiệm lập trình hiện đại, bạn nên từng bước thay thế các phần sử dụng jQuery bằng API thuần hoặc thư viện chuyên biệt. Cách tiếp cận “lai” theo lộ trình giúp giữ sản phẩm ổn định trong khi giảm dần phụ thuộc vào jQuery.