Sibil & Inhinyeriyang Pampasabog
Paglikha ng Isang Kaugalianal na Kalendaryong App na may Javascript at Lokal na Storage
Table of Contents
Ang paggawa ng isang custom calendar application ay isang mahusay na paraan upang mapalalim ang iyong pagkaunawa sa JavaScript, ang browser Document Object Model (DOM), at client-side data persist. sa pamamagitan ng pag-eebolb sa Web Storage API — partikular na Local Storage — maaari kang lumikha ng isang ganap na functure na kalendaryong pang-clear na tumatakbong ganap sa browser nang hindi nangangailangan ng backend server o database. Ang torytend staintential walks sa bawat hakbang, mula sa pag-pag-edctuklasing the HTM upang ipatupad ang mga tampok na NTL upang maging tulad ng drawth-d-d-dropter.
Bakit Dapat Magtayo ng Isang Tratadong Kalendaryo?
Ang mga pre-build calendar na aklatan (tulad ng FullCalendar o DayPilot) ay nagbibigay ng mabilisang solusyon, ngunit ang paggawa ng isa mula sa pagkakamot ay nagbibigay sa iyo ng ganap na kontrol sa user interface, data handsting, at pagganap.Nagkamit ka rin ng karanasang pang-medisina sa gitnang JavaScript na mga konsepto tulad ng bagay, leader na pang-ganap, at ang API. Ang resultang app ay maaaring igawad sa isang produksyon ng proyekto, isang sistemang personal, o isang personal na journal.
Pagtatayo ng HTML Structure
Paandarin ang midya Saplikadong kalansay ng HTML. Ang kalendaryo ay nangangailangan ng tatlong pangunahing sangkap: isang bar ng nabigasyon (para sa pagbabago ng mga buwan), isang grid container (para sa mga selulang pang-araw), at isang anyong input ng pangyayari. Gamitin mga elementong may mga pangalang semantiko para sa madaling pag-iinty at pag-skrip.
<div id="calendar">
<div class="calendar-header">
<button id="prevBtn">←</button>
<h2 id="monthYear"></h2>
<button id="nextBtn">→</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>
Ang ay pirmihang tatahanan ng JavaScript. Para sa isang mobile glordly na ayos, isaalang-alang ang paggamit ng isang 7°column CSS grid (isa para sa bawat araw ng linggo). Reserve ang unang hanay para sa mga pang-araw na pangalan (Sun–Sat).
Pagtatag ng Kalendaryo sa CSS
Gumamit ng CSS Grid para sa calendar grid, na nagtatakda . Magdagdag ng mga spacer sa loob ng ilang araw bago ang unang bahagi ng buwan. Para maging madaling gamitin, tiyakin ang sapat na pagkakaiba ng kulay at isama ang mga estilo sa mga elementong interaktibo.
.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;
}
Gumamit ng media queries upang mabawasan ang laki ng selula sa makikitid na iskrin, at isaalang - alang ang pagtatago ng mga impormasyon at ang pagpapakita lamang ng isang pagbilang.
Core JavaScript: Paggulang sa Kalendaryo
Lahat ng mga buhay na dynamic regulatory sa JavaScript. Ang sentral na tungkulin, , ay kinakalkula ang unang araw ng buwan at ang kabuuang bilang ng mga araw. Gamitin upang makuha ang weekday index (0 = Linggo). Pagkatapos ay lumilikha ng mga selula sa isang presilya mula 1 hanggang huling araw ng buwan.
Paggawang Kasama ng mga Bagay na May Kaugnayan sa Petsa
Ang [[[[10]] ⁇ ay ang pundasyon ng lohika sa kalendaryo. Upang makuha ang huling araw ng isang buwan, gamitin (ang araw 0 ng susunod na buwan ay nagbibigay ng huling araw ng kasalukuyang buwan).I-Itore ang kasalukuyang buwan at taon sa mga global variables upang ang nabigasyon ay makapag-update sa kanila.
Pagtatayo ng Giling
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);
}
}
I-update ang buwan/year display sa header:
Paglalayag sa Pagitan ng mga Buwan
Attach pindot sa pindot ng tunog sa pangyayaring mga tagapakinig sa nauna at Susunod na mga buton. Increment o decreement , pag-aangkop sa taon kung kinakailangan (hal., pagkatapos ng Disyembre ay sasapit sa Enero ng susunod na taon). Pagkatapos i-update ang mga variables, tumawag muli .
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();
});
Para sa karagdagang kakayahan, magdagdag ng Sa Ngayon button na nagreresulta sa pagtanaw sa kasalukuyang buwan at itinatampok ang kasalukuyang araw.
Pag - asinta & Muling Paggunita sa mga Pangyayaring May Lokal na Bagsag
AngLocal Storage ay nagbibigay ng simpleng key-halagang tindahan na nananatiling buhay sa browser retarts. Gamitin ang isang hindi nagbabagong pangunahing dibuho, e.g., , pag-iimbak ng JSON na hanay ng mga bagay na may kaugnayan sa pangyayari. Isama ang mga katangiang katulad ng , , , at[T]21].
Pagliligtas ng Isang Bagong Pangyayari
Kapag ang gumagamit ay nag-eeksperimento ng ⁇ Save ⁇ ton, nakuha ang input na halaga at ang kasalukuyang napiling petsa. (Maaring magdagdag ng isang taga-kuha ng petsa o makadetek kung aling day cell ang na- clicked.) Ibalik ang anumang umiiral na pangyayari para sa petsang iyon mula sa Local Storage, itulak ang bagong kaganapan, pagkatapos ay iligtas ang pag-urong.
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
}
Pagdadala ng mga Pangyayari sa mga Selula sa Araw
Sa loob , para sa bawat non-secut na day cell, ay tinatawag ang isang tungkulin na nagreresulta sa Local Storage para sa date key na iyon. kung may mga pangyayari, prepusyo sa pamamagitan ng mga ito at append mga elemento sa selula.
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);
});
}
Mga Pangyayaring Nakapagpapawalang - Bahala at Nakaiinip
Upang mai-delete, idikit ang isang kaganapang pindot sa bawat elementong kaganapan (o gamitin ang delegasyong pang pangyayari).Iayos ang array para sa petsang iyon, salain ang pangyayari sa pamamagitan ng , at iligtas ang binagong hanay pabalik sa Local Storage.Ang pag-didiit ay maaaring gawin sa pamamagitan ng dobleng pag-iimpluwensyahan sa pangyayari, na nag-udyok para sa bagong teksto, at muling pag-aprusisyon ng hanay.
Patiunang mga Katangian Upang Makamit ang Kasiyahan
Kapag gumagana na ang saligang kalendaryo, maaari mo nang idagdag ang mga katangian na lubhang nagpapabuti sa karanasan ng gumagamit.
Iba - iba ang Uri ng mga Pangyayaring May Kulay
Ilagay sa lokal na Storage (e.g., trabaho, personal, kalusugan) ang mga gumagamit nito.I-reta ang isang field. Sa CSS, bigyang kahulugan ang mga klase tulad ng , at ikapit ang mga ito sa dinamikong paraan.
Pag - aalis ng Drag glovand grocherop
Gamitin ang HTML5 Drag at Drop API upang ilipat ang mga pangyayari sa pagitan ng mga selulang pang-araw. Kapag ang isang pangyayari ay ibinaba sa ibang araw, i-update ang date key sa Local Storage: alisin ang pangyayari mula sa orihinal na hanay ng petsa nito at itulak ito sa bagong ratio ng dateiris.
Muling Pagganap (Wekly / Monthly)
Magdagdag ng ⁇ Repeat ⁇ opsyon kapag nag-iipon ng isang pangyayari. Sa function, compute kung ang kasalukuyang petsa ay tumutugma sa tuntuning republic (e.g., tuwing Lunes) at ipakita ang pangyayari alinsunod dito. Store revival alegion sa isang hiwalay na Local Storage key upang maiwasan ang duplication.
Ang Pangmalas sa Linggo at ang Kalendaryong Mini
Ang isang linggong pagmamasid ay nagpapakita lamang ng kasalukuyang mga araw ng linggo na may mas pahalang na espasyo. Ang isang maliit na buwan na pagtanaw sa mini calendar ay tumutulong sa mga gumagamit na tumalon agad sa anumang petsa.
Ginagawang Responsibilidad at Madaling Magamit ang Kalendaryo
Subukin ang kalendaryo sa iba't ibang sukat ng screen. Gamitin ang mga query upang magsalansan ng mga selula sa araw nang patayo sa napakaliit na mga iskrin o bawasan ang padding. Gamitin ang lahat ng interaktibong mga elemento ay keyboard calcencesible: idikit ang mga kaganapan para sa Enter and Escape. Gamitin ang mga katangian sa mga butones at mga live na rehiyon upang ipatalastas ng mga mambabasa ang mga pagbabago sa buwan at mga dagdag na pangyayari.
Pag - aasikaso at mga Tip ng Pag - aasikaso sa Data
- Batched Storage Writes[: Sa halip na basahin/talaan Local Storage para sa bawat operasyon ng kaganapan, cached ang mga buong buwang mga kaganapang ⁇ sa isang JavaScript na bagay at splitation ay nagbabago sa pana-panahon.
- Limit Event Size: Itago ang mga bagay na may kaganapan na maliit. Iwasang mag-imbak ng malalaking kuwerdas o binary data.
- Fallback for Storage Limits: Ang lokal na Storage ay karaniwang naka-claim sa 5–10 MB. Warn user kapag halos puno na ang pag-iimbak.
- [[[Talaksan][Talaksan [[Talaksan:: Kung ang iyong kalendaryo ay magdaraos ng libu-libong mga kaganapan, isaalang-alang IndexedDB para sa mas mabuting pagganap at mga kakayahan sa pag-uusisa.
Pagsasaayos
Ang paglikha ng isang kalendaryong pang-ugali na may JavaScript at Local Storage ay isang kasiya-siyang proyekto na nagpapatalas sa iyong mga kasanayang pang-ibabaw na glopend. pinag-aaralan mong kontrolin ang DOM, gumawa sa mga petsa, pangasiwaan ang estado nang walang server, at pangasiwaan ang mga interaksiyon ng gumagamit. Ang codebase ay maaaring palawakin sa pamamagitan ng sercled, found sa ulap, o pagsasama-sama sa mga kalendaryong panlabas sa pamamagitan ng Google Calendarsomenaptions Ang mga pangunahing pag-up, pagkatapos ay nagdudugtong at ang resulta ay ang mga pangyayaring may kasamang pag-edro-edro-edge at pag-droledroled. Ang mga pangyayari ay eksaktong nangangailangan ng mga pangyayaring seleksiyon ay ang mga element na may kasamang presctistacep.
Para sa higit pang pagbasa, galugarin ang Stollage API document at ang [[Drag at Drop API sa MDN. Happy couping!