質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

1回答

3232閲覧

日付プルダウン処理(他のやり方)について

sky.user.

総合スコア15

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2018/11/15 04:39

編集2018/11/15 05:34

お世話になっております。
以前の日付プルダウン処理(リンク内容)に関してです。

おかげさまで、完成させることができました!ありがとうございます。
やり方としては、onloadの時だけ年のメソッドの中の最後に、月のメソッドを呼び出す際に
引数を渡す、というものになりました。(※日も同様)
onchangeの時には何も引数を渡さない、ということです。

一応できたのは良いのですが、これだと保守性・拡張性、メソッドの独立性に欠けると思いまして、
このたび質問させていただきました。

今回やろうとしているやり方は、onload時、onchange時どちらもプルダウンを生成するには
変わりありませんが、onload時にだけ、現在の年月日を設定するメソッドを使用する、という
ものです。

一応作ってはみたのですが、★の部分で渡す1つめの引数で詰まってしまっています。。。
おそらくDOM要素の読み込みタイミングの問題なのだと思います。
(プルダウンを作るメソッドは前回の質問と同じなので省略させていただきます。すみません。)

このやり方・方向性は間違っているのでしょうか?
申し訳ありませんが、よろしくお願いします。

JavaScript

1// 現在年 2var NowYear = (new Date()).getFullYear(); 3 4// 現在月 5var NowMonth = (new Date()).getMonth() + 1; 6 7// 現在日 8var NowDate = (new Date()).getDate(); 9 10window.onload = function() { 11 setSelectYear(); 12 13 //★ 14 setToday(document.getElementById("selectYear"),NowYear); 15 setToday(document.getElementById("selectMonth"),NowMonth); 16 setToday(document.getElementById("selectDate"),NowDate); 17} 18 19/* 20 * onload時に、今日の日付(年月日)にセットするメソッド 21 */ 22function setToday(option, Now) { 23 for(i = 0; i < option.length(); i++){ 24 25 if(i = Now){ 26 option.selected = (Now); 27 break; 28 } 29 } 30} 31 32/* 33 * 年のoptionを更新 34 */ 35function setSelectYear() { 36 37 // selectボックスIDからElementの取得 38 var selectElement = document.getElementById("selectYear"); 39 40 // 現在~5年前分まで回す 41 for (var y = NowYear; y >= NowYear - 5; y--) { 42 43 // <option>要素を追加 44 var option = document.createElement("option"); 45 46 // optionのvalue属性を設定 47 option.value = y; 48 49 // リストに表示するテキストの設定 50 option.text = y; 51 52 // セレクトボックスにオプションを追加 53 selectElement.appendChild(option); 54 } 55 setSelectMonth(); 56} 57 58/* 59 * 月のoptionを更新 60 */ 61function setSelectMonth() { 62 63 // selectボックスIDからElementの取得 64 var selectElement = document.getElementById("selectMonth"); 65 66 // 要素削除用 67 var child; 68 69 while (child = selectElement.firstChild) { 70 selectElement.removeChild(child); 71 } 72 73 // 12ヶ月分回す 74 for (var m = 1; m <= 12; m++) { 75 76 // <option>要素を追加 77 var option = document.createElement("option"); 78 79 // optionのvalue属性を設定 80 option.value = m; 81 82 // リストに表示するテキストの設定 83 option.text = m; 84 85 // セレクトボックスにオプションを追加 86 selectElement.appendChild(option); 87 88 // 現在の日を引数に渡さないsetSelectDateを実行 89 setSelectDate(); 90 } 91} 92 93/* 94 * 日のoptionを更新 95 */ 96function setSelectDate() { 97 98 // 選択された年を取得 99 var y = document.form1.selectYear.options[document.form1.selectYear.selectedIndex].value; 100 101 // 選択された月を取得 102 var m = document.form1.selectMonth.options[document.form1.selectMonth.selectedIndex].value; 103 104 // 閏年なら 105 if (m == 2 && (y % 400 == 0 || (y % 4 == 0 && y % 100 != 0))) { 106 107 // 2月の閏年 108 var last = 29; 109 110 // それ以外なら 111 } else { 112 var lastday = new Array(11); 113 lastday = [ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ]; 114 last = lastday[m - 1]; 115 } 116 117 // 要素取得と初期化 118 var selectElement = document.getElementById("selectDate"); 119 120 // 要素削除用 121 var child; 122 123 // セレクトボックスの子要素を取得しつつループ 124 while (child = selectElement.firstChild) { 125 126 // セレクトボックスから子要素を削除 127 selectElement.removeChild(child); 128 } 129 130 // 1日から月の最終日まで回す 131 for (var d = 1; d <= last; d++) { 132 133 // <option>要素を追加 134 var option = document.createElement("option"); 135 136 // optionのvalue属性を設定 137 option.value = d; 138 139 // リストに表示するテキストの設定 140 option.text = d; 141 142 // セレクトボックスにオプションを追加 143 selectElement.appendChild(option); 144 } 145}

HTML

1<FORM id = "form1"> 2<td><select name="year" id="selectYear" onchange="setSelectMonth()"> 3</select> 年 4<select name="month" id="selectMonth" onchange="setSelectDate()"> 5</select> 月 6<select name="date" id="selectDate"> 7</select> 日</td> 8</FORM> 9

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2018/11/15 05:02

URLはリンクをつけることができるのでリンク対応されたほうが回答する側としては助かります。
m.ts10806

2018/11/15 05:05

また前回質問が関係しているとはいえ、この質問だけでも完結できるように余程コードが長くないのであれば提示されたほうがいいかもしれません。
m.ts10806

2018/11/15 05:05

DOM要素の読み込みタイミングのことを気にされていますが、このJavaScriptはどの位置に置かれているのでしょうか。html上で示していただければと。
sky.user.

2018/11/15 05:10

ご回答ありがとうございます。JavaScriptの外部ファイルとしているので、HTML上ではありません。
m.ts10806

2018/11/15 05:14

失礼、表現が悪かったですね。読み込み記述の位置です。あと気になるのがhtmlが中途半端に提示されているので全体がわからないところですね。tdの中にある・・・ということですが複数selectがあったりしませんよね?tdなくても再現可能であれば余計な詮索を強いるのでselectだけ置いてあったほうが良いように思います。
m.ts10806

2018/11/15 05:19

このコード、そもそもエラー出てますが、そこは認識済みですか?それとも何か記述が抜けていたりするのでしょうか。
m.ts10806

2018/11/15 05:21

あ、name=form1でformタグ設置しなきゃいけないみたいですね。了解です。質問はその次のエラー解決となりそうですね。
guest

回答1

0

ベストアンサー

optionの数をとるなら .options.length ですね。
ただ、これだけでも解決しません。
なぜならsetToday()で回しているiはあくまでoptionの数だけしか回しません。
optionのバリューはそれぞれの年月日がそのまま入っています。
Nowには年月日がそれぞれ渡されます。

つまり「デフォルト本日」としたいのであれば、このやり方ではできませんので、
「optionのvalueを見て同じかどうか」とする必要があります。

js

1function setToday(select, Now) { 2 for(var i = 0; i < select.options.length; i++){ 3 if(select.options[i].value == Now){ 4 select.options[i].selected = true; 5 break; 6 } 7 } 8}

selectedは論理型であるため実値ではなくtrue/falseで行います。

参考:

投稿2018/11/15 05:41

編集2018/11/15 05:43
m.ts10806

総合スコア80850

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sky.user.

2018/11/15 05:51

ありがとうございます!無事改善できました。 JavaScriptはまだ詳しくなく、変数に型がないと聞いていたので、true/falseもないものなのだと 思い込んでおりました。。。 貼ってくださったJavaScriptの仕様を読んで勉強します。
m.ts10806

2018/11/15 06:08

解決されたようで何よりです。 私が「型」と書いたのはselectのoptionのオブジェクトのプロパティのことです。 そこはリンク先のドキュメントを確認して、関係ありそうな機能のページも読んでみて理解を深めてください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問