15 of 17 menu

Chyba pri prepínaní kalendára v JavaScripte

Povedzme, že chceme vytvoriť šípky na prepínanie kalendára. V takom prípade môžeme urobiť rad charakteristických chýb. Poďme si ich prejsť.

Povedzme, že máme tlačidlá na prepínanie a element, do ktorého pre jednoduchosť nebudeme vypisovať kalendár, ale len rok a názov mesiaca:

<button id="prev">predchádzajúci</button> <div id="elem"></div> <button id="next">ďalší</button>

Získame odkazy na naše elementy:

let elem = document.querySelector('#elem'); let prev = document.querySelector('#prev'); let next = document.querySelector('#next');

Povedzme, že máme tiež funkciu, ktorá ako parameter prijíma číslo mesiaca a vráti jeho názov:

function getMonthName(month) { let names = [ 'jan', 'feb', 'mar', 'apr', 'máj', 'jún', 'júl', 'aug', 'sep', 'okt', 'nov', 'dec' ]; return names[month]; }

Po načítaní stránky získame aktuálny rok a mesiac:

let date = new Date; let year = date.getFullYear(); let month = date.getMonth();

Vypíšeme do nášho elementu rok a názov mesiaca (imitatívny kalendár):

elem.textContent = year + ' ' + getMonthName(month);

Teraz na prepínače pridáme obsluhu kliknutí:

prev.addEventListener('click', function() { // zobrazíme predchádzajúci mesiac }); next.addEventListener('click', function() { // zobrazíme nasledujúci mesiac });

Pozrime sa teraz na chyby, ktoré môžeme urobiť pri implementácii prepínačov.

Prvá chyba

Povedzme, že nejaký programátor implementoval tlačidlá na prepínanie mesiacov:

next.addEventListener('click', function() { elem.textContent = year + ' ' + getMonthName(month + 1); }); prev.addEventListener('click', function() { elem.textContent = year + ' ' + getMonthName(month - 1); });

Tento programátor však urobil chybu, kvôli ktorej sa mesiac prepne len pri prvom kliku, ale nie pri ďalších.

Problém je v tom, že premenná month sa nemení vo vnútri funkcií - k jej obsahu sa jednoducho pripočíta jedna a výsledok sa odošle do funkcie getMonthName.

Keďže sa naša premenná nezmenila, tak pri ďalšom kliknutí v nej naďalej bude aktuálny mesiac - a nič sa nezmení.

Opravme problém:

next.addEventListener('click', function() { month = month + 1; elem.textContent = year + ' ' + getMonthName(month); }); prev.addEventListener('click', function() { month = month - 1; elem.textContent = year + ' ' + getMonthName(month); });

Môžeme to zjednodušiť:

next.addEventListener('click', function() { elem.textContent = year + ' ' + getMonthName(++month); }); prev.addEventListener('click', function() { elem.textContent = year + ' ' + getMonthName(--month); });

Druhá chyba

Často sa zabúda na to, že mesiac by sa mal meniť v určitom rozsahu - od 0 do 11. Pri dosiahnutí hranice rozsahu by sme mali zmeniť rok (dopredu alebo dozadu) a mesiac resetovať na počiatočnú hodnotu.

Urobme to:

next.addEventListener('click', function() { if (month === 11) { month = 0; year++; } else { month++; } elem.textContent = year + ' ' + getMonthName(month); }); prev.addEventListener('click', function() { if (month === 0) { month = 11; year--; } else { month--; } elem.textContent = year + ' ' + getMonthName(month); });
Slovenčina
AfrikaansAzərbaycanБългарскиবাংলাБеларускаяČeštinaDanskDeutschΕλληνικάEnglishEspañolEestiSuomiFrançaisहिन्दीMagyarՀայերենIndonesiaItaliano日本語ქართულიҚазақ한국어КыргызчаLietuviųLatviešuМакедонскиMelayuမြန်မာNederlandsNorskPolskiPortuguêsRomânăРусскийසිංහලSlovenščinaShqipСрпскиSrpskiSvenskaKiswahiliТоҷикӣไทยTürkmenTürkçeЎзбекOʻzbekTiếng Việt
Používame cookies na fungovanie stránky, analýzu a personalizáciu. Spracúvanie údajov prebieha v súlade s Politikou ochrany osobných údajov.
prijať všetky nastaviť odmietnuť