Lịch sử trình duyệt với Web History API trong JavaScript

Javascript nâng cao | by Học Javascript

Trong thời đại web hiện đại, các ứng dụng ngày càng trở nên linh hoạt và tương tác hơn. Người dùng mong đợi trải nghiệm mượt mà, không gián đoạn, kể cả khi chuyển trang hay tương tác với các thành phần trong giao diện. Đó là lý do tại sao Single Page Application (SPA) – ứng dụng web chỉ có một trang nhưng có thể thay đổi nội dung động – ngày càng phổ biến.

Tuy nhiên, để ứng dụng hoạt động như một trang web thông thường, người dùng vẫn cần sử dụng các chức năng như nút Back, Forward, hoặc gõ URL trực tiếp vào thanh địa chỉ. Lúc này, Web History API trong JavaScript trở thành một công cụ vô cùng hữu ích. Nó cho phép lập trình viên kiểm soát lịch sử trình duyệt, thay đổi URL mà không cần tải lại trang, đồng thời duy trì trải nghiệm người dùng mượt mà và logic điều hướng hợp lý.

Vậy cụ thể Web History API là gì, hoạt động ra sao và có thể ứng dụng như thế nào trong thực tế? Hãy cùng tìm hiểu trong bài viết sau.

Web History API là gì?

Web History API là một giao diện lập trình ứng dụng (API) do trình duyệt web cung cấp, cho phép các lập trình viên JavaScript truy cập, thao tác và điều khiển lịch sử duyệt web của người dùng. Thông qua đối tượng toàn cục window.history, bạn có thể thực hiện các hành động như quay lại trang trước, tiến tới trang sau, hoặc thậm chí thêm và thay đổi URL trên thanh địa chỉ mà không cần tải lại trang.

Đây là một phần quan trọng trong việc xây dựng các ứng dụng web hiện đại, đặc biệt là Single Page Applications (SPA) – nơi mà toàn bộ nội dung được xử lý bằng JavaScript và không sử dụng cơ chế điều hướng truyền thống của trình duyệt.

Mục đích sử dụng chính

Điều hướng tới các trang trước hoặc sau trong lịch sử duyệt web

Web History API cung cấp các phương thức như history.back()history.forward() để mô phỏng thao tác của người dùng khi nhấn nút “quay lại” hoặc “tiến tới” trên trình duyệt. Điều này giúp xây dựng các chức năng điều hướng mượt mà và linh hoạt, đặc biệt hữu ích trong các ứng dụng có nhiều bước (multi-step form, trình xem ảnh, trình duyệt tab...).

Thêm hoặc thay đổi trạng thái URL mà không tải lại trang

Thông qua hai phương thức mạnh mẽ là history.pushState()history.replaceState(), bạn có thể cập nhật URL hiển thị trên thanh địa chỉ mà không làm trang bị reload. Điều này đặc biệt quan trọng với SPA – nơi nội dung thay đổi nhưng không thực sự chuyển trang.

Ví dụ: Khi người dùng chuyển từ /san-pham sang /san-pham/ao-thun, bạn có thể cập nhật URL để phản ánh đúng trạng thái nội dung mà vẫn giữ nguyên trang hiện tại.

Hỗ trợ điều hướng và quản lý trạng thái trong SPA

Trong các SPA, việc điều hướng hoàn toàn do JavaScript kiểm soát. Lúc này, Web History API đóng vai trò như một cầu nối giữa ứng dụng và trình duyệt, giúp đồng bộ hóa hành vi của giao diện với thanh địa chỉ và nút back/forward của trình duyệt.

Ngoài ra, bạn còn có thể lưu trữ trạng thái tùy chỉnh trong đối tượng state, từ đó tái hiện nội dung giao diện đúng với vị trí mà người dùng đã truy cập trước đó.

Các phương thức quan trọng trong History API

Đối tượng window.history cung cấp nhiều phương thức hữu ích giúp thao tác với lịch sử trình duyệt. Dưới đây là các phương thức quan trọng bạn cần nắm:

history.back()

  • Chức năng: Điều hướng quay trở lại trang trước đó trong lịch sử duyệt web của trình duyệt.

  • Tương đương: Như khi người dùng nhấn nút "Back" trên trình duyệt.

Ví dụ:

history.back();

history.forward()

  • Chức năng: Di chuyển tới trang kế tiếp trong lịch sử, nếu trước đó đã từng quay lại trang cũ.

  • Tương đương: Như khi người dùng nhấn nút "Forward" trên trình duyệt.

Ví dụ:

history.forward();

history.go(n)

  • Chức năng: Di chuyển tới một vị trí tương đối trong lịch sử trình duyệt.

n là số nguyên:

  • n > 0: tiến tới

  • n < 0: quay lại

  • n = 0: tải lại trang hiện tại

Ví dụ:

history.go(-1); // tương đương history.back()
history.go(1);  // tương đương history.forward()
history.go(0);  // reload lại trang

history.pushState(state, title, url)

  • Chức năng: Thêm một mục mới vào lịch sử trình duyệt, đồng thời cập nhật URL trên thanh địa chỉ mà không làm tải lại trang.

Cú pháp:

history.pushState(stateObject, title, url);

Tham số:

  • stateObject: một đối tượng JSON đại diện cho trạng thái (có thể là {} nếu không dùng).

  • title: (hiện chưa được trình duyệt sử dụng, có thể để chuỗi rỗng "").

  • url: chuỗi URL mới (có thể là tương đối).

Ví dụ:

history.pushState({ page: 2 }, "", "/page2");

history.replaceState(state, title, url)

  • Chức năng: Thay thế entry hiện tại trong lịch sử bằng entry mới, không tạo thêm mục mới.

  • Dùng khi bạn muốn cập nhật URL nhưng không muốn người dùng “quay lại” được.

Cú pháp và ví dụ:

history.replaceState({ page: 1 }, "", "/home");

window.onpopstate

  • Chức năng: Lắng nghe sự kiện khi người dùng quay lại hoặc tiến tới thông qua các thao tác với trình duyệt (Back/Forward).

  • Được kích hoạt khi entry trong lịch sử được thay đổi.

  • Dùng để xử lý lại nội dung giao diện tương ứng với trạng thái state đã lưu bằng pushState() hoặc replaceState().

Ví dụ:

window.onpopstate = function(event) {
  console.log("Quay lại hoặc tiến tới", event.state);
  // Cập nhật nội dung tương ứng với state
};

So sánh pushState() và replaceState() trong JavaScript

Giống nhau

  • Không tải lại trang: Cả hai phương thức đều giúp cập nhật URL mà không làm reload lại trang, điều này giúp tối ưu hiệu suất và mang lại trải nghiệm mượt mà cho người dùng.

  • Cập nhật URL: Cho phép thay đổi đường dẫn hiển thị trên thanh địa chỉ trình duyệt mà không cần thực hiện điều hướng đến một trang mới.

  • Có thể lưu trạng thái: Cả hai đều cho phép đính kèm một đối tượng state để lưu thông tin về trạng thái trang hiện tại, hỗ trợ việc quản lý nội dung linh hoạt.

Khác nhau

Tiêu chí pushState() replaceState()
Tác động đến lịch sử Thêm một mục mới vào lịch sử trình duyệt Ghi đè mục hiện tại trong lịch sử
Có thể “quay lại” Có, người dùng có thể back lại trạng thái trước đó Không, vì không tạo mục mới
Ứng dụng Dùng khi chuyển sang nội dung mới Dùng khi cập nhật nội dung nhỏ, không cần lưu lại trạng thái trước đó

Ví dụ minh họa:

// pushState - thêm một entry mới vào history
history.pushState({ page: "about" }, "", "/about");

// replaceState - ghi đè entry hiện tại
history.replaceState({ page: "home" }, "", "/home");

Ứng dụng thực tế của Web History API trong JavaScript

Tạo ứng dụng Single Page Application (SPA)

  • Web History API là xương sống của SPA, nơi toàn bộ nội dung thay đổi bằng JavaScript.

  • Giúp điều hướng giữa các “trang ảo” như /home, /about, /contact mà không cần tải lại.

  • Trải nghiệm người dùng mượt mà như ứng dụng desktop.

Tùy biến URL thân thiện với SEO và người dùng

  • Khi người dùng lọc, tìm kiếm, chuyển tab,... bạn có thể cập nhật URL tương ứng.

  • Giúp người dùng sao chép và chia sẻ URL chính xác với trạng thái nội dung hiện tại.

Một số URL ví dụ:

/san-pham?danh-muc=ao-thun
/blog/huong-dan-su-dung-history-api

Kết hợp với sự kiện popstate để điều hướng hợp lý

  • Khi người dùng nhấn nút Back hoặc Forward, sự kiện popstate giúp bạn cập nhật lại giao diện tương ứng với state đã lưu.

  • Đảm bảo tính nhất quán giữa URL và nội dung hiển thị.

Ví dụ:

window.onpopstate = function(event) {
  const state = event.state;
  if (state && state.page === "about") {
    renderAboutPage();
  } else {
    renderHomePage();
  }
};

Một số ví dụ minh họa

1. Sử dụng pushState() để cập nhật URL khi chuyển nội dung

document.getElementById("btn-about").onclick = () => {
  history.pushState({ page: "about" }, "", "/about");
  renderAboutPage(); // hàm cập nhật nội dung tương ứng
};

2. Bắt sự kiện popstate để thay đổi nội dung khi Back/Forward

window.addEventListener("popstate", (event) => {
  const page = event.state?.page;
  if (page === "about") {
    renderAboutPage();
  } else {
    renderHomePage();
  }
});
3. Dùng go(-1) để xử lý nút “quay lại”
document.getElementById("btn-back").onclick = () => {
  history.go(-1); // quay về entry trước đó
};

Ưu điểm và hạn chế của Web History API trong JavaScript

Ưu điểm

Không cần tải lại trang (No page reload)

  • pushState()replaceState() cho phép cập nhật URL mà không tải lại toàn bộ trang.

  • Điều này giúp giảm thiểu độ trễ, tăng hiệu năng và tối ưu trải nghiệm người dùng.

Dễ dàng tích hợp vào ứng dụng SPA

  • Web History API là công cụ quan trọng trong việc xây dựng các ứng dụng SPA hiện đại, nơi nội dung trang được cập nhật bằng JavaScript thay vì tải lại toàn bộ.

  • Giúp tạo cảm giác “chuyển trang” như thật, nhưng vẫn ở trong một trang HTML duy nhất.

Trải nghiệm người dùng mượt mà hơn

  • Việc điều hướng nội dung không giật lag hay mất trạng thái như các trang tĩnh truyền thống.

  • Người dùng có thể di chuyển giữa các trạng thái nội dung dễ dàng, sử dụng nút Back/Forward như bình thường mà không gặp lỗi.

Cập nhật URL linh hoạt

  • Cho phép thay đổi URL động theo trạng thái nội dung (ví dụ: lọc sản phẩm, mở popup, chuyển tab...).

  • Rất hữu ích để tối ưu SEO, chia sẻ liên kết, và lưu trạng thái phiên làm việc.

Hạn chế

Không hỗ trợ tốt trên một số trình duyệt cũ

  • Một số phiên bản trình duyệt cũ (như Internet Explorer trước IE10) không hỗ trợ đầy đủ Web History API.

  • Khi làm việc với các ứng dụng cần tương thích ngược, bạn sẽ cần thêm lớp polyfill hoặc giải pháp thay thế.

Xử lý logic phức tạp với popstate

  • Khi sử dụng pushState()popstate, lập trình viên cần tự quản lý logic cập nhật nội dung ứng với từng trạng thái.

  • Với các ứng dụng có nhiều trạng thái lồng nhau hoặc chuyển trang phức tạp, code điều hướng có thể trở nên khó bảo trì.

Không thể kiểm soát toàn bộ lịch sử

  • Bạn không thể đọc toàn bộ danh sách URL trong history (do lý do bảo mật), chỉ có thể di chuyển tới vị trí tương đối.

  • Điều này khiến bạn phụ thuộc vào state đã lưu trước đó, nếu chưa quản lý tốt thì việc back/forward sẽ dễ bị lỗi hoặc không chính xác.

Kết bài

Web History API là một phần quan trọng trong bộ công cụ của lập trình viên web hiện đại, đặc biệt khi xây dựng các ứng dụng Single Page Application (SPA). Với khả năng thay đổi URL mà không cần tải lại trang, cùng với việc lưu trữ và điều hướng trạng thái một cách linh hoạt, Web History API giúp cải thiện hiệu năng, trải nghiệm người dùng và khả năng điều hướng trong ứng dụng.

Tuy vẫn còn một số hạn chế như cần xử lý thủ công các trạng thái hoặc không tương thích với trình duyệt cũ, nhưng khi được sử dụng hợp lý, API này sẽ trở thành một công cụ mạnh mẽ giúp bạn phát triển giao diện web tương tác, mượt mà và chuyên nghiệp hơn.

Việc hiểu rõ cách hoạt động và áp dụng Web History API sẽ là bước đệm vững chắc để bạn tiến xa hơn trong quá trình xây dựng các ứng dụng web hiện đại.

Bài viết liên quan