javascriptについて質問なのですが、 定形のHTMLがあり、毎月HTMLの決まった箇所を変更するため idを5つ作成してみたのですが、idMessage3以降が上手く動いてくれません。
javascriptについて質問なのですが、 定形のHTMLがあり、毎月HTMLの決まった箇所を変更するため idを5つ作成してみたのですが、idMessage3以降が上手く動いてくれません。 記述で問題あるところはありますでしょうか? 是非ご教授頂きたいです let Week = ["日", "月", "火", "水", "木", "金", "土",]; let wMessage1 = document.getElementById("idMessage1"); let wMessage2 = document.getElementById("idMessage2"); let wMessage3 = document.getElementById("idMessage3"); let wMessage4 = document.getElementById("idMessage4"); setInterval(DisplayDate, 250); function DisplayDate() { let msg1, msg2, msg3, msg4, msg5; let Y, M, D, h, m, s, Day, W; let oCurrDate = new Date(); oCurrDate.setMonth(oCurrDate.getMonth()); oCurrDate.setDate(1); Y = oCurrDate.getFullYear(); M = oCurrDate.getMonth() + 1; NM = oCurrDate.getMonth() + 2; D = oCurrDate.getDate(); h = oCurrDate.getHours(); m = oCurrDate.getMinutes(); s = oCurrDate.getSeconds(); Day = oCurrDate.getDay(); W = Week[Day]; let oLastDate = new Date(oCurrDate.getFullYear(), oCurrDate.getMonth() + 1, 0); let LD, LW; LD = oLastDate.getDate(); Day = oLastDate.getDay(); LW = Week[Day]; msg1 = `${Y}年${M}月${D}日(${W})~${Y}年${M}月${LD}日(${LW})\n`; msg2 = `${Y}年${NM}月${D}日(${W})10:00\n`; msg3 = `${Y}年${M}月${D}日(${W})10:00\n`; msg4 = `${Y}年${M}月${D}日(${W})~${Y}年${M}月${LD}日(${LW})\n`; if (msg1 !== wMessage1.innerText) { console.log("if(msg1!==wMessage1.innerText)"); console.log("msg1: "+msg1); wMessage1.innerText = msg1; } if (msg2 !== wMessage2.innerText) { console.log("if(msg2!==wMessage2.innerText)"); console.log("msg2: "+msg2); wMessage2.innerText = msg2; } if (msg3 !== wMessage3.innerText) { console.log("if(msg3!==wMessage3.innerText)"); console.log("msg3: "+msg3); wMessage3.innerText = msg3; } if (msg4 !== wMessage4.innerText) { console.log("if(msg4!==wMessage4.innerText)"); console.log("msg4: "+msg4); wMessage4.innerText = msg4; } }
JavaScript・94閲覧・25
ベストアンサー
■■■ 動作について ■■■ 質問のコードについては、 HTML の記述が一切提示されていないんで、 実際どんなコードになっているか分からんのだけど、 4つの id 属性をもつ <div> を用意して、 質問の Javascript コードをそのままコピー&貼り付けしてみたら、 ちゃんと動作している。 [ 動作確認:jsfiddle ] https://jsfiddle.net/zbvj5u7g ■■■ 直したほうがいいところ ■■■ 【 曜日マップ 】 まず、 曜日の数値を 日~土 に変換するための 曜日マップの配列について、 最後の「土」後にもカンマ「,」が混入しているせいで、 「土」の後、配列の末尾に、 未定義(undefined)の空要素が挿入されてしまっている。 今回のコード上ではたまたまエラーになっていないけど、 実行するコードによってはエラーやバグを招くんで、 不要なカンマ「,」は付けないようにする。 ──────────────── × let Week = ["日", "月", "火", "水", "木", "金", "土",]; ○ let Week = ["日", "月", "火", "水", "木", "金", "土"]; ──────────────── また、 この Week のような固定値で変更しない値は、 宣言子 let を使って変数として定義せず、 宣言子 const を使って定数として定義する。 ──────────────── △ let Week = ["日", "月", "火", "水", "木", "金", "土"]; ○ const Week = ["日", "月", "火", "水", "木", "金", "土"]; ──────────────── 【 無駄な setMonth() 】 質問のコードでは、 ──────────────── let oCurrDate = new Date(); oCurrDate.setMonth(oCurrDate.getMonth()); oCurrDate.setDate(1); ──────────────── というコードで、 変数 oCurrDate に取得した日付けに対して、 setMonth() と setDate() を使って、 その月の1日に設定し直している。 その際、 月については、 1行目の new Date() した時点で、 わざわざ setMonth() しなくても、 月数はその月になっている。 無駄な setMonth() は消す。 ──────────────── let oCurrDate = new Date(); oCurrDate.setDate( 1 ); ──────────────── 【 せっかく取得した値は使う 】 今月末の日付けオブジェクト oLastDate を取得する際に、 ──────────────── let oLastDate = new Date(oCurrDate.getFullYear(), oCurrDate.getMonth() + 1, 0); ──────────────── のように、 Date() の引数内で getFullYear() や getMonth() 等をしているが、 これらの値は既に Y や M で取得済みなんで、 それらの値を使うようにする。 ──────────────── let oLastDate = new Date( Y, M, 0 ); ──────────────── 【 月の +1 は表示の際に 】 質問のコードでは、 月数を変数 M に取得する時点で +1 している。 これにより、 月数をテキストとして書き出す際に +1 する必要がなく、 M で月数を書き出せるメリットがある。 ところが、 そのような書き方をしていると、 翌月などの日付けを取得する際に、 M の値がすでに +1 されていることで、 逆にコードが複雑化してしまう。 月数 M の +1 は、 テキストとして書き出す際に足すようにする。 ──────────────── × M = oCurrDate.getMonth()+1; ○ M = oCurrDate.getMonth(); ──────────────── こうすると、 前述の今月末の日付オブジェクトを取得する際も、 new Date() の引数に渡す値が、 ちゃんと「来月の 0 日」という意味に合う表記で書ける。 ──────────────── let oLastDat = new Date( Y, M+1, 0 ); ──────────────── ■■■ 複数箇所を1つの id で ■■■ id 属性は、 1つのドキュメント内で重複が許されないんで、 1つの id 属性で複数の要素を操作することはできない。 複数の要素に同値を付与できる class 属性を使ったり、 あるいはカスタムデータ属性 data-●● を使って、 複数の要素に同じ属性値を与えれば、 複数の要素をその1つの属性値で操作することができる。 例えば、 質問のコードだと、 #idMessage1 と #idMessage4 は、 同じ値を書き出しているんで、 これらの要素は1つの属性値でまとめて更新できる。 ─[ HTML ]────────── <div class="messageDays"></div> <div class="messageDays"></div> ─[ JS ]──────────── // 書き出す日程テキスト const days = `${Y}年${M}月${D}日(${W})~${Y}年${M}月${LD}日(${LW})\n`; // 同じクラス名の要素に一斉書き出し querySelectorAll( ".messageDays" ).forEach( elem => { elem.textContent = days; } ); ──────────────── [ 動作確認:jsfiddle ] https://jsfiddle.net/40s69vf2/ ■■■ 翌月の1日 ■■■ 翌月の1日(曜日を含む)を表示するには、 翌月の1日の Date オブジェクトを取得して、 その年、月、日、曜日をそれぞれ取得すればいいだけ。 ──────────────── // 曜日マップ cosnt Week = [ "日", "月", "火", "水", "木", "金", "土" ]; // 現在 const now = new Date(); const Y = now.getFullYear(); const M = now.getMonth(); const D = now.getDate(); const W = Week[ now.getDay() ]; // 来月の1日 const next = new Date( Y, M+1, 1 ); const Ynext = next.getFullYear(); const Mnext = next.getMonth(); const Dnext = next.getDate(); const Wnext = Week[ next.getDay() ]; ──────────────── あとは、 取得した Ynext, Mnext, Dnext, Wnext を使って、 日時を表示すればいい。 ──────────────── msg = `${Ynext}年${Mnext}月${Dnext}日(${Wnext})10:00\n`; ──────────────── [ 動作確認:jsfiddle ] https://jsfiddle.net/vnL7cagq/ ■■■ name 属性は使えない ■■■ 他の回答者の回答で、 複数の要素に対して処理する方法として、 name 属性の使用を提示し、 ──────────────── <div name="nmMonth_Rel0"> ──────────────── のようなコードが記載されているけど、 <div> 要素には name などという属性はないんで、文法違反。 name 属性は、 <form> や <input> のようなフォーム部品、 インラインフレームを設置する <iframe>、 クリッカブルマップを設置する <map> など、 限定的な一部の要素に付与できる属性で、 <div> や <p> のような一般的な要素で使用してはいけない。 [ 参考:name 属性 ] https://www.osaka-kyoiku.ac.jp/~joho/html5_ref/name_attr.php 以上、間違えて覚えるといけないんで補足まで。
こちらもご返信ありがとうございます!確かにルールを間違えて覚えないようにしないとですね。属性を纏めたり翌月の表示など自分でも実装できるよう頑張ります。
質問者からのお礼コメント
今後とも宜しくお願い致します
お礼日時:1/26 9:33