Trong lớp học lập trình này, bạn sẽ tìm hiểu cách điều chỉnh nội dung dựa trên chất lượng mạng. Video nền của trang này sẽ chỉ tải khi người dùng đang sử dụng mạng nhanh. Trên các mạng chậm hơn, hình ảnh sẽ tải.
API Thông tin mạng cho phép bạn truy cập thông tin về chất lượng kết nối của người dùng. Bạn sẽ sử dụng thuộc tính effectiveType
để quyết định thời điểm phân phát video và thời điểm phân phát hình ảnh. effectiveType
có thể là 'slow-2g'
, '2g'
, '3g'
hoặc '4g'
.
Bước 1: Kiểm tra loại kết nối
Tệp index.html
chứa thẻ <video>
để hiển thị video nền (dòng 22). Mã trong script.js
tải video bằng cách đặt thuộc tính src
của thẻ video. (Mã tải video được mô tả chi tiết hơn trong Bước 2).
Để tải video theo điều kiện, trước tiên, hãy kiểm tra xem API thông tin mạng có hoạt động hay không; nếu có, hãy kiểm tra loại kết nối.
- Trong
script.js
, hãy thêm câu lệnhif
để kiểm tra xem đối tượngnavigator.connection
có tồn tại và có thuộc tínheffectiveType
hay không. - Thêm câu lệnh
if
để kiểm traeffectiveType
của mạng.
if (navigator.connection && !!navigator.connection.effectiveType) {
if (navigator.connection.effectiveType === '4g') {
// Only load video on the fastest connections.
} else {
// In any other case load the image.
}
}
Gói mã tải video hiện có trong câu lệnh else
để video vẫn sẽ tải trong các trình duyệt không hỗ trợ API thông tin mạng.
if (navigator.connection && !!navigator.connection.effectiveType) {
if (navigator.connection.effectiveType === '4g') {
// video loading code
} else {
// image loading code
}
} else {
const video = document.getElementById('coverVideo');
const videoSource = video.getAttribute('data-src');
video.setAttribute('src', videoSource);
video.setAttribute('style', 'height: 100%; width: 100%; display:inline');
}
Bước 2: Tải video
Nếu effectiveType
là '4g'
, hãy sử dụng mã tải video từ đầu lớp học lập trình.
if (navigator.connection.effectiveType === '4g') {
const video = document.getElementById('coverVideo');
const videoSource = video.getAttribute('data-src');
video.setAttribute('src', videoSource);
video.setAttribute('style', 'height: 100%; width: 100%; display:inline');
} else {
// image loading code
}
Dưới đây là cách hoạt động của mã tải video: thẻ <video>
không tải xuống hoặc hiển thị bất kỳ nội dung nào lúc đầu do thuộc tính src
của thẻ chưa được đặt. URL của video cần tải được chỉ định bằng thuộc tính data-src
.
<video id="coverVideo" autoplay loop muted data-src="https://cdn.glitch.com/b6491350-b058-4eb6-aa6c-55c93122073e%2FMatrix%2C%20Console%2C%20Hacking%2C%20Code.mp4?1551464245607"></video>
Thuộc tính dữ liệu cho phép bạn lưu trữ thêm thông tin về các phần tử HTML tiêu chuẩn. Bạn có thể đặt tên cho một phần tử dữ liệu bất kỳ, miễn là phần tử đó bắt đầu bằng "data-".
Để thực sự hiển thị video trên trang, bạn cần lấy giá trị từ data-src
và đặt giá trị đó làm thuộc tính src
của phần tử video.
Trước tiên, hãy lấy phần tử DOM chứa nội dung:
const video = document.getElementById('coverVideo');
Sau đó, lấy vị trí tài nguyên từ thuộc tính data-src
:
const videoSource = video.getAttribute('data-src');
Cuối cùng, hãy đặt giá trị đó làm thuộc tính src
của phần tử video:
video.setAttribute('src', videoSource);
Dòng cuối cùng đảm nhận vị trí CSS:
video.setAttribute('style', 'height: 100%; width: 100%; display:inline');
Bước 3: Tải hình ảnh
Để tải có điều kiện một hình ảnh trên các mạng chậm hơn, hãy sử dụng cùng một chiến lược như đối với video.
Thêm một thành phần hình ảnh vào index.html
(ngay sau thành phần video) và sử dụng
thuộc tính data-src
thay vì thuộc tính src
.
<img id="coverImage" data-src="https://cdn.glitch.com/36529535-5976-40f8-979b-40c898b86bd0%2F36529535-5976-40f8-979b-40c898b86bd0_1_Sn80dgiwpMjBVrqjfiDbnA.jpg?1553003835358" />
Trong script.js
, hãy thêm mã để đặt thuộc tính src
của hình ảnh tuỳ thuộc vào effectiveType
của mạng.
if (navigator.connection.effectiveType === '4g') {
const video = document.getElementById('coverVideo');
const videoSource = video.getAttribute('data-src');
video.setAttribute('src', videoSource);
video.setAttribute('style', 'height: 100%; width: 100%; display:inline');
} else {
const image = document.getElementById('coverImage');
const imageSource = image.getAttribute('data-src');
image.setAttribute('src', imageSource);
image.setAttribute('style', 'height: 100%; width: 100%; display:inline');
}
Dùng thử
Cách tự kiểm tra:
- Để xem trước trang web, hãy nhấn vào View App (Xem ứng dụng), sau đó nhấn vào Fullscreen (Toàn màn hình).
- Nhấn tổ hợp phím "Control+Shift+J" (hoặc "Command+Option+J" trên máy Mac) để mở Công cụ cho nhà phát triển.
- Nhấp vào thẻ Mạng.
- Nhấp vào trình đơn thả xuống Điều tiết, được đặt thành Không điều tiết theo mặc định. Chọn 3G nhanh.
Bây giờ, hãy tải lại trang khi vẫn bật tính năng 3G nhanh. Ứng dụng tải hình ảnh trong nền thay vì video:
Ghi nhận sự đóng góp bổ sung: Phản hồi các thay đổi
Bạn có nhớ API này có trình nghe sự kiện onchange
không?
Bạn có thể sử dụng API này cho nhiều mục đích: tự động điều chỉnh nội dung, chẳng hạn như chất lượng video, khởi động lại quá trình chuyển dữ liệu bị trì hoãn khi phát hiện thấy thay đổi đối với loại mạng băng thông cao; hoặc thông báo cho người dùng khi chất lượng mạng thay đổi.
Sau đây là một ví dụ đơn giản về cách sử dụng trình nghe này. Thêm vào script.js
. Mã này sẽ gọi hàm displayNetworkInfo
bất cứ khi nào thông tin mạng thay đổi.
navigator.connection.addEventListener('change', displayNetworkInfo);
Đã có một phần tử <h2>
trống trên trang index.html
. Bây giờ, hãy xác định hàm displayNetworkInfo
để hiển thị thông tin mạng trong phần tử <h2>
và gọi hàm đó.
function displayNetworkInfo() {
document.getElementById('connection').innerHTML = navigator.connection.effectiveType;
}
displayNetworkInfo();
Đây là trạng thái cuối cùng của ứng dụng trên Glitch.
Cách kiểm tra lại:
- Để xem trước trang web, hãy nhấn vào View App (Xem ứng dụng), sau đó nhấn vào Fullscreen (Toàn màn hình).
- Nhấn tổ hợp phím "Control+Shift+J" (hoặc "Command+Option+J" trên máy Mac) để mở Công cụ cho nhà phát triển.
- Nhấp vào thẻ Mạng.
- Nhấp vào trình đơn thả xuống Điều tiết, được đặt thành Không điều tiết theo mặc định. Chọn 3G nhanh.
- Tải lại ứng dụng.
Ứng dụng sẽ cập nhật thông tin mạng thành 3g: