前提・実現したいこと
JavaScriptで年月日のプルダウンを自動生成し、選択された年月に応じた日のプルダウンを表示させたいです。
jQueryについてはまだ学習前のため、一旦は使わずに作成したいと思っています。
発生している問題・エラーメッセージ
最後の、Javascriptの「//年月が変更された場合に日のoptionを再取得」部分を追記すると、年または月のプルダウン選択後、ブラウザが動かなくなります。 デベロッパツールを利用してエラーがないか確認しましたが、エラー表示はありませんでした。
該当のソースコード
html
1<!DOCTYPE html> 2<html> 3<head> 4<meta charset="UTF-8" HTTP-EQUIV="Content-Script-Type" CONTENT="text/javascript"> 5<title>年月日プルダウン 作成サンプル</title> 6</head> 7<body> 8<select name="year" id="year"></select>年 9<select name=month" id="month"></select>月 10<select name="day" id="day"></select>日 11<script type="text/javascript" src="./js/ sample.js"></script> 12</body> 13</html>
javascript
1/** 2 * 年のオプションを作成する函数 3 */ 4function yearOption() { 5 6 //現在の日付けを取得 7 const now = new Date(); 8 9 //現在の年を取得 10 const nowYear = now.getFullYear(); 11 12 //現在から100年前を取得 13 const year100 = nowYear - 100; 14 15 //100年前から今年までループ 16 for (let i = year100; i <= nowYear; i++) { 17 18 //selectタグ取得 19 let select = document.getElementById("year"); 20 21 //option生成 22 let option = document.createElement("option"); 23 select.appendChild(option); 24 25 //optionのテキストとして年を代入 26 option.text = i; 27 } 28} 29 30/** 31 * 月のオプションを作成する函数 32 */ 33function monthOption() { 34 35 //1月から12月までループ 36 for (let i = 1; i <= 12; i++) { 37 38 //selectタグ取得 39 let select = document.getElementById("month"); 40 41 //option生成 42 let option = document.createElement("option"); 43 select.appendChild(option); 44 45 //optionのテキストとして月を代入 46 option.text = i; 47 } 48} 49 50/** 51 * 選択された年月の末日を取得する函数 52 */ 53function lastDay() { 54 let days; 55 let february; 56 let last; 57 let year = document.getElementById("year").value; 58 let month = document.getElementById("month").value; 59 60 //1月〜12月までの末日 61 let days = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; 62 63 //うるう年の2月の末日 64 february = 29; 65 66 //月が2月の場合 67 if (month == 2) { 68 69 //うるう年の場合 70 if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) { 71 72 //末日にうるう年2月の末日を代入 73 last = february; 74 75 //うるう年でない場合 76 } else { 77 78 //末日にその月の末日を代入 79 last = days[month - 1]; 80 } 81 82 //2月でない場合 83 } else { 84 85 //末日にその月の末日を代入 86 last = days[month - 1]; 87 } 88 89 //代入された末日を返す 90 return last; 91} 92 93/** 94 * 日のオプションを作成する関数 95 */ 96function dayOption() { 97 98 //日のoption要素 99 let children = day.children; 100 101 //日のoptionを削除 102 while (children.length) { 103 children[0].remove; 104 } 105 106 //年と月の値がある場合 107 if (year.value != "" && month.vaue != "") { 108 109 //末日を取得 110 let last_day = lastDay(); 111 112 //1日から末日までループ 113 for (let i = 1; i <= last_day; i++) { 114 115 //日のselectタグを取得 116 let select = document.getElementById("day"); 117 118 //option生成 119 let option = document.createElement("option"); 120 select.appendChild(option); 121 122 //optionに日を代入 123 option.text = i; 124 } 125 } 126} 127 128function birthdayOption() { 129 130 //年の取得 131 yearOption(); 132 133 //月の取得 134 monthOption(); 135 136 //日の取得 137 dayOption(); 138} 139 140//ウィンドウオブジェクトのロードが完了した場合に年月日の取得 141window.onLoad = birthdayOption(); 142 143//年月が変更された場合に日のoptionを再取得 144document.getElementById("year").onChange = dayOption(); 145document.getElementById("month").onChange = dayOption(); 146
試したこと
JavaScriptの読み込みと、オンロードで年月日のプルダウンの自動生成まではできている事が確認できています。
onChangeを追記する事でブラウザが動かなくなるため、ここが原因だと思って調べると、無限ループになっている可能性がある記述を見つけました。
が、なぜ動かなくなるのか、また、解決方法の見当がつかず、困っております。
お手数をおかけしますが、どなたかお力添えください!

回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/02/27 10:21