15 of 17 menu

Chyba přepínání kalendáře v JavaScriptu

Předpokládejme, že chceme vytvořit šipky pro přepínání kalendáře. V tomto případě lze udělat řadu charakteristických chyb. Pojďme je prozkoumat.

Předpokládejme, že máme tlačítka pro přepínání a prvek, do kterého pro jednoduchost nebudeme vypisovat kalendář, ale pouze rok a název měsíce:

<button id="prev">prev</button> <div id="elem"></div> <button id="next">next</button>

Získáme odkazy na naše prvky:

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

Předpokládejme, že máme také funkci, která parametrem přijímá číslo měsíce a vrací jeho název:

function getMonthName(month) { let names = [ 'led', 'úno', 'bře', 'dub', 'kvě', 'čvn', 'čvc', 'srp', 'zář', 'říj', 'lis', 'pro' ]; return names[month]; }

Při načtení stránky získáme aktuální rok a měsíc:

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

Vypišme do našeho prvku rok a název měsíce (imitace kalendáře):

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

Nyní na přepínače připojme obslužné rutiny kliknutí:

prev.addEventListener('click', function() { // zobrazíme předchozí měsíc }); next.addEventListener('click', function() { // zobrazíme následující měsíc });

Podívejme se nyní na chyby, které lze udělat při implementaci přepínačů.

První chyba

Předpokládejme, že nějaký programátor implementoval tlačítka pro přepínání měsíců:

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 udělal chybu, kvůli které se měsíc přepíná pouze po prvním kliku, ale ne po následujících.

Jde o to, že proměnná month se nemění uvnitř funkcí - k jejímu obsahu se jednoduše přičte jedna a výsledek se pošle do funkce getMonthName.

Jelikož se naše proměnná nezměnila, bude při příštím kliknutí stále obsahovat aktuální měsíc - a nic se nezmění.

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); });

Lze zjednodušit:

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

Druhá chyba

Často se zapomíná na to, že měsíc by se měl měnit v určitém rozsahu - od 0 do 11. Při dosažení hranice rozsahu bychom měli změnit rok (dopředu nebo dozadu) a měsíc resetovat na počáteční hodnotu.

Udělejme 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); });
Čeština
AfrikaansAzərbaycanБългарскиবাংলাБеларускаяDanskDeutschΕλληνικάEnglishEspañolEestiSuomiFrançaisहिन्दीMagyarՀայերենIndonesiaItaliano日本語ქართულიҚазақ한국어КыргызчаLietuviųLatviešuМакедонскиMelayuမြန်မာNederlandsNorskPolskiPortuguêsRomânăРусскийසිංහලSlovenčinaSlovenščinaShqipСрпскиSrpskiSvenskaKiswahiliТоҷикӣไทยTürkmenTürkçeЎзбекOʻzbekTiếng Việt
Používáme soubory cookie pro fungování webu, analýzu a personalizaci. Zpracování údajů probíhá v souladu s Zásadami ochrany osobních údajů.
přijmout vše přizpůsobit odmítnout