15 of 17 menu

Грешка при превключване на календар в JavaScript

Да предположим, че искаме да направим стрелки за превключване на календара. В този случай може да се допуснат редица характерни грешки. Нека ги разгледаме.

Да предположим, че имаме бутони за превключване и елемент, в който за простота ще извеждаме не календар, а просто година и име на месеца:

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

Нека получим референции към нашите елементи:

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

Да предположим, че имаме и функция, която приема параметър номер на месеца и връща неговото име:

function getMonthName(month) { let names = [ 'яну', 'фев', 'мар', 'апр', 'май', 'юни', 'юли', 'авг', 'сеп', 'окт', 'ное', 'дек' ]; return names[month]; }

Нека при зареждане на страницата получим текущата година и месец:

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

Нека изведем в нашия елемент годината и името на месеца (имитация на календар):

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

Нека сега на превключвачите да добавим манипулатори на кликвания:

prev.addEventListener('click', function() { // показваме предходния месец }); next.addEventListener('click', function() { // показваме следващия месец });

Нека сега разгледаме какви грешки може да бъдат допуснати при имплементацията на превключвачите.

Първа грешка

Да предположим, че някой програмист реализирал бутоните за превключване на месеците по следния начин:

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

Този програмист обаче допуснал грешка, поради която месецът се превключва само при първото кликване, но не и при следващите.

Работата е там, че променливата month не се променя вътре във функциите - към нейното съдържание просто се добавя единица и резултатът се изпраща към функцията getMonthName.

Тъй като нашата променлива не се е променила, то при следващо кликване в нея ще остава текущият месец - и нищо няма да се промени.

Нека поправим проблема:

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

Може да се опрости:

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

Втора грешка

Често се забравя, че месецът трябва да се променя в определен диапазон - от 0 до 11. При достигане на границата на диапазона трябва да променим годината (напред или назад), а месеца да върнем в начална стойност.

Нека направим това:

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); });
Български
AfrikaansAzərbaycanবাংলাБеларускаяČeštinaDanskDeutschΕλληνικά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
Ние използваме бисквитки за работата на сайта, анализ и персонализация. Обработката на данни се извършва в съответствие с Политика за поверителност.
приемам всички настройки отхвърляне