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

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

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

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

Q&A

解決済

2回答

1783閲覧

javascriptで祝日表示ありのカレンダーを作りたい

s-a0202

総合スコア23

JavaScript

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

0グッド

0クリップ

投稿2019/10/04 12:58

・やりたいこと
10月のカレンダーを作っているのですが祝日の<td>のみ背景色を変えたいです。
どうすればできるのかお力添えいただきたいです。

js

1{ 2 const calender=document.getElementById('calenderBody'); 3 let now=new Date(); 4 let now_year=now.getFullYear(); 5 let now_month=now.getMonth(); 6 let first_date=new Date(now_year,now_month,1).getDay(); 7 let last_date=new Date(now_year,now_month+1,0).getDate(); 8 let dates=[ 9 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17, 10 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36 11 ].map(function(date){ 12 return date-first_date 13 }); 14 let holiday=[ 15 14,22 16 ];//10月の休日 17 for (let i = 0; i < 5; i++) { 18 const row = calender.insertRow(-1); 19 const dates_row=dates.slice(i*7,i*7+7); 20 let judgeHoliday=dates_row.concat(holiday); 21 row.innerHTML=dates_row.map(function(date){ 22 date=date<1||date>last_date ? '':date; 23 return '<td>'+date+'</td>' 24 }).join(''); 25 } 26}

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

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

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

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

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

m.ts10806

2019/10/04 19:14

1か月なのになぜ36も準備してるかとか、こんな固定で作ってて他の月はどうするのとか気になるところは多々あるのですが、このコードを書ける人が直面している問題には思えません。 どこかの記事のコピペなのでしょうか?どこまでこのコードを把握されてますか?
tanishi_a

2019/10/05 05:57

1〜36 の配列は、日曜始まりのために、先頭に空白セルを入れるために使用してるみたいですね。
s-a0202

2019/10/05 06:48

久々にプログラミングに触れるのでおかしいところだらけで申し訳ないです、 とりあえずひと月だけつくってみようかと思ったので固定にしてます。 ほとんど記事を見ながらという感じで、理解しているところとしていないところがあります。 理解できていないのはsliceの引数がどう機能しているのかです。(7日区切りにしているのはなんとなくわかります、、) 自分はjudgeHolidayでdatesとholidayを結合して、被っている日にちがあればその日にちのtdタグに背景色をつけたいと考えています。(filterとindexOfを使うのでしょうか、?)
guest

回答2

0

ベストアンサー

この部分を、

JavaScript

1date = date < 1 || date > last_date ? '' : date; 2return '<td>'+date+'</td>'

このように書き換えることで、やりたいことは出来るとは思います。

JavaScript

1date = date < 1 || date > last_date ? '' : date; 2if (holiday.includes(date)) { 3 return '<td style="background-color: pink;">' + date + '</td>'; 4} 5return '<td>'+date+'</td>'

あと、本質と関係ないですが、

  • 綴り間違い: calendercalendar
  • 変数名 holiday は配列なので holidays のほうが統一感がある
  • 変数名の xxx_date が、日付を指している場合と曜日を指している場合とが混在していて分かりづらい

ただ、他の人も仰っている通り、メンテがつらいコードですね・・。

直すとしたらこうかなー、、と思って書いてみましたが、これはこれで・・。

JavaScript

1function formatDate(d) { 2 return d.getFullYear() + '/' + (d.getMonth() + 1) + '/' + d.getDate(); 3} 4function createCalendar() { 5 const calendarTable = document.getElementById('calendarTable'); 6 const now = new Date(); 7 const today = new Date(now.getFullYear(), now.getMonth(), now.getDate()); 8 const beginningOfMonth = new Date(now.getFullYear(), now.getMonth(), 1); 9 const endOfMonth = new Date(now.getFullYear(), now.getMonth() + 1, 0); 10 11 let holidays = [ 12 '2019/10/14', 13 '2019/10/22', 14 ]; 15 16 const datesTable = []; 17 for (let week = -1, date = beginningOfMonth; date <= endOfMonth; date = new Date(date.getFullYear(), date.getMonth(), date.getDate() + 1)) { 18 const dayOfWeek = date.getDay(); 19 if (datesTable.length === 0 || dayOfWeek === 0) { 20 datesTable.push(new Array(7).fill('<td></td>')); 21 week += 1; 22 } 23 const style = holidays.includes(formatDate(date)) ? 'background-color: pink;' : ''; 24 datesTable[week][dayOfWeek] = `<td style="${style}">${date.getDate()}</td>`; 25 } 26 let html = ''; 27 for (const row of datesTable) { 28 const tr = calendarTable.insertRow(-1); 29 for (const cell of row) { 30 tr.innerHTML += cell; 31 } 32 } 33}

投稿2019/10/05 06:02

編集2019/10/05 07:02
tanishi_a

総合スコア484

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

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

0

めんどくさいので全て書き換え

HTML

1<table> 2 <tr> 3 4 </tr> 5</table>

jQuery

1var days = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31]; 2var holiday = [14,22]; 3var aiueo = ''; 4for (i=1;i<=days.length;i++) { 5 var color = ''; 6 for (j=0;j<=holiday.length;j++) { 7 if (i==holiday[j]) { 8 color = 'background:red'; 9 break; 10 } 11 } 12 $('tr').append( '<td style=' + color +'>' + i + '</td>' ); 13}

投稿2019/10/05 00:08

編集2019/10/05 00:09
kyoya0819

総合スコア10429

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

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

kyoya0819

2019/10/05 00:10

手動でやったほうが楽だと思う。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問