AJAX jQuery là gì: Hướng dẫn sử dụng chi tiết cho người mới

AJAX jQuery cho phép cập nhật từng phần của trang web, tải dữ liệu từ máy chủ và gửi dữ liệu đến máy chủ trong nền, tất cả đều diễn ra mà không làm gián đoạn trải nghiệm người dùng. Vậy cách sử dụng AJAX trong jQuery như thế nào để hiệu quả? Các phương pháp thông dụng và cách ứng dụng thực tiễn trong lập trình front-end hiện đại như thế nào?

Đọc bài viết sau để được giải đáp chi tiết về:

  • Tổng quan về AJAX và jQuery
  • Phương thức cốt lõi của AJAX jQuery
  • Hướng dẫn sử dụng AJAX jQuery trong lập trình web
  • So sánh AJAX jQuery và những giải pháp thay thế hiện đại 
  • Những lỗi thường gặp khi sử dụng AJAX jQuery

AJAX jQuery là gì? 

Trước tiên ITviec sẽ giải đáp cho bạn AJAX và jQuery là gì. Sau đó chúng ta sẽ tìm hiểu tại sao AJAX jQuery vẫn đóng vai trò quan trọng trong phát triển web hiện đại ngay cả khi có nhiều công nghệ mới xuất hiện.

AJAX là gì?

AJAX (Asynchronous JavaScript and XML) là một kỹ thuật phát triển web cho phép cập nhật từng phần của trang web mà không cần tải lại toàn bộ trang. Công nghệ này tạo ra khả năng giao tiếp với máy chủ ở chế độ nền, giúp trang web phản hồi nhanh hơn và giảm thời gian chờ. AJAX không phải là một ngôn ngữ lập trình riêng biệt mà là sự kết hợp của nhiều công nghệ web như JavaScript, XML, JSON, HTML, và CSS.

Thành phần cốt lõi của AJAX là đối tượng XMLHttpRequest (hoặc các đối tượng tương đương hiện đại như Fetch API), cho phép JavaScript gửi yêu cầu HTTP đến máy chủ web và truy xuất dữ liệu từ máy chủ sau khi trang đã được tải.

Xem thêm: AJAX là gì? Quy trình hoạt động và thực hành AJAX dễ hiểu cho Web Developer

jQuery là gì?

jQuery là một thư viện JavaScript nhẹ, đa nền tảng được thiết kế để đơn giản hóa việc lập trình JavaScript phía client. Với cú pháp ngắn gọn và dễ hiểu, jQuery giúp đơn giản hóa nhiều tác vụ phức tạp như DOM manipulation, xử lý sự kiện, tạo hiệu ứng và đặc biệt là thực hiện các yêu cầu AJAX. 

Mặc dù có nhiều framework hiện đại, nhưng jQuery vẫn được sử dụng khá phổ biến trong lập trình web hiện nay. Tuy nhiên, do sự phát triển nhanh chóng của các công nghệ mới, có thể khiến các lập trình viên chuyển hướng đến các thư viện và framework khác.

Xem thêm: Những điều cần biết về jQuery – Thư viện Javascript hàng đầu

Vậy AJAX jQuery là gì? 

AJAX jQuery là sự kết hợp giữa kỹ thuật AJAX và thư viện jQuery, cung cấp một bộ các phương thức đơn giản và mạnh mẽ để thực hiện các yêu cầu HTTP không đồng bộ.

jQuery đã trừu tượng hóa sự phức tạp của AJAX thuần JavaScript, cung cấp API trực quan như $.ajax(), $.get(), $.post(), $.getJSON(), $.load() và nhiều phương thức khác để dễ dàng tương tác với máy chủ. 

Thư viện jQuery cung cấp một bộ công cụ AJAX toàn diện cho phép lập trình viên tải dữ liệu từ máy chủ và cập nhật các phần của trang web một cách mượt mà mà không cần tải lại trang. Điểm mạnh của AJAX jQuery là khả năng xử lý tương thích trên nhiều trình duyệt khác nhau, giúp lập trình viên không phải lo lắng về sự khác biệt trong cách trình duyệt xử lý các yêu cầu XMLHttpRequest. 

Tuy các công nghệ mới như Fetch API và các thư viện như Axios ngày càng phổ biến nhờ tính linh hoạt và hỗ trợ tốt trong các trình duyệt hiện đại, AJAX jQuery vẫn giữ vị trí quan trọng trong phát triển web, đặc biệt là trong các dự án cần tương thích với các trình duyệt cũ hoặc khi cần một giải pháp đơn giản, nhanh chóng để triển khai.

3 phương thức phổ biến của AJAX trong jQuery 

Phương thức $.ajax()

Phương thức jQuery $.ajax() được sử dụng để thực hiện các yêu cầu HTTP không đồng bộ (asynchronous HTTP requests), cho phép bạn tải dữ liệu từ máy chủ mà không cần tải lại trang web. Phương thức này cung cấp cách linh hoạt để tương tác với máy chủ từ xa bằng GET, POST hoặc các phương thức HTTP khác. Đồng thời, hỗ trợ nhiều định dạng dữ liệu khác nhau.

Cú pháp cơ bản:

$.ajax({name:value, name:value, ... })

Các tham số (parameters) thường dùng trong phương thức $.ajax():

Thuộc tínhMô tả
methodXác định loại yêu cầu là POST, GET, PUT, DELETE,… (type là tên cũ, không khuyến nghị từ jQuery 1.9.0)
urlXác định URL mà yêu cầu sẽ được gửi đến
usernameXác định tên người dùng để xác thực truy cập HTTP
xhrHàm callback để tạo hoặc tùy chỉnh đối tượng XMLHttpRequest
asyncMặc định là true. Xác định xem request có bất đồng bộ hay không
beforeSend(xhr)Hàm được thực thi trước khi request được gửi đi
dataTypeLoại dữ liệu mong đợi từ phản hồi của máy chủ
error(xhr, status, error)Hàm được thực thi nếu request bị lỗi
globalMặc định là true. Xác định có kích hoạt các sự kiện AJAX toàn cục hay không
ifModifiedMặc định là false. Request chỉ thành công nếu phản hồi đã thay đổi.
jsonpGhi đè hàm call back cho các request JSONP
jsonpCallbackXác định tên của hàm callback trong yêu cầu JSONP
cacheMặc định là true. Chỉ ra liệu trình duyệt có nên lưu cache trang được yêu cầu không
complete(xhr, status)Hàm được gọi khi request hoàn tất.
contentTypeMặc định là application/x-www-form-urlencodedXác định loại nội dung của dữ liệu được gửiVí dụ: application/json cho dữ liệu JSON
contextXác định giá trị this cho tất cả các callback có liên quan đến AJAX
dataXác định dữ liệu sẽ được gửi đến máy chủ
dataFilter(data,type)Xử lý dữ liệu phản hồi thô từ đối tượng XMLHttpRequest
passwordXác định mật khẩu cho xác thực truy cập HTTP
processDataMặc định là true. Xác định dữ liệu có nên được chuyển thành chuỗi truy vấn hay không
scriptCharsetXác định bộ ký tự cho yêu cầu
success(result, status, xhr)Hàm được gọi khi yêu cầu thành công
timeoutThời gian chờ cục bộ request, được tính bằng mili giây
traditionalXác định có sử dụng kiểu tuần tự hóa tham số truyền thống hay không
headersMột đối tượng chứa các tiêu đề HTTP tùy chỉnh.Ví dụ: { “Authorization”: “Bearer token” }

Chúng ta sẽ tìm hiểu các ví dụ chi tiết của phương thức $.ajax() ở phần sau của bài viết.

Hai phương thức khác thường được dùng để trao đổi thông tin giữa client (trình duyệt) và server (máy chủ) là GETPOST.

  • GET: Dùng để yêu cầu dữ liệu từ một nguồn cụ thể trên server. Dữ liệu được gửi qua URL, nên có giới hạn về độ dài và có thể bị lưu cache bởi trình duyệt.
  • POST: Dùng để gửi dữ liệu đến server để xử lý. Phương thức POST không bao giờ lưu cache, nên thường được dùng khi gửi biểu mẫu, đăng ký tài khoản,….

Phương thức $.get() trong jQuery

Phương thức $.get() được dùng để lấy dữ liệu từ server bằng phương thức HTTP GET.

$.get(URL, [data], [callback], [dataType]);

Trong đó:

  • URL (bắt buộc): Là địa chỉ (đường dẫn) mà bạn muốn gửi yêu cầu để lấy dữ liệu.
  • data (không bắt buộc): Dữ liệu gửi kèm yêu cầu, thường là đối tượng hoặc chuỗi truy vấn.
  • callback (không bắt buộc): Là tên của hàm sẽ chạy khi yêu cầu được thực hiện thành công.
  • dataType (không bắt buộc): Loại dữ liệu mong đợi từ server (ví dụ: json, text, html).
$("button").click(function(){
  $.get("demo_test.asp", function(data, status){
    alert("Data: " + data + "\nStatus: " + status);
  });
});

Giải thích ví dụ trên

  • Tham số đầu tiên là “demo_test.asp” – đây là file hoặc địa chỉ mà bạn muốn lấy dữ liệu từ đó.
  • Tham số thứ hai là hàm callback, sẽ được chạy sau khi dữ liệu được tải thành công.
  • data: là nội dung mà server trả về.
  • status: là trạng thái của yêu cầu, ví dụ như “success” nếu lấy thành công.

Nhìn chung, phương thức $.get() giúp bạn lấy nhanh dữ liệu từ server và xử lý kết quả trả về thông qua một hàm callback. Đây là cách rất tiện lợi và thường được dùng trong các ứng dụng web khi bạn chỉ cần đọc thông tin mà không cần gửi dữ liệu lên server.

Phương thức $.post() trong jQuery

Phương thức $.post() được dùng để gửi yêu cầu đến server bằng phương thức HTTP POST.

$.post(URL, [data], [callback], [dataType]);

Trong đó,

  • Tham số URL (bắt buộc): Địa chỉ mà bạn muốn gửi yêu cầu đến.
  • Tham số data (không bắt buộc): Dữ liệu bạn muốn gửi kèm theo yêu cầu (thường là đối tượng JavaScript hoặc chuỗi).
  • Tham số callback (không bắt buộc): Tên hàm sẽ được thực thi khi yêu cầu thành công.
  • dataType (không bắt buộc): Loại dữ liệu mong đợi từ server (ví dụ: json, text, html).

Ví dụ:

$("button").click(function(){
  $.post("demo_test_post.asp",
  {
    name: "Donald Duck",
    city: "Duckburg"
  },
  function(data, status){
    alert("Data: " + data + "\nStatus: " + status);
  });
});

Giải thích về ví dụ trên:

  • Tham số đầu tiên “demo_test_post.asp” là đường dẫn đến tệp server mà ta muốn gửi dữ liệu đến.
  • Sau đó là dữ liệu được gửi đi: namecity.
  • Tệp ASP “demo_test_post.asp” sẽ nhận dữ liệu, xử lý, rồi trả kết quả về.
  • Tham số thứ ba là hàm callback – sẽ chạy sau khi server phản hồi.
  • data: nội dung mà server trả về
  • status: trạng thái của yêu cầu (ví dụ: “success”)

Hướng dẫn sử dụng AJAX jQuery trong lập trình web 

Trong phần này, ITviec sẽ hướng dẫn cách sử dụng AJAX jQuery một cách hiệu quả để xây dựng các tính năng web động. Mặc dù AJAX jQuery vẫn được sử dụng rộng rãi, các công nghệ hiện đại như Fetch API đang ngày càng phổ biến trong các dự án mới.

Thiết lập môi trường

Trước khi tìm hiểu cách sử dụng AJAX với jQuery, bạn cần đảm bảo rằng mình đã thiết lập đầy đủ môi trường cần thiết. Trước tiên, bạn cần thêm thư viện jQuery vào dự án web của mình. Có hai cách để làm điều này:

  • Tải thư viện jQuery trực tiếp từ trang web chính thức: https://jquery.com/
  • Hoặc sử dụng liên kết từ Content Delivery Network (CDN), ví dụ: <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>

Sau khi đã thêm thư viện jQuery vào trang web của mình, bạn có thể kiểm tra xem thư viện đã được tải thành công bằng cách chạy console.log($) trong console trình duyệt. Bạn có thể bắt đầu sử dụng các tính năng của nó, bao gồm cả chức năng AJAX để thực hiện các yêu cầu bất đồng bộ một cách dễ dàng và hiệu quả.

Cơ bản về AJAX jQuery

Cốt lõi của AJAX trong jQuery xoay quanh hàm $.ajax(), cung cấp một giao diện đơn giản và nhất quán để thực hiện các yêu cầu HTTP bất đồng bộ. AJAX với jQuery mang lại sự linh hoạt và mạnh mẽ trong việc giao tiếp giữa trình duyệt và máy chủ, từ đó giúp bạn xây dựng các ứng dụng web tương tác cao, nhanh chóng và mượt mà.

Xử lý các loại request khác nhau

Trong khi ví dụ trước sử dụng phương thức GET, hàm $.ajax() của jQuery còn hỗ trợ nhiều phương thức HTTP khác, cho phép bạn xử lý đa dạng các loại thao tác với máy chủ. 

Chẳng hạn như PUTDELETE chỉ bằng cách chỉ định phương thức tương ứng trong thuộc tính method của đối tượng cấu hình. Việc linh hoạt sử dụng các loại yêu cầu HTTP sẽ giúp ứng dụng của bạn giao tiếp hiệu quả hơn với các API backend, phục vụ tốt cho các thao tác thêm, sửa, xóa dữ liệu.

Làm việc với dữ liệu JSON

Nhiều API web hiện đại trả về dữ liệu ở định dạng JSON (JavaScript Object Notation), một định dạng nhẹ, dễ đọc và dễ phân tích cú pháp bằng JavaScript. jQuery hỗ trợ sẵn việc xử lý dữ liệu JSON trong các yêu cầu AJAX.

Dưới đây là một ví dụ về cách làm việc với dữ liệu JSON:

$.ajax({
  url: 'https://api.example.com/users',
  method: 'GET',
  dataType: 'json',
  success: function(users) {
    // Phản hồi được tự động phân tích cú pháp dưới dạng JSON
    users.forEach(function(user) {
      console.log(user.name);
    });
  },
  error: function(xhr, status, error) {
    // Xử lý lỗi khi xảy ra
    console.error(error);
  }
});

Trong ví dụ trên, sử dụng thuộc tính dataType: 'json' để yêu cầu jQuery tự động phân tích phản hồi thành dữ liệu JSON. Nhờ vậy, hàm callback success sẽ nhận được dữ liệu đã được phân tích dưới dạng mảng hoặc đối tượng, tùy vào cấu trúc phản hồi từ máy chủ.

Một cách thay thế là sử dụng phương thức $.getJSON() để đơn giản hóa yêu cầu GET với dữ liệu JSON:

$.getJSON('https://api.example.com/users', function(users) {
  users.forEach(function(user) {
    console.log(user.name);
  });
}).fail(function(xhr, status, error) {
  console.error('Lỗi:', error);
});

Lưu ý: Nếu server trả về dữ liệu không đúng định dạng JSON (ví dụ: HTML hoặc text), yêu cầu sẽ thất bại và gọi hàm error. Việc xử lý JSON theo cách này sẽ giúp bạn tiết kiệm thời gian, tránh phải tự phân tích cú pháp bằng JSON.parse(), đồng thời giúp mã trở nên gọn gàng và dễ bảo trì hơn.

Xử lý phản hồi (responses)

Hàm $.ajax() của jQuery cung cấp nhiều cách để xử lý dữ liệu phản hồi, tùy thuộc vào nhu cầu của bạn. Ngoài các hàm callback như success và error, bạn cũng có thể sử dụng các phương thức done, fail và always để quản lý phản hồi một cách linh hoạt hơn.

$.ajax({
  url: 'https://api.example.com/data',
  method: 'GET'
})
  .done(function(response) {
    // Xử lý phản hồi thành công
    console.log(response);
  })
  .fail(function(xhr, status, error) {
    // Xử lý lỗi khi xảy ra
    console.error(error);
  })
  .always(function() {
    // Đoạn mã này luôn được thực hiện, bất kể thành công hay thất bại
    console.log('Request completed');
  });

Phân tích ví dụ trên:

  • Phương thức done tương tự như callback success, được gọi khi yêu cầu AJAX thành công.
  • Phương thức fail tương tự như callback error, được gọi khi có lỗi xảy ra trong quá trình gửi yêu cầu.
  • Phương thức always được thực thi bất kể yêu cầu có thành công hay thất bại, rất hữu ích để thực hiện các công việc dọn dẹp hoặc cập nhật giao diện người dùng sau khi yêu cầu hoàn tất.
  • Các phương thức này sử dụng cú pháp Promise, được hỗ trợ tốt trong jQuery 3.x, giúp mã nguồn rõ ràng và dễ duy trì.

Chuỗi AJAX calls

Một trong những tính năng nổi bật của AJAX jQuery là khả năng thực hiện AJAX calls theo chuỗi. Điều này có nghĩa là bạn có thể thực hiện nhiều yêu cầu AJAX, trong đó yêu cầu tiếp theo chỉ được thực hiện sau khi yêu cầu trước đó hoàn tất và trả về kết quả. Việc sử dụng chuỗi AJAX calls đặc biệt hữu ích khi làm việc với các API cần nhiều bước để truy xuất hoặc cập nhật dữ liệu.

Dưới đây là ví dụ về cách thực hiện chuỗi AJAX calls trong jQuery:

$.ajax({
  url: 'https://api.example.com/users',
  method: 'GET',
  dataType: 'json'
})
  .done(function(users) {
    // Xử lý danh sách người dùng
    console.log(users);
    // Thực hiện tiếp một lời gọi AJAX để lấy thông tin chi tiết của một người dùng cụ thể
    var userId = users[0].id;
    return $.ajax({
      url: `https://api.example.com/users/${userId}`,
      method: 'GET',
      dataType: 'json'
    });
  })
  .done(function(user) {
    // Xử lý thông tin chi tiết của người dùng cụ thể
    console.log(user);
  })
  .fail(function(xhr, status, error) {
    // Xử lý lỗi nếu có xảy ra trong chuỗi AJAX calls
    console.error(error);
  });

Phân tích ví dụ trên:

  • Đầu tiên, thực hiện một yêu cầu GET để lấy danh sách người dùng. 
  • Trong hàm done đầu tiên, xử lý danh sách, sau đó trả về một AJAX call khác để lấy thông tin chi tiết của một người dùng cụ thể dựa trên ID của họ.
  • AJAX call thứ hai chỉ được thực hiện sau khi lời gọi đầu tiên thành công, và phản hồi của nó được xử lý trong hàm done tiếp theo.

Một cách hiện đại hơn là sử dụng async/await với jQuery (từ phiên bản 3.0):

async function fetchUserData() {
  try {
    const users = await $.ajax({
      url: 'https://api.example.com/users',
      method: 'GET',
      dataType: 'json'
    });
    console.log(users);
    const userId = users[0].id;
    const user = await $.ajax({
      url: `https://api.example.com/users/${userId}`,
      method: 'GET',
      dataType: 'json'
    });
    console.log(user);
  } catch (error) {
    console.error('Lỗi trong chuỗi AJAX:', error);
  }
}
fetchUserData();

Việc sử dụng chuỗi AJAX calls như vậy giúp mã nguồn trở nên rõ ràng, dễ bảo trì hơn, vì mỗi yêu cầu được xử lý riêng biệt nhưng vẫn là một phần của quy trình tổng thể.

Xử lý lỗi và debug

Dù AJAX jQuery giúp cải thiện trải nghiệm người dùng, nhưng cũng có thể phát sinh lỗi khó kiểm soát nếu không xử lý đúng cách. Dưới đây là một số phương pháp để xử lý và gỡ lỗi hiệu quả.

Đầu tiên, bạn có thể dùng fail() hoặc error callback để xử lý lỗi. Khi gửi AJAX, bạn có thể dùng .fail() để bắt các lỗi như lỗi mạng, lỗi máy chủ hoặc lỗi xác thực.

$.ajax({
  url: 'https://api.example.com/data',
  method: 'GET'
})
.done(function(response) {
  console.log(response); // Xử lý khi thành công
})
.fail(function(xhr, status, error) {
  console.error(error); // Hiển thị lỗi
  console.log('Status:', status);
  console.log('Response:', xhr.responseText);
});

Hoặc cách thứ hai là bạn có thể sử dụng công cụ Developer Tools của trình duyệt. Các trình duyệt hiện đại đều có tab Network để bạn kiểm tra chi tiết các request AJAX: header, dữ liệu gửi, nhận, mã lỗi,… giúp xác định nguyên nhân lỗi như sai định dạng dữ liệu, lỗi xác thực,…

Cách thứ ba bạn có thể tham khảo là thiết lập xử lý lỗi toàn cục với $.ajaxSetup(). Nếu ứng dụng có nhiều lệnh AJAX, bạn có thể cấu hình xử lý lỗi một lần cho tất cả. Việc này sẽ giúp bạn đồng bộ cách xử lý lỗi trên toàn ứng dụng, tiết kiệm thời gian và dễ quản lý hơn.

$.ajaxSetup({
  error: function(xhr, status, error) {
    console.error('AJAX Error:', error);
  }
});

Cân nhắc về tính bảo mật

Khi làm việc với AJAX jQuery, bạn cần chú ý đến một số vấn đề bảo mật quan trọng để tránh lỗ hổng tiềm ẩn:

  • XSS (Tấn công chèn mã độc): Xảy ra khi dữ liệu do người dùng nhập không được kiểm tra kỹ. Hãy dùng các phương thức như text() thay vì html() để tránh chèn mã độc vào trang.
  • CSRF (Giả mạo yêu cầu người dùng): Trình duyệt bị lợi dụng để gửi yêu cầu trái phép. Nên dùng CSRF token trong các yêu cầu AJAX và xác thực phía server.
  • Chính sách cùng nguồn (Same-Origin Policy): AJAX chỉ được phép gửi yêu cầu đến cùng domain. Nếu cần gọi API từ domain khác, bạn phải bật CORS ở phía server hoặc dùng JSONP/proxy.
  • Xử lý dữ liệu nhạy cảm: Khi truyền thông tin quan trọng như mật khẩu, hãy đảm bảo sử dụng HTTPS và lưu trữ dữ liệu an toàn ở phía server.
  • Thư viện bên thứ ba: Luôn cập nhật các thư viện jQuery hoặc plugin bạn sử dụng để tránh các lỗ hổng từ phiên bản cũ.
  • Kiểm tra và lọc dữ liệu đầu vào: Luôn xác minh và làm sạch dữ liệu người dùng để tránh các cuộc tấn công như SQL injection hay chèn mã độc.

So sánh AJAX jQuery và Những giải pháp thay thế hiện đại

Bên cạnh AJAX jQuery thì vẫn có một số giải pháp thay thế hiện đại cho các tác vụ gọi API bất đồng bộ. Fetch API, Axios hay thậm chí là các thư viện reactive như React Query có thể giúp quá trình lập trình web trở nên tối ưu và linh hoạt hơn để làm việc với dữ liệu từ server. AJAX jQuery vẫn hữu ích cho các dự án cũ hoặc khi cần hỗ trợ các trình duyệt cũ không tương thích tốt với các công nghệ mới.

Dưới đây là một số giải đáp thay thế hiện đại bạn có thể tham khảo như sau.

Công cụHỗ trợ thời gian thựcCú phápHỗ trợ trình duyệtHỗ trợ 2 chiều (Bi-directional)
AJAX jQueryKhông (thời gian thực cần WebSocket hoặc giải pháp khác)Dễ hiểu nhờ thư viện jQuery hỗ trợ sẵn.Hỗ trợ tốt trên hầu hết các trình duyệt.Không hỗ trợ.
Fetch APIKhôngĐơn giản, dễ sử dụng.Được hỗ trợ rộng rãi trên các trình duyệt hiện đại.Không hỗ trợ
AxiosKhông (thời gian thực cần WebSocket hoặc SSE)Rất đơn giản, thân thiện với lập trình viên.Hỗ trợ tốt trên tất cả trình duyệt hiện đại. (yêu cầu tải thư viện Axios)Không hỗ trợ
GraphQLChỉ hỗ trợ thông qua cơ chế subcriptions. (yêu cầu WebSocket để hoạt động thời gian thực)Đơn giản và rõ ràng.Hỗ trợ tốt trên hầu hết các trình duyệt.Có khả năng giao tiếp hai chiều thông qua subscriptions.
React QueryKhông (thời gian thực cần tích hợp WebSocket)Rất đơn giản, nhiều tiện ích như cache, tự động refetch, quản lý trạng thái.Hoạt động tốt trên trình duyệt hiện đại (dựa trên nền tảng fetch hoặc Axios)Không hỗ trợ hai chiều một cách nguyên bản, nhưng có thể tích hợp nếu cần.

Fetch API – Hợp lý hóa việc truy xuất dữ liệu

Fetch API là giao diện JavaScript hiện đại thay thế XMLHttpRequest, được tích hợp sẵn trong trình duyệt hiện nay. Fetch cung cấp một phương pháp tiếp cận trực tiếp và dựa trên Promise so với AJAX. 

Với cú pháp thân thiện hơn, hỗ trợ Promise và async/await, Fetch giúp viết mã bất đồng bộ trở nên rõ ràng, dễ bảo trì. Tuy nhiên, nó không tự động xử lý JSON hoặc lỗi HTTP như Axios, nên cần lập trình viên tự bổ sung các xử lý.

Fetch API là lựa chọn phù hợp khi bạn không muốn phụ thuộc vào thư viện bên ngoài và cần một giải pháp nhẹ nhàng cho các project nhỏ. Đây cũng là công cụ lý tưởng để hiểu rõ cách JavaScript hoạt động với HTTP.

fetch('https://api.example.com/data')
  .then(response => response.json())
  .then(data => console.log(data))
  .catch(error => console.error('Error:', error));

Ví dụ trên là cách sử dụng Fetch API trong JavaScript để lấy dữ liệu từ một API. Cụ thể như sau:

  • fetch('https://api.example.com/data'): Đây là lệnh gọi đến API tại địa chỉ https://api.example.com/data. Hàm fetch sẽ gửi một yêu cầu HTTP GET đến URL này để lấy dữ liệu.
  • then(response => response.json()): Sau khi nhận được phản hồi từ server, phương thức then được sử dụng để xử lý kết quả. Tham số response chứa thông tin về phản hồi từ server.
  • .then(data => console.log(data)): Data là đối tượng JavaScript mà bạn đã nhận được từ phương thức response.json()
  • console.log(data): In ra dữ liệu đó trên bảng điều khiển (console) của trình duyệt, cho phép bạn xem nội dung mà bạn đã nhận từ API.
  • .catch(error => console.error('Error:', error)):Nếu có bất kỳ lỗi nào xảy ra trong quá trình lấy dữ liệu, phần catch sẽ được gọi.
  • console.error('Error:', error): In ra thông báo lỗi trên bảng điều khiển, giúp bạn xác định vấn đề.

Axios – Yêu cầu HTTP được đơn giản hóa

Axios là một thư viện HTTP request phổ biến trong hệ sinh thái JavaScript. Axios hỗ trợ Promise và tích hợp rất tốt với async/await. Axios yêu cầu tải thư viện, làm tăng kích thước tải trang so với Fetch API, nhưng bù lại cung cấp nhiều tính năng tiện lợi. 

Điểm mạnh của Axios là khả năng tự động chuyển đổi dữ liệu JSON, cấu hình headers, xử lý lỗi rõ ràng, timeout và khả năng hủy request. Ngoài ra, Axios còn hoạt động tốt cả phía client lẫn server (Node.js).

Bên cạnh đó, Axios tối ưu tốt hơn Fetch API trong thực tế sản xuất nhờ cú pháp gọn, khả năng xử lý lỗi đầy đủ và dễ tùy biến. Axios sẽ là lựa chọn hoàn hảo trong nhiều dự án từ vừa đến lớn.

axios.get('https://api.example.com/data')
  .then(res => console.log(res.data))
  .catch(err => console.error(err));

Xem thêm: Top 10 Thư viện và Framework front end dùng nhiều nhất hiện nay

Ví dụ sử dụng async/await:

async function fetchData() {
  try {
    const res = await axios.get('https://jsonplaceholder.typicode.com/posts');
    console.log(res.data);
  } catch (err) {
    console.error('Error:', err);
  }
}
fetchData();

GraphQL – Truy xuất dữ liệu hiệu quả

GraphQL là ngôn ngữ truy vấn cho API cho phép client yêu cầu chính xác dữ liệu họ cần, trong một request duy nhất. Không giống như các API REST truyền thống, thường lấy dữ liệu quá mức, GraphQL cho phép lấy dữ liệu hiệu quả, giảm tải và cải thiện hiệu suất.

Nếu bạn cần một API linh hoạt, tối ưu băng thông và dễ mở rộng trong tương lai, GraphQL là lựa chọn nên cân nhắc. Đặc biệt hữu ích với Frontend hiện đại cần custom dữ liệu hiển thị theo nhiều cách.

  • Giảm tình trạng tải quá mức và tải dưới mức.
  • Schema được gõ mạnh.
  • Single endpoint cho tất cả các yêu cầu.
  • Phù hợp cho các ứng dụng di động hoặc ứng dụng bandwidth-sensitive.

GraphQL sẽ phù hợp với ứng dụng phức tạp, hệ thống có quan hệ dữ liệu nhiều tầng, SPA hoặc mobile app cần tối ưu tốc độ tải dữ liệu.

import { gql, useQuery } from '@apollo/client';
const GET_USERS = gql`
  query {
    users {
      id
      name
    }
  }
`;
const { loading, error, data } = useQuery(GET_USERS);

React Query

React Query là thư viện giúp quản lý và gọi API trong React theo hướng hiện đại và tối ưu hiệu suất. Không chỉ là “gửi request và nhận dữ liệu”, thư viện này hỗ trợ cache, refetch tự động, đồng bộ dữ liệu, stale data, pagination và cả mutation (thay đổi dữ liệu).

Thay vì “cập nhật liên tục” như WebSocket, React Query tự động refetch dữ liệu dựa trên cấu hình. Ngoài ra, React Query có cộng đồng lớn và phát triển rất nhanh.

Ví dụ sử dụng React Query:

import { useQuery } from '@tanstack/react-query';
function Posts() {
  const { data, isLoading, error } = useQuery({
    queryKey: ['posts'],
    queryFn: () => fetch('https://jsonplaceholder.typicode.com/posts').then(res => res.json())
  });
  if (isLoading) return <p>Loading...</p>;
  if (error) return <p>Error: {error.message}</p>;
  return (
    <ul>
      {data.map(post => (
        <li key={post.id}>{post.title}</li>
      ))}
    </ul>
  );
}

Thay vì tự viết logic gọi API, xử lý loading, error và caching, React Query giúp bạn tiết kiệm thời gian với cấu trúc chuẩn hóa. Điều này giúp tập trung vào phát triển tính năng thay vì quản lý state phức tạp.

React Query sẽ phù hợp với ứng dụng React hiện đại, SPA, những nơi yêu cầu hiệu năng cao và cập nhật dữ liệu liên tục.

Vậy làm thế nào để lựa chọn được giải pháp thay thế phù hợp? Bạn có thể tham khảo qua bảng dưới đây:

Trường hợp sử dụngGiải pháp phù hợp nhất
Gửi yêu cầu bất đồng bộ đơn giản.Fetch API (dự án nhỏ, không cần xử lý lỗi phức tạp)
Cần xử lý lỗi mạnh mẽ và rõ ràng.Axios
Truy vấn dữ liệu chính xác, có cấu trúc.GraphQL
Dự án cũ sử dụng jQuery.AJAX jQuery (hoặc tích hợp nhanh vào các dự án không dùng framework hiện đại)
Quản lý truy vấn, cache và đồng bộ hóa dữ liệu hiệu quả.React Query

Những lỗi thường gặp khi sử dụng AJAX jQuery 

Dù AJAX jQuery giúp lập trình bất đồng bộ trở nên dễ dàng hơn, vẫn có thể xảy ra các lỗi thường gặp liên quan đến cấu hình sai, đường dẫn không chính xác, hoặc môi trường không phù hợp.

Dưới đây là một số lỗi thường gặp trong quá trình sử dụng AJAX jQuery. Sử dụng Developer Tools của trình duyệt (tab Network) sẽ giúp xác định và khắc phục lỗi nhanh chóng.

Sai URL hoặc đường dẫn tương đối không chính xác

Một lỗi thường gặp là sử dụng sai đường dẫn API hoặc file xử lý request. Điều này khiến request không thể gửi đến đúng nơi và trả về lỗi 404. Lỗi này cũng có thể xảy ra do chính sách CORS nếu API nằm trên domain khác hoặc do đường dẫn tương đối khi chạy file HTML cục bộ (file://).

Cách khắc phục: 

  • Luôn kiểm tra lại đường dẫn API, đặc biệt khi sử dụng trong môi trường dev/staging/production.
  • Sử dụng Developer Tools (tab Network) để kiểm tra URL và mã trạng thái HTTP.
  • Đảm bảo file HTML được chạy trên server (như localhost) để tránh lỗi đường dẫn tương đối.

Quên hoặc sai cấu hình dataType và contentType

Nếu server trả về JSON nhưng bạn không chỉ định rõ dataType: ‘json’, có thể dữ liệu không được xử lý đúng. Nếu không chỉ định dataType, jQuery sẽ đoán định dạng dựa trên header Content-Type của phản hồi, nhưng điều này không luôn chính xác. Tương tự, nếu gửi dữ liệu nhưng không đặt contentType đúng, server có thể không hiểu request.

Cách khắc phục: Xác định rõ kiểu dữ liệu gửi đi và nhận về và dùng đúng cặp.

contentType: 'application/json',
dataType: 'json'

Quên JSON.stringify()

Khi gửi object JSON đến server bằng POST, nhiều người quên chuyển dữ liệu về chuỗi JSON, dẫn đến server không hiểu nội dung.

Cách khắc phục là bạn cần dùng JSON.stringify(data) khi cần thiết:

data: JSON.stringify({name: "John", age: 30})

Một số mã (code) sai

Trong một số trường hợp, trình xử lý lỗi chỉ ghi lại mã trạng thái HTTP (xhr.status) mà không cung cấp thông tin chi tiết về lỗi. Bằng cách ghi lại tham số lỗi, có thể thu thập thêm thông tin bổ sung, từ đó hỗ trợ quá trình chẩn đoán và khắc phục sự cố hiệu quả hơn.

Code sai:

$.ajax({
    url: 'https://api.example.com/data',
    method: 'GET',
    success: function(response) {
        // Process response data
    },
    error: function(xhr, status, error) {
        console.log(xhr.status); // 404
    }
});

Code đúng sau khi được khắc phục lỗi:

$.ajax({
    url: 'https://api.example.com/data',
    method: 'GET',
    success: function(response) {
        // Process response data
    },
    error: function(xhr, status, error) {
        console.log(xhr.status); // Corrected to log HTTP status code
        console.log(error); // Log error message
    }
});

Một trường hợp khác, lỗi xảy ra do JSON không hợp lệ được máy chủ trả về, gây ra lỗi cú pháp trong quá trình phân tích cú pháp. Bằng cách ghi lại xhr.responseText và truy xuất văn bản phản hồi thực tế, bạn có thể dễ dàng xác định và khắc phục các lỗi liên quan đến phân tích cú pháp.

Code ban đầu:

$.ajax({
    url: '<https://api.example.com/data>',
    method: 'POST',
    data: JSON.stringify({}),
    contentType: 'application/json',
    success: function(response) {
        // Process response data
    },
    error: function(xhr, status, error) {
        console.log(error); // SyntaxError: Unexpected token < in JSON at position 0
    }
});

Code sau khi được khắc phục:

$.ajax({
    url: '<https://api.example.com/data>',
    method: 'POST',
    data: JSON.stringify({}),
    contentType: 'application/json',
    success: function(response) {
        // Process response data
    },
    error: function(xhr, status, error) {
        console.log(xhr.responseText); // Log response text for debugging
    }
});

Các câu hỏi thường gặp về AJAX jQuery

jQuery có còn phù hợp trong thời đại hiện nay không?

Dù các framework hiện đại như React, Vue hay Angular đang rất phổ biến, jQuery vẫn còn phù hợp trong nhiều dự án nhẹ, đơn giản hoặc những hệ thống cũ cần duy trì. Đặc biệt, với các tác vụ như thao tác DOM, hiệu ứng và sử dụng AJAX đơn giản, jQuery vẫn là lựa chọn giúp tiết kiệm thời gian và công sức.

Một số lý do jQuery vẫn còn phổ biến và phù hợp trong lập trình web hiện đại có thể kể đến như:

  • jQuery đơn giản và dễ học, phù hợp với người mới bắt đầu dễ hiểu và nhanh chóng bắt đầu sử dụng.
  • Tăng tốc quá trình phát triển cho các tác vụ cơ bản như xử lý sự kiện, hoạt ảnh và thao tác DOM mà không cần nhiều mã.
  • Nhiều trang web cũ hơn vẫn sử dụng jQuery và vẫn hữu ích để duy trì hoặc cập nhật các trang web này.
  • jQuery giúp đảm bảo rằng trang web của bạn hoạt động trơn tru trên các trình duyệt web khác nhau, tiết kiệm thời gian thử nghiệm và gỡ lỗi.
  • Đảm bảo tương thích trình duyệt, nhưng có thể không phù hợp cho các ứng dụng SPA phức tạp hoặc khi cần tối ưu hiệu suất do kích thước thư viện.
  • Nếu bắt đầu dự án mới, nên cân nhắc sử dụng Fetch API hoặc các framework hiện đại để tận dụng tính năng và hiệu suất tốt hơn.

Sự khác biệt giữa $.ajax(), $.get() và $.post() là gì?

  • $.ajax(): Phương thức toàn diện nhất, cho phép bạn tùy chỉnh gần như mọi khía cạnh của request: method, headers, timeout, xử lý lỗi,…
  • $.get(): Một phiên bản rút gọn của $.ajax() chuyên dùng để gửi request GET nhanh chóng. Hỗ trợ xử lý lỗi qua .fail() hoặc tham số error.
  • $.post(): Tương tự get(), nhưng dành cho các request POST. Cũng hỗ trợ xử lý lỗi tương tự.

Nếu bạn cần sự linh hoạt, hãy dùng $.ajax(). Nếu chỉ cần gửi nhận dữ liệu đơn giản, $.get() hoặc $.post() là đủ.

Sự khác nhau giữa AJAX và jQuery là gì?

Về mặt kỹ thuật, AJAX là một phương pháp hoặc kỹ thuật được sử dụng để kết nối với máy chủ mà không cần làm mới hoặc tải lại trang web trong khi jQuery là một thư viện JavaScript giúp đơn giản hóa AJAX và nhiều tác vụ khác. Nó giúp tạo ra các trang web có độ phản hồi và tương tác tốt hơn.

Xem thêm: Framework là gì? Top 15+ framework web, mobile phổ biến

Dưới đây là bảng tổng hợp một số điểm khác biệt giữa AJAX và jQuery như sau:

Yếu tốAJAXjQuery
Phụ thuộcJavaScript thuần.Thư viện JavaScript.
Độ dài mãViết nhiều mã hơn.Cần ít mã hơn.
Khả năng tương thíchCho phép lập trình viên tự xử lý khả năng tương thích giữa các trình duyệt.Trừu tượng hóa các vấn đề và sự không nhất quán giữa các trình duyệt.
DOMKhông hỗ trợ.Khả năng thao tác DOM mạnh mẽ
Xử lý lỗiXử lý lỗi thủ công.Cung cấp cơ chế xử lý lỗi tích hợp sẵn.
Mức độ phức tạpCần có kiến thức về JavaScript.Rất trực quan và thân thiện với người mới hơn so với AJAX.
Plugin & Cộng đồngÍt được cộng đồng hỗ trợ hơn so với jQuery.Có nhiều plugin và tài nguyên, cộng đồng lớn mạnh.
Khả năng mở rộngDễ dàng mở rộng với các thư viện JavaScript khác.Có thể mở rộng với các plugin jQuery bổ sung.

Mục đích chính của việc sử dụng AJAX với jQuery là gì?

Với AJAX jQuery, bạn có thể dễ dàng yêu cầu văn bản, XML, HTML hoặc JSON từ máy chủ với sự hỗ trợ từ HTTP Post và HTTP Get. Ngoài ra, mục đích khác của việc sử dụng AJAX với jQuery có thể bao gồm:

  • Yêu cầu không đồng bộ.
  • Cập nhật dữ liệu định kỳ (polling), không phải thời gian thực như WebSocket.
  • Nâng cao trải nghiệm người dùng.
  • Giảm thiểu việc sử dụng bandwidth.
  • Xác thực và gửi dữ liệu.
  • Nâng cao hiệu suất.
  • Gửi biểu mẫu hoặc xác thực dữ liệu người dùng.
  • Cải thiện hiệu suất bằng cách giảm tải server và chỉ cập nhật một phần trang web.

Có thể sử dụng AJAX mà không cần jQuery không?

Câu trả lời là Có. AJAX là một phần của JavaScript, nên bạn có thể dùng XMLHttpRequest hoặc API hiện đại như fetch() để thay thế jQuery. Một số bước chính bạn có thể tham khảo khi sử dụng AJAX không cần jQuery:

  • Phát triển Đối tượng XMLHttpRequest.
  • Thiết lập yêu cầu.
  • Quản lý phản hồi.
  • Gửi yêu cầu.

Tuy nhiên, việc sử dụng jQuery sẽ giúp viết mã ngắn gọn hơn và phù hợp với các dự án không cần framework phức tạp.

Nguyên nhân phổ biến gây ra lỗi AJAX trong jQuery là gì?

Lỗi AJAX có thể xuất phát từ nhiều yếu tố, bao gồm sự cố kết nối mạng, lỗi phía máy chủ, định dạng dữ liệu không hợp lệ và cấu hình yêu cầu không chính xác. 

Tổng kết về AJAX jQuery 

AJAX jQuery không chỉ là một kỹ thuật lập trình, mà còn giúp tối ưu trải nghiệm người dùng và cải thiện hiệu suất của website. Qua bài viết từ ITviec, hy vọng bạn đã nắm được cách sử dụng các phương thức như $.ajax(), $.get() và $.post() một cách thành thạo để xây dựng các ứng dụng web linh hoạt và hiện đại hơn nhé.

Xem thêm: Front end là gì? Hướng tiếp cận cho người mới bắt đầu

TÁC GIẢ
Uyen Ngo
Uyen Ngo

Content Writer

Hơn 1 năm kinh nghiệm viết lách trong lĩnh vực lập trình, thiết kế Game, AI cùng sự nghiên cứu chuyên sâu về các chủ đề IT, Uyên đem đến các bài viết chất lượng và hữu ích về khía cạnh Front-End, Unity, Unreal Engine, Trí tuệ nhân tạo,… Cùng với đó là các bài hướng dẫn lập trình từ cơ bản đến nâng cao (HTML, JavaScript, CSS, Website Development,...). Uyên luôn ưu tiên mang đến thông tin được cập nhật liên tục và phù hợp với xu hướng công nghệ hiện nay.