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 = [ '1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月' ]; 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 が関数内で変更されていないからです。 単にその内容に1を加算(または減算)し、 その結果を関数 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); });

2番目のエラー

月は特定の範囲内、 つまり 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
当サイトでは、サイトの動作、分析、パーソナライゼーションのためにクッキーを使用しています。 データ処理はプライバシーポリシーに従って行われます。
すべて受け入れる 設定 拒否