Bài học hiện đang bằng tiếng Séc. Giao diện đã được dịch – nội dung bài học sẽ sớm có.

← Cấp 2 – Pháp sư

Bài 8 / 8 ⏱ 60 phút

Thử thách lớn: làm sống cả website

Nhiệm vụ cuối Cấp 2. Tất cả phép thuật cùng lúc – cộng thêm vài ý tưởng mới.

Nhiệm vụ của bạn

Lần này không có bài mới. Bạn nhận danh sách việc, và đã biết đủ để làm. Đúng cách lập trình viên thật làm việc: nhận yêu cầu và ghép từ những gì đã biết.

Phần bắt buộc 🎯

Duyệt website và đảm bảo cả năm phép thuật của cấp này đang sống:

  1. Script nối trên mọi trang và không lỗi trong console (F12 – không có chữ đỏ).
  2. Chế độ tối – công tắc trong header mọi trang, và lựa chọn được nhớ.
  3. Nút hoặc bộ đếm tương tác – ít nhất một phép với biến và điều kiện.
  4. Thư viện ảnh có lightbox – bấm ảnh phóng to.
  5. Câu đố hoặc form có kiểm tra – ít nhất một trong hai. Làm cả hai cũng được!

Phần mở rộng tùy chọn 🌟

Chọn ít nhất một (hoặc tự nghĩ):

Lời chào theo giờ trong ngày

Website chào khác buổi sáng và buổi tối:

<p id="day-greeting"></p>
const dayGreeting = document.getElementById("day-greeting");
const hour = new Date().getHours();

if (hour < 9) {
  dayGreeting.textContent = "Good morning! ☀️";
} else if (hour < 18) {
  dayGreeting.textContent = "Hi there, have a nice day!";
} else {
  dayGreeting.textContent = "Good evening! 🌙";
}

new Date() trả về ngày giờ hiện tại, .getHours() lấy giờ ra.

Tin nhắn ngẫu nhiên mỗi lần bấm

Mỗi lần một câu cười, ý tưởng chuyến đi, hoặc khẩu hiệu đội khác:

const messages = [
  "Practice makes perfect!",
  "Let's go, Eagles! 🦅",
  "You miss every shot you don't take.",
  "Fans are the twelfth player.",
];

const messageButton = document.getElementById("message-button");
const messageEl = document.getElementById("message");

messageButton.addEventListener("click", () => {
  const random = Math.floor(Math.random() * messages.length);
  messageEl.textContent = messages[random];
});

Math.random() trả số ngẫu nhiên từ 0 đến 1, phần còn lại biến thành vị trí ngẫu nhiên trong mảng.

Bộ đếm lượt mở (chỉ bạn thấy)

Bạn mở website bao nhiêu lần? Lưu trong localStorage:

let visits = Number(localStorage.getItem("visits") ?? 0);
visits++;
localStorage.setItem("visits", visits);
console.log("You've opened this page " + visits + " times now");

Number(...) đổi chữ trong bộ nhớ thành số, và ?? 0 nghĩa là “nếu chưa có gì, bắt đầu từ 0.”

Mục thu gọn (accordion)

Ẩn thực đơn dài hoặc danh sách đội dưới tiêu đề bấm được:

const sectionHeading = document.getElementById("expand-heading");
const sectionContent = document.getElementById("expand-content");

sectionHeading.addEventListener("click", () => {
  sectionContent.classList.toggle("hidden");
});

Bạn đã có class .hidden { display: none !important; } từ bài thư viện ảnh.

Đưa phiên bản mới lên internet

Website trên GitHub Pages vẫn là bản cũ từ Cấp 1! Tải bản mới lên:

  1. Mở repository trên github.com,
  2. Add file → Upload files,
  3. kéo file đã đổi (chủ yếu script.js, style.css, và mọi file .html) và bấm Commit changes.

Một phút sau, phép thuật chạy cho mọi người xem.

Chúc mừng, Phù thủy! 🪄 Website không còn chỉ đẹp – nó sống. Phản ứng click, nhớ lựa chọn, hỏi và trả lời. Và bạn biết từng dòng hoạt động thế nào. Ở Cấp 3 – Bậc thầy, bạn học làm website như pro: React, component, và server riêng.

Điều cần nhớ từ cấp này

🏆 Bằng của bạn

Chung kết Pháp sư

Khi bạn đánh dấu xong mọi bài, bạn có thể in chứng chỉ.