Tìm hiểu Browser Object Model - BOM trong JavaScript

JavaScript HTML DOM | by Học Javascript

Khi xây dựng các ứng dụng web bằng JavaScript, chúng ta không chỉ làm việc với nội dung của trang web thông qua HTML DOM, mà còn cần tương tác với chính trình duyệt web – nơi JavaScript được thực thi. Đây là lúc Browser Object Model (BOM) phát huy vai trò quan trọng.

BOM là một phần mở rộng của môi trường JavaScript trong trình duyệt, cho phép lập trình viên thao tác với các yếu tố bên ngoài của tài liệu HTML như cửa sổ trình duyệt, thanh địa chỉ, lịch sử truy cập, thông tin trình duyệt, và hơn thế nữa. Nhờ BOM, JavaScript có thể điều hướng đến một trang khác, hiển thị cảnh báo, mở cửa sổ mới, kiểm tra thông tin thiết bị của người dùng hoặc thao tác với thời gian một cách linh hoạt.

Trong bài viết này, mình sẽ cùng tìm hiểu chi tiết về Browser Object Model, các thành phần chính như window, location, history, navigator, screen, cũng như các ứng dụng thực tế và lưu ý quan trọng khi sử dụng BOM trong quá trình phát triển ứng dụng web.

Khái niệm BOM là gì?

Định nghĩa Browser Object Model (BOM)

BOM (Browser Object Model) là một phần của môi trường thực thi JavaScript trong trình duyệt web, cho phép lập trình viên tương tác với chính trình duyệt, ngoài phạm vi nội dung HTML.
Không giống như DOM (Document Object Model) – nơi JavaScript truy cập và thay đổi cấu trúc tài liệu HTML – BOM hỗ trợ JavaScript làm việc với các thành phần như:

  • Cửa sổ trình duyệt (window)

  • Thanh địa chỉ (URL) (location)

  • Lịch sử truy cập (history)

  • Thông tin trình duyệt và thiết bị (navigator)

  • Thông tin màn hình (screen)

  • Thời gian thực thi (setTimeout, setInterval)

  • Cửa sổ popup hoặc cảnh báo (alert, prompt, confirm)

BOM không được quy chuẩn như DOM (W3C không định nghĩa chính thức về BOM), nên có thể có một vài khác biệt nhỏ giữa các trình duyệt.

BOM so với DOM – Giống và Khác nhau

Tiêu chí DOM (Document Object Model) BOM (Browser Object Model)
Mục đích chính Quản lý cấu trúc nội dung HTML Tương tác với trình duyệt web
Đối tượng gốc document window
Thao tác điển hình Truy cập thẻ HTML, thay đổi nội dung, sự kiện Hiển thị hộp thoại, đổi URL, điều hướng trang
Chuẩn hóa Được chuẩn hóa bởi W3C Không được chuẩn hóa chính thức
Quan hệ DOM là một phần con trong cây BOM (window.document) BOM bao trùm cả DOM

Vì sao BOM quan trọng trong JavaScript?

BOM đóng vai trò rất quan trọng trong việc:

  • Điều hướng trang web: Chuyển hướng hoặc tải lại trang bằng location.href, location.reload().

  • Tương tác người dùng: Hiển thị thông báo (alert()), xác nhận (confirm()), lấy dữ liệu người dùng (prompt()).

  • Kiểm soát thời gian: Dùng setTimeout()setInterval() để thực hiện hành động theo thời gian.

  • Truy cập thông tin hệ thống: Biết được trình duyệt, ngôn ngữ, hệ điều hành của người dùng (navigator).

  • Quản lý lịch sử: Cho phép điều hướng tới trang trước/sau trong phiên duyệt web bằng history.back(), history.forward().

Các thành phần chính của BOM trong JavaScript

BOM (Browser Object Model) cung cấp nhiều đối tượng giúp chúng ta có thể tương tác với trình duyệt, cửa sổ, và các thông tin liên quan đến trình duyệt. Dưới đây là các thành phần chính trong BOM:

Đối tượng window

window là đối tượng gốc trong BOM, đại diện cho cửa sổ trình duyệt. Đây là đối tượng bao trùm, có thể truy cập và thao tác với tất cả các thành phần khác trong BOM. Khi làm việc với JavaScript trong trình duyệt, bạn thường làm việc trực tiếp với đối tượng window.

Các thuộc tính và phương thức phổ biến của window:

  • window.alert(): Hiển thị hộp thoại cảnh báo với thông báo tùy ý.

window.alert("Đây là cảnh báo!");

window.setTimeout(): Thực hiện một hành động sau một khoảng thời gian nhất định (chỉ thực hiện một lần).

window.setTimeout(function() {
  alert("Đã hết thời gian!");
}, 2000); // Sau 2 giây

window.setInterval(): Thực hiện một hành động lặp lại sau một khoảng thời gian xác định.

window.setInterval(function() {
  console.log("Hành động này lặp lại mỗi 1 giây.");
}, 1000);

window.open(): Mở một cửa sổ mới trong trình duyệt.

window.open("https://www.google.com", "_blank");

window.close(): Đóng cửa sổ hiện tại (chỉ hoạt động với cửa sổ được mở bởi window.open()).

window.close();

Đối tượng navigator

navigator cung cấp thông tin về trình duyệt, hệ điều hành, và trạng thái kết nối của người dùng. Đây là đối tượng rất hữu ích để xác định môi trường của người dùng khi phát triển ứng dụng web.

Các thuộc tính thường dùng của navigator:

navigator.userAgent: Trả về chuỗi chứa thông tin về trình duyệt và hệ điều hành.

console.log(navigator.userAgent);
// Ví dụ: "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"

navigator.language: Trả về ngôn ngữ mặc định của trình duyệt.

console.log(navigator.language); 
// Ví dụ: "en-US"

navigator.platform: Trả về nền tảng hệ điều hành mà trình duyệt đang chạy (ví dụ: Windows, MacOS, Linux).

console.log(navigator.platform); 
// Ví dụ: "Win32"

navigator.onLine: Trả về true nếu thiết bị của người dùng đang kết nối Internet, false nếu không.

console.log(navigator.onLine); // true hoặc false

Đối tượng screen

screen cung cấp thông tin về màn hình của người dùng, chẳng hạn như kích thước của màn hình, độ phân giải, và các đặc điểm khác.

Các thuộc tính của screen:

screen.width: Lấy chiều rộng của màn hình tính bằng pixel.

console.log(screen.width); // Ví dụ: 1920

screen.height: Lấy chiều cao của màn hình tính bằng pixel.

console.log(screen.height); // Ví dụ: 1080

screen.availWidth: Lấy chiều rộng có sẵn của màn hình (không tính các thanh tác vụ hoặc thanh menu).

console.log(screen.availWidth); // Ví dụ: 1920

screen.availHeight: Lấy chiều cao có sẵn của màn hình (không tính thanh tác vụ).

console.log(screen.availHeight); // Ví dụ: 1040

Đối tượng location

location cung cấp thông tin về URL hiện tại của trang web và cho phép bạn thay đổi hoặc điều hướng đến các URL khác.

Các phương thức và thuộc tính của location:

location.href: Trả về URL của trang hiện tại. Có thể thay đổi URL của trang để điều hướng đến trang mới.

console.log(location.href); // Lấy URL hiện tại
location.href = "https://www.google.com"; // Chuyển hướng đến Google

location.hostname: Trả về tên miền của trang web.

console.log(location.hostname); // Ví dụ: "www.example.com"

location.reload(): Làm mới lại trang hiện tại.

location.reload(); // Làm mới trang

location.assign(): Điều hướng đến một URL mới.

location.assign("https://www.example.com");

Đối tượng history

history quản lý lịch sử duyệt web của người dùng trong trình duyệt, cho phép bạn di chuyển qua các trang đã truy cập trước đó.

Các phương thức của history:

history.back(): Quay lại trang trước đó trong lịch sử duyệt web.

history.back(); // Quay lại trang trước

history.forward(): Tiến về phía trước trong lịch sử duyệt web.

history.forward(); // Tiến về trang sau

history.go(): Di chuyển đến một trang cụ thể trong lịch sử.

history.go(-2); // Quay lại 2 trang trước đó

Các phương thức tiện ích của BOM trong JavaScript

BOM (Browser Object Model) cung cấp nhiều phương thức hữu ích giúp tương tác với người dùng, điều khiển cửa sổ trình duyệt, và thực hiện các thao tác thời gian. Dưới đây là các phương thức tiện ích của BOM:

alert(), confirm(), prompt() – Hộp thoại tương tác

Các phương thức này cho phép bạn hiển thị hộp thoại để tương tác với người dùng, giúp thu thập thông tin hoặc hiển thị thông báo.

alert(): Hiển thị một hộp thoại đơn giản với thông báo và nút "OK". Thường dùng để cảnh báo người dùng.

alert("Chào bạn, đây là một thông báo!");

confirm(): Hiển thị một hộp thoại với thông báo và hai nút: "OK" và "Cancel". Trả về true nếu người dùng nhấn "OK" và false nếu nhấn "Cancel".

var result = confirm("Bạn có muốn tiếp tục?");
if (result) {
  alert("Bạn đã chọn OK");
} else {
  alert("Bạn đã chọn Cancel");
}

prompt(): Hiển thị hộp thoại yêu cầu người dùng nhập dữ liệu. Trả về giá trị nhập vào, hoặc null nếu người dùng hủy bỏ.

var name = prompt("Nhập tên của bạn:");
if (name) {
  alert("Xin chào, " + name);
}

setTimeout(), setInterval() – Tạo độ trễ, lặp thời gian

Các phương thức này cho phép bạn thực hiện một hành động sau một khoảng thời gian, hoặc lặp lại hành động sau một khoảng thời gian cố định.

setTimeout(): Thiết lập một hành động chỉ được thực hiện sau một khoảng thời gian nhất định (một lần duy nhất).

setTimeout(function() {
  alert("2 giây đã trôi qua!");
}, 2000); // Chạy sau 2 giây

setInterval(): Thiết lập một hành động được thực hiện liên tục sau mỗi khoảng thời gian cố định.

var intervalId = setInterval(function() {
  console.log("Hành động này lặp lại mỗi 2 giây.");
}, 2000);

// Để dừng lại sau 10 giây:
setTimeout(function() {
  clearInterval(intervalId);
}, 10000); // Dừng sau 10 giây

open(), close() – Mở/đóng cửa sổ mới

window.open(): Mở một cửa sổ mới hoặc tab mới trong trình duyệt.

var newWindow = window.open("https://www.example.com", "_blank");

window.close(): Đóng cửa sổ hiện tại hoặc cửa sổ đã được mở thông qua window.open().

newWindow.close(); // Đóng cửa sổ đã mở

BOM và việc thao tác với trình duyệt trong JavaScript

BOM không chỉ cung cấp các phương thức tiện ích mà còn giúp bạn tương tác sâu với trình duyệt, điều khiển cửa sổ, tab và quản lý việc điều hướng trang web. Dưới đây là một số cách thức thao tác với trình duyệt qua BOM:

Kiểm tra thông tin trình duyệt và nền tảng

navigator.userAgent: Trả về chuỗi đại diện cho thông tin về trình duyệt và hệ điều hành.

console.log(navigator.userAgent);

navigator.platform: Trả về nền tảng mà trình duyệt đang chạy trên đó (ví dụ: Windows, MacOS).

console.log(navigator.platform);

navigator.language: Trả về ngôn ngữ của trình duyệt.

console.log(navigator.language);

Điều hướng URL hoặc tải lại trang

BOM cung cấp đối tượng location cho phép bạn điều hướng và thay đổi URL của trang hiện tại, cũng như tải lại trang web.

location.href: Đổi URL của trang hoặc lấy URL hiện tại.

location.href = "https://www.newpage.com"; // Điều hướng đến một trang mới

location.reload(): Tải lại trang web hiện tại.

location.reload(); // Làm mới trang hiện tại

Tương tác với nhiều cửa sổ/trang/tab

BOM cho phép mở nhiều cửa sổ hoặc tab, và bạn có thể điều khiển các cửa sổ đó thông qua đối tượng window.

window.open(): Mở một cửa sổ/tab mới.

var newWindow = window.open("https://www.example.com", "_blank");

window.close(): Đóng cửa sổ/tab đã mở.

newWindow.close(); // Đóng cửa sổ đã mở

Cảnh báo người dùng khi rời khỏi trang (beforeunload)

Khi người dùng cố gắng rời khỏi trang (chuyển trang hoặc đóng tab), bạn có thể cảnh báo họ trước khi thực hiện hành động đó.

beforeunload: Xử lý sự kiện khi người dùng chuẩn bị rời khỏi trang.

window.addEventListener("beforeunload", function(event) {
  var confirmationMessage = "Bạn có chắc chắn muốn rời khỏi trang?";
  event.returnValue = confirmationMessage; // Cảnh báo người dùng
  return confirmationMessage; // Phần này có thể không hiển thị trên một số trình duyệt
});

Bằng cách sử dụng các phương thức và đối tượng trong BOM, bạn có thể quản lý trang web, cửa sổ, và các thao tác liên quan đến người dùng một cách linh hoạt và hiệu quả. BOM không chỉ giúp nâng cao trải nghiệm người dùng mà còn cho phép bạn quản lý và điều khiển các hành động trong trình duyệt dễ dàng.

Lưu ý khi sử dụng BOM trong JavaScript

Khi làm việc với Browser Object Model (BOM), có một số điều bạn cần lưu ý để đảm bảo các tính năng hoạt động chính xác và không gây ảnh hưởng xấu đến trải nghiệm người dùng. Dưới đây là các lưu ý quan trọng:

Một số chức năng bị hạn chế trong trình duyệt hiện đại vì lý do bảo mật

  • Popup Blocker: Một trong những vấn đề thường gặp khi sử dụng phương thức như window.open() là trình duyệt có thể tự động chặn cửa sổ pop-up. Điều này được thực hiện để bảo vệ người dùng khỏi các cửa sổ quảng cáo không mong muốn hoặc các hành động đáng ngờ. Trình duyệt hiện đại thường chỉ cho phép mở cửa sổ mới khi người dùng tương tác trực tiếp với trang (ví dụ: nhấn vào một nút hoặc liên kết).

    Giải pháp: Đảm bảo rằng cửa sổ pop-up chỉ mở khi người dùng thực hiện hành động như nhấp chuột hoặc kích hoạt một sự kiện hợp lệ, giúp tránh việc bị chặn bởi popup blocker.

Không nên lạm dụng alert() và prompt() vì gây khó chịu cho người dùng

  • alert(), confirm(), và prompt() là những phương thức hữu ích nhưng có thể gây khó chịu cho người dùng nếu sử dụng quá nhiều hoặc không hợp lý. Các hộp thoại này ngừng mọi hoạt động của trang web cho đến khi người dùng tương tác với chúng, điều này có thể làm gián đoạn trải nghiệm người dùng.

    Giải pháp: Thay vì sử dụng alert() hoặc prompt(), hãy sử dụng các phương thức khác để hiển thị thông báo hoặc yêu cầu thông tin người dùng một cách nhẹ nhàng hơn, chẳng hạn như sử dụng các modals tùy chỉnh hoặc các hộp thoại không đồng bộ.

BOM phụ thuộc vào môi trường trình duyệt – cần kiểm tra tương thích

  • Các tính năng của BOM có thể hoạt động khác nhau tùy thuộc vào trình duyệt mà người dùng sử dụng. Ví dụ, không phải tất cả các trình duyệt đều hỗ trợ các phương thức như window.localStorage hoặc window.sessionStorage, hoặc một số trình duyệt có thể không hỗ trợ đầy đủ các phương thức của đối tượng navigator hoặc location.

    Giải pháp: Khi phát triển ứng dụng web, hãy kiểm tra tính tương thích của các phương thức BOM trên các trình duyệt khác nhau và cung cấp giải pháp thay thế hoặc kiểm tra điều kiện trước khi sử dụng các phương thức này. Bạn có thể sử dụng các công cụ như Can I Use để kiểm tra sự hỗ trợ của các tính năng BOM trong các trình duyệt phổ biến.

Ứng dụng thực tế của BOM trong JavaScript

BOM cung cấp nhiều khả năng mạnh mẽ để xây dựng các ứng dụng web tương tác và nâng cao trải nghiệm người dùng. Dưới đây là một số ứng dụng thực tế của BOM:

Tạo bộ đếm thời gian tự động làm mới nội dung

BOM giúp bạn tạo các bộ đếm thời gian để làm mới nội dung trên trang web tự động hoặc cập nhật theo một khoảng thời gian nhất định, mà không cần người dùng phải tải lại trang.

Ví dụ: Tạo một bộ đếm thời gian tự động mỗi 5 giây để cập nhật lại một phần nội dung trên trang web.

setInterval(function() {
  document.getElementById("content").innerHTML = "Nội dung mới được tải lại!";
}, 5000); // Cập nhật nội dung mỗi 5 giây

Điều hướng người dùng dựa trên URL

Sử dụng đối tượng location trong BOM để điều hướng người dùng đến một URL mới hoặc thay đổi URL của trang hiện tại mà không cần phải tải lại trang.

Ví dụ: Điều hướng người dùng đến một trang khác sau khi hoàn tất một hành động cụ thể.

window.location.href = "https://www.example.com"; // Điều hướng đến trang mới

Ví dụ khác: Tải lại trang hiện tại để cập nhật thông tin.

location.reload(); // Làm mới trang hiện tại

BOM cung cấp các đối tượng như navigatorhistory, giúp bạn theo dõi và thu thập thông tin về hành vi của người dùng.

navigator giúp bạn biết thông tin về trình duyệt, ngôn ngữ, nền tảng của người dùng.

console.log(navigator.userAgent); // In ra chuỗi thông tin về trình duyệt

history cho phép bạn quản lý lịch sử trình duyệt, ví dụ như quay lại hoặc tiến tới trang trước.

history.back(); // Quay lại trang trước

Kết bài

Browser Object Model (BOM) trong JavaScript là một phần quan trọng trong việc phát triển ứng dụng web, giúp các lập trình viên tương tác với trình duyệt và xây dựng các tính năng động, linh hoạt. Các đối tượng như window, navigator, location, history, và screen cung cấp một loạt các phương thức và thuộc tính hữu ích, giúp kiểm soát hành vi của trình duyệt, điều hướng URL, quản lý cửa sổ và theo dõi thông tin người dùng.

Mặc dù BOM mang lại nhiều tiện ích, nhưng việc sử dụng nó cũng cần lưu ý đến vấn đề bảo mật, hiệu suất và tính tương thích với các trình duyệt khác nhau. Bằng cách hiểu rõ và sử dụng BOM một cách hợp lý, bạn có thể tạo ra những ứng dụng web mạnh mẽ, tương tác và tối ưu cho người dùng.

Với khả năng điều khiển trình duyệt và các cửa sổ một cách linh hoạt, BOM sẽ tiếp tục đóng vai trò quan trọng trong việc phát triển ứng dụng web hiện đại. Hãy luôn chú ý đến việc cải thiện trải nghiệm người dùng và đảm bảo các tính năng BOM không làm giảm hiệu suất hay gây khó chịu cho người dùng.

Bài viết liên quan