Xây dựng một ứng dụng lịch trình riêng là cách tuyệt vời để làm tăng sự hiểu biết của bạn về JavaScript, mô hình đối tượng của trình duyệt (DO), và tính kiên trì dữ liệu bên khách hàng. Bằng cách áp dụng các tính năng lưu trữ Mạng, cụ thể là kho lưu trữ cục bộ — bạn có thể tạo một lịch trình đầy đủ chức năng, điều khiển sự kiện chạy trong trình duyệt mà không cần máy phục vụ hay cơ sở dữ liệu hậu phương. Tính năng này sẽ đi qua mỗi bước, từ i chính thức HTML để thực hiện tính năng nâng cao như quản lý kéo và thả.

Tại sao phải xây dựng lịch riêng?

Thư viện lịch được xây dựng sẵn (như FullCendar hay DayPilot) cung cấp giải pháp nhanh chóng, nhưng xây dựng một từ đầu cho bạn quyền kiểm soát hoàn toàn giao diện người dùng, dữ liệu quản lý và hiệu suất. Bạn cũng có thể nhận được kinh nghiệm của máy tính với khái niệm JavaScript lõi như [FLT: 0] đối tượng [FLT: 0], đại diện sự kiện, và API. Kết quả ứng dụng có thể mở rộng vào công cụ quản lý dự án, hệ thống đặt sách, hoặc nhật ký cá nhân.

Thiết lập cấu trúc HTML

Bắt đầu với một bộ xương HTML sạch. Lịch cần ba thành phần chính: thanh điều khiển (để thay đổi tháng), một hộp lưới (cho tế bào ngày) và một dạng nhập sự kiện. Hãy dùng yếu tố với tên phân dạng đơn giản cho các hạng mục và văn lệnh.

<div id="calendar">
 <div class="calendar-header">
 <button id="prevBtn">&larr;</button>
 <h2 id="monthYear"></h2>
 <button id="nextBtn">&rarr;</button>
 </div>
 <div class="calendar-grid"></div>
 <div class="event-form">
 <input type="text" id="eventInput" placeholder="Add an event..." />
 <button id="saveEvent">Save</button>
 </div>
</div>

sẽ được JavaScript sử dụng một cách sống động. Đối với một bố trí thân thiện di động, hãy xem xét sử dụng mạng lưới 7 người dùng cho máy « %s » (một cho mỗi ngày trong tuần). Hãy cất tên hàng đầu trong ngày (Sun–Sat).

Chỉnh sửa lịch bằng kênh CSS

Xoá, đáp ứng CSS biến dạng HTML thô thành một giao diện có thể sử dụng. Dùng một Lưới CSS cho lưới lịch, thiết lập . Thêm các khoảng không trong nhiều ngày trước đầu tháng. Để dễ dàng, hãy đảm bảo sự tương phản màu sắc đầy đủ và thêm vào các yếu tố tương tác. Một tờ kiểu dáng tối thiểu được hiển thị bên dưới (dòng hay liên kết).

.calendar-grid {
 display: grid;
 grid-template-columns: repeat(7, 1fr);
 gap: 2px;
}
.day-cell {
 min-height: 80px;
 border: 1px solid #ccc;
 padding: 4px;
 position: relative;
}
.day-cell.today {
 background-color: #eef;
}
.event {
 font-size: 0.8em;
 background: #4caf50;
 color: #fff;
 padding: 2px 4px;
 margin: 1px 0;
 border-radius: 3px;
 cursor: pointer;
}

Dùng các bản ghi chú phương tiện truyền thông để giảm kích cỡ tế bào trên màn hình hẹp, và cân nhắc việc ẩn văn bản sự kiện và chỉ đếm.

lõi JavaScript: Đang tạo ra Lưới Lịch

Tất cả các cách vẽ sống động bằng JavaScript. Chức năng trung tâm , tính toán ngày đầu tháng và tổng số ngày. Hãy dùng để có được chỉ mục ngày thứ hai (0 = Chủ nhật). Sau đó, tạo ra các tế bào trong vòng từ 1 đến ngày cuối tháng.

Làm việc với đối tượng ngày tháng

Đối tượng là cột sống của lý lịch. Để có được ngày cuối cùng của một tháng, hãy dùng (ngày 0 của tháng sau cho ngày cuối cùng của tháng). Hãy lưu ngày và năm trong biến số toàn cầu để có thể cập nhật chúng.

Xây dựng lưới

function renderCalendar() {
 const grid = document.querySelector('.calendar-grid');
 grid.innerHTML = '';

 const firstDay = new Date(currentYear, currentMonth, 1).getDay();
 const daysInMonth = new Date(currentYear, currentMonth + 1, 0).getDate();

 // Add empty cells for days before the 1st
 for (let i = 0; i < firstDay; i++) {
 const empty = document.createElement('div');
 empty.className = 'day-cell empty';
 grid.appendChild(empty);
 }

 // Generate day cells
 for (let day = 1; day <= daysInMonth; day++) {
 const cell = document.createElement('div');
 cell.className = 'day-cell';
 cell.dataset.date = `${currentYear}-${currentMonth + 1}-${day}`;

 const dateSpan = document.createElement('span');
 dateSpan.textContent = day;
 cell.appendChild(dateSpan);

 // Highlight today
 const today = new Date();
 if (currentYear === today.getFullYear() && currentMonth === today.getMonth() && day === today.getDate()) {
 cell.classList.add('today');
 }

 // Load events for this date
 loadEvents(cell);

 grid.appendChild(cell);
 }
}

Cập nhật bộ trình bày tháng/ năm trong phần đầu:

Di chuyển giữa các tháng

Đính kèm thính giả nhắp vào nút trước và kế. Tăng dần , điều chỉnh năm nếu cần (v. d., sau tháng 12 đến tháng Giêng năm sau). Sau khi cập nhật các biến số, gọi .

document.getElementById('prevBtn').addEventListener('click', () => {
 currentMonth--;
 if (currentMonth < 0) {
 currentMonth = 11;
 currentYear--;
 }
 renderCalendar();
});

document.getElementById('nextBtn').addEventListener('click', () => {
 currentMonth++;
 if (currentMonth > 11) {
 currentMonth = 0;
 currentYear++;
 }
 renderCalendar();
});

Để có thêm khả năng sử dụng, hãy thêm một ngày nay mà đặt lại khung xem vào tháng hiện tại và làm nổi bật ngày hiện tại.

Comment

Lưu trữ cung cấp một cửa hàng giá trị đơn giản tồn tại để chạy lại trình duyệt. Hãy dùng một mẫu khóa nhất định, v. d., , cất giữ các vật thể lạ JSON. Gồm những tính chất như , , [FL:20] và [FL:21].

Cứu vãn một sự kiện mới

Khi người dùng nhấn vào nút “Save », hãy nắm lấy giá trị nhập và ngày tháng đã chọn (bạn có thể thêm vào một bộ chọn ngày tháng hoặc phát hiện tế bào nào được nhắp vào.) Lấy bất cứ sự kiện nào đã có từ kho lưu trữ địa phương, đẩy sự kiện mới, rồi lưu lại.

function saveEvent(dateKey, eventText) {
 const existing = JSON.parse(localStorage.getItem(dateKey)) || [];
 existing.push({ id: Date.now(), text: eventText, time: new Date().toLocaleTimeString() });
 localStorage.setItem(dateKey, JSON.stringify(existing));
 renderCalendar(); // refresh to show new event
}

Đang nạp các biến cố vào các buồng ban ngày

Bên trong , cho mỗi tế bào không phải là ngày không được sử dụng, gọi một chức năng mà kêu gọi lưu trữ địa phương cho phím ngày tháng đó. Nếu các sự kiện tồn tại, vòng qua chúng và phụ thêm yếu tố vào tế bào.

function loadEvents(cell) {
 const dateKey = cell.dataset.date;
 const events = JSON.parse(localStorage.getItem(dateKey));
 if (!events) return;

 events.forEach(evt => {
 const eventDiv = document.createElement('div');
 eventDiv.className = 'event';
 eventDiv.textContent = evt.text;
 eventDiv.dataset.id = evt.id;
 // Optional: add a delete button
 cell.appendChild(eventDiv);
 });
}

Xóa và sửa đổi sự kiện

Để xoá, hãy nhấn vào mỗi yếu tố sự kiện (hoặc sử dụng đại diện sự kiện). Lấy lại danh sách cho ngày đó, lọc sự kiện bằng và lưu lại các thông tin cập nhật về kho cục bộ. Sửa đổi có thể được thực hiện bằng cách nhấn đôi sự kiện, bấm nút để tìm văn bản mới, và cập nhật lại tập tin.

Tính năng nâng cao lên hàm tăng cao

Một khi lịch cơ bản có hiệu quả, bạn có thể thêm vào những đặc điểm giúp cải thiện đáng kể kinh nghiệm người dùng.

Comment

Cho phép người dùng phân loại (v. d., công việc, sức khỏe cá nhân). Hãy lưu một trường trong kho địa phương. Trong CN, hãy xác định những lớp như , và áp dụng chúng một cách năng động.

Kéo lại và kéo lại

Dùng đoạn HTML5 và Drop ARI để chuyển sự kiện giữa các tế bào trong ngày. Khi một sự kiện được thả vào một ngày khác, cập nhật phím ngày tháng trong kho địa phương: gỡ bỏ sự kiện khỏi danh sách ngày tháng ban đầu và đẩy nó vào hệ thống mới.

Những biến cố tái diễn (thường / mỗi tháng)

Thêm “tùy chọn tái sử dụng khi lưu một sự kiện, trong chức năng nạp, tính toán nếu ngày hiện tại khớp với quy tắc tái sử dụng (v. d. mỗi Thứ Hai) và trình bày sự kiện theo đó.

Xem tuần và lịch nhỏ

Xem trong một tuần, chỉ có một tháng và một tháng, một tháng cho thấy những ngày trong tuần có nhiều không gian ngang hơn.

Làm cho lịch được bảo trợ và dễ dàng truy cập

Kiểm tra lịch theo kích cỡ màn hình khác nhau. Dùng để xếp các tế bào ngày theo chiều dọc trên các màn hình rất nhỏ hoặc để giảm việc nhúng. Bảo đảm mọi yếu tố tương tác là khả năng truy cập bàn phím: đính kèm các sự kiện cho việc nhập và trốn thoát. Hãy dùng các tính năng [FLT: 32] trên nút và vùng sống để thông báo các thay đổi và các sự kiện thêm vào phiên chạy.

Mẹo quản lý dữ liệu hiệu suất và dữ liệu

  • Thay vì đọc/ ghi lưu trữ địa phương cho mỗi thao tác sự kiện, hãy lưu trữ các sự kiện trong một đối tượng JavaScript và thay đổi định kỳ.
  • Kích cỡ Sự kiện [FLT: 1]: giữ cho các đối tượng sự kiện nhỏ. Tránh cất giữ các chuỗi lớn hoặc dữ liệu nhị phân.
  • Phụ thuộc vào kho ): kho lưu trữ thường được bao phủ tại 5–10 MB. Cảnh báo người dùng khi kho đã gần đầy.
  • Dùng phụ lục để xác định dữ liệu lớn [FLT: 1]]: nếu lịch của bạn sẽ chứa hàng ngàn sự kiện, hãy xem ) IndexDB để có hiệu suất tốt hơn và truy vấn khả năng.

Kết luận

Tạo một ứng dụng lịch riêng với JavaScript và lưu trữ cục bộ là một dự án bổ sung mà mà làm sắc nét khả năng tăng cường (FLT: 0) của bạn. Bạn học cách thao tác giao thức này, quản lý trạng thái không có máy phục vụ, và xử lý tương tác người dùng. Cơ sở mã có thể mở rộng với máy phục vụ đồng bộ, sao lưu mây, hoặc tích hợp với lịch [FLT: 0] Lịch [FI [FLT]. Chạy với lưới cơ bản, thêm tính kiên trì, và rồi lớp như kéo bộ trình bày và lặp lại các sự kiện. Kết quả là lịch đã sửa đổi chính xác cách bạn cần thiết.

Để đọc thêm, hãy tìm kiếm tài liệu [FLT:] ) và Drag và Drop ARI trên MDN. Vui mừng lập trình viên!