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

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

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

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

Q&A

解決済

3回答

1113閲覧

Javascript: <table>の<td>をクリックすると<td>内にある情報を<input text>に反映させたい。

rails_ruby

総合スコア87

JavaScript

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

0グッド

0クリップ

投稿2019/01/31 04:22

編集2019/01/31 05:10

前提・実現したいこと

簡単なカレンダーを実装しています。
カレンダーの日にちをクリックするとその日の日付と時間を<input text>に反映させたい。

発生している問題・エラーメッセージ

下記の一文で実現したい処理を書いたのですが、動きませんでした。

document.querySelector("input").write("今日は" + month + "月"+ day + "日です。");

イメージ説明

該当のソースコード

html

1<div id="calendar"></div> 2<input type="text" class= "text" id="acdn-target" onselect="click_date" readonly>

javascript

1<!-- JS --> 2<script> 3{ 4 const 5 day_name = [ 'sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat'], 6 day_jname = ['(Sun.)', '(Mon.)', '(Tue.)', '(Wed.)', '(Thurs.)', '(Fri.)', '(Sat.)'], 7 doc = document; 8 9 const 10 A = (e, ...a) => a.map (a => e.appendChild (doc.createElement (a))), 11 B = (d, n) => d.setDate (d.getDate () + n), 12 C = d => [d.getFullYear (), '年', d.getMonth () + 1 , '月'].join (''), 13 D = d => [('0' + d.getHours ()).slice (-2), ('0' + d.getMinutes ()).slice (-2)].join (':'), 14 E = (e, d) => { 15 let 16 [a,,b] = A (e, 'label', 'br', 'label'), 17 w = d.getDay () ; 18 a.textContent = d.getDate (); 19 b.textContent = day_jname[w]; 20 e.classList.add (day_name[w]); 21 }, 22 F = d => { 23 let m = d.getMonth (); 24 return [0,31,59,90,120,151,181,212,243,273,304,334][m] + d.getDate() - 1 + 25 (new Date (d.getFullYear (), m + 1,0) === 29 && 0 < m); 26 }, 27 G = ary => ary.reduce ((a, b) => { 28 let 29 c = typeof b === 'string' ? new Date (b +':00.000+09:00'): b, 30 d = D (c); 31 if (! (d in a)) a[d] = []; 32 a[d][F(c)] = true; 33 return a; 34 }, { }) 35 , 36 H = d => new Date (d.getFullYear (), d.getMonth (), d.getDate ()), 37 I = d => [('0' + d.getUTCHours ()).slice (-2), ('0' + d.getUTCMinutes ()).slice (-2)].join (':') 38 ; 39 40 41 class Shedule { 42 constructor (date = new Date, range = 7, plan = []) { 43 this.current = H (date); 44 this.date = H (date); 45 this.range = range; 46 this.plan = G (plan); 47 this.table = document.createElement ('table'); 48 49 this.remake (); 50 } 51 52 53 add (day = this.range) { 54 let d = H (this.current); 55 d.setDate (d.getDate () + day); 56 if (+this.date <= +d) { 57 this.current = d; 58 this.remake (); 59 } 60 } 61 62 63 remake () { 64 this.prev_btn = this.next_btn = null; 65 let t = this.table; 66 [...t.childNodes].forEach (e => e.remove ()); 67 68 let 69 h = t.createTHead (), 70 tr0 = h.insertRow (-1), 71 tr1 = h.insertRow (-1), 72 d = H (this.current), 73 s = tr0.insertCell (-1), 74 c = 1, 75 m = d.getMonth (); 76 77 for (let i = 0; i < this.range; i++, c++, B (d, 1)) { 78 let td = tr1.insertCell (-1); 79 if (m !== d.getMonth ()) { 80 s.colSpan = c - 1; 81 s = tr0.insertCell (-1); 82 m = d.getMonth (); 83 c = 1; 84 } 85 s.textContent = C (d); 86 E (td, d); 87 } 88 s.colSpan = c - 1; 89 90 let e = tr0.insertCell (0); 91 e.textContent = '前の一週間'; 92 e.classList.add ('button'); 93 e.rowSpan = 2; 94 this.prev_btn = e; 95 96 e = tr0.insertCell (-1); 97 e.textContent = '次の一週間'; 98 e.classList.add ('button'); 99 e.rowSpan = 2; 100 this.next_btn = e; 101 102 //__ 103 let 104 begin = new Date (Date.UTC (1970,0,1, 9, 0)),//列のスタート時間 105 end = new Date (Date.UTC (1970,0,1,11, 30)),//列の終了時間 106 step = new Date (Date.UTC (1970,0,1, 0,30)),//列の感覚調整時間 107 o = F (this.current), 108 rst = [ ]; 109 110 for (let d = begin; d < end; d = new Date (+step + (+d))) { 111 let 112 a = new Array (this.rangi), 113 b = I (d), 114 c = this.plan[b] || []; 115 116 for (let i = 0; i < this.range; i++) 117 a[i] = c[o + i] ? '-' : '◎'; 118 119 rst.push ([b, ...a, b]); 120 } 121 122 let [tb] = A (t, 'tbody'); 123 rst.forEach (r => { 124 let tr = tb.insertRow (-1); 125 r.forEach (c => tr.insertCell (-1).textContent = c) 126 }); 127 128 } 129 130 handleEvent ({target: t}) { 131 if (t === this.prev_btn) this.add (-this.range); 132 if (t === this.next_btn) this.add (this.range); 133 } 134 135 } 136 137 this.Shedule = Shedule; 138} 139 140const BUSY = [ 141 '2019-02-12T10:00' 142]; 143 144let c = new Shedule (new Date,7,BUSY), {table: d} = c; 145document.querySelector ('#calendar').appendChild (d); 146d.addEventListener ('click', c, false); 147 148var today = new Date(); 149var month = today.getMonth() + 1; 150var day = today.getDate(); 151document.write("今日は" + month + "月"+ day + "日です。"); 152document.querySelector("input").write("今日は" + month + "月"+ day + "日です。"); 153</script>

試したこと

querySelectorを使用して意図した処理を実装しようとしたのですが、出来ませんでした。
javascriptについては初学者のためもしお分かりになりましたらご教授のほどよろしくお願い申し上げます。

補足情報(FW/ツールのバージョンなど)

Javascript

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

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

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

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

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

guest

回答3

0

ベストアンサー

JavaScript

1document.querySelector('#calendar tbody').addEventListener('click', event => { 2 const target = event.target; 3 if (target.nodeName.toLowerCase() !== 'td') { 4 return true; 5 } 6 7 const time = target.parentNode.cells[0].textContent; 8 const table = target.closest('table'); 9 const date = table.tHead.rows[1].cells[target.cellIndex - 1].textContent; 10 document.getElementById('acdn-target').value = date + time; 11 return true; 12}, false);

年月を取得するのは骨が折れるので、あらかじめカレンダー作成時にデータを入れておいたほうがいいのでは?
そうすれば余計なセルクリックも取得しなくて済みますし。

HTML

1<td data-date="2019-01-31">

-- 18:15 修正・年月取得版追加

JavaScript

1document.querySelector('#calendar').addEventListener('click', event => { 2 const target = event.target; 3 if (target.nodeName.toLowerCase() !== 'td') { 4 return true; 5 } 6 7 if (!(target.closest('tbody') && 1 <= target.cellIndex && target.cellIndex <= 7)) { 8 return true; 9 } 10 11 const time = target.parentNode.cells[0].textContent; 12 const table = target.closest('table'); 13 const date = table.tHead.rows[1].cells[target.cellIndex - 1].textContent; 14 const ymrow = table.tHead.rows[0]; 15 const ym = (target.cellIndex <= ymrow.cells[1].colSpan ? ymrow.cells[1] : ymrow.cells[2]).textContent; 16 document.getElementById('acdn-target').value = ym + date + time; 17 return true; 18}, false);

投稿2019/01/31 05:45

編集2019/01/31 09:16
x_x

総合スコア13749

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

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

rails_ruby

2019/01/31 06:11

ありがとうございます。動きました。 ちなみにinput textに月も反映させたいので下記のようにしてみたのですが、動きませんでした。もし差し支えがなければ、年、月の表示に関してどのようにコードを書けばいいのか教えて頂けないでしょうか? const month = tablet.getMonth.textContent;
x_x

2019/01/31 06:18

tablet ってどこから来ましたかね? すでに回答に書いた通り、作成時に保持したほうが楽です。
rails_ruby

2019/01/31 06:23

あ、勘違いしていました。 ご迷惑おかけして申し訳ありませんでした。
rails_ruby

2019/01/31 08:07 編集

先ほどはご回答していただきありがとうございました。 ご教授していただいたプログラムで私の実現したいことはできたのですが、翌週や前週に進んだり遡ると日付のデータが取得できなくなります。この場合、どのようにすればいいか再度教えて頂くことはできないでしょうか?
x_x

2019/01/31 08:16

table 自体を再作成しちゃってますかね? document.querySelector('#calendar tbody') これを document.querySelector('#calendar') とすればとりあえずは動きます。 関係ないセルを弾く処理は入れていないので、クリックされたのが tbody 内か、さらに cellIndex が1-7の範囲内かを見たほうがいいかもしれません。
rails_ruby

2019/01/31 08:36

document.querySelector('#calendar tbody')にすることによっておそらくtableが再生されていたかなと思われます。(あまり詳しいくは分からないのすが) document.querySelector('#calendar')にすることによって翌週以降の日付を取得することができました。 ご迷惑おかけして申し訳ございませんでした。
x_x

2019/01/31 09:19

迷惑とは思っていませんが、気になることが一つ。 事前にデータを入れておけと言っていましたが、カレンダーが日付を持ちまわさない面倒な作りになっていて修正が容易ではありません。 仮に年月を取得するようにしてみましたが、「日」がないのが気になるので余裕があればreplace()してみてください。
guest

0

writeってあります?HTMLELementに?

私のvscodeはヒント出してくれなかったんで、document.querySelector("input").value = "a"なら動きました。

投稿2019/01/31 04:30

papinianus

総合スコア12705

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

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

rails_ruby

2019/01/31 04:44

すいませんでした。writeの記述に関しては他のコードから引っ張ってきたので私の勘違いで消し忘れていました。 document.querySelector("input").value = "a"ではaが出力されるところまで確認できたのですが、今回行いたい事としては、カレンダー内のtdをクリック時にカレンダーのデータを出力させたいのでその部分に関してご教授お願いできませんか? 下記はcodepenで作成したカレンダーのサンプルです。 https://codepen.io/keien-nishikawa/pen/MLyObq
papinianus

2019/01/31 04:53 編集

え? document.querySelector("input").value = ("今日は" + month + "月"+ day + "日です。"); ということですか?右辺の()はあってもなくてもいいです↓。 document.querySelector("input").value = "今日は" + month + "月"+ day + "日です。";
rails_ruby

2019/01/31 05:09

もしかして私の勘違いかもしれませんが、@papinianusさんの方ではdocument.querySelector("input").value = "a"でtdにクリックするときに日付のデータを取得できたのでしょうか?私の方では、inputにaとしか表示されていない状況です。 ちなみにイメージとしてはカレンダーの2月1日9:00のtdをクリックすると、inputには、2月1日 9:00と表示させたいです。
papinianus

2019/01/31 05:11

codepenにログインできないんで更新できないのですが 最後の行の document.querySelector("input") = "今日は" + month + "月"+ day + "日です。"; を document.querySelector("input").value = "今日は" + month + "月"+ day + "日です。"; にしてはどうでしょうか、という意味です。
rails_ruby

2019/01/31 05:22

document.querySelector("input").value = "今日は" + month + "月"+ day + "日です。";について今試してみたのですが、動きませんでした... 一からコードを書いたわけではないので自分でもあまり原因を特定できいないのですがもしかしたら、td内に日付の情報が入っていない可能性ってあるのでしょうか?
papinianus

2019/01/31 05:31 編集

var tds = document.querySelectorAll('td'); Array.from(tds).forEach(td => { td.addEventListener('click', function(event) { document.querySelector("input").value = "今日は" + month + "月"+ day + "日です。" }); }); ちゃんと見てなかったんですが、eventlistenerがついてないんでそりゃ何もおきませんね。その前にでてくるところもでも`d`という変数が何か分かりません。 何か分かりませんっていうか、宣言されてない気がする 最後の行を↑のようにすれば動きそうですが、他の部分でエラーがあれば動かない可能性もあります。
rails_ruby

2019/01/31 05:39

ご教授していただいたコードをコピペしてみたのですが、日付のデータは取得できませんでした。そのためクリックイベントが動作するか確かめるために、document.querySelector("input").value = "c"としたところクリック時にcをinputに表示させることまではできました。 なのでおそらくtd内には日付等のデータが入っていないのかもしれないです。
papinianus

2019/01/31 05:47 編集

tdの値をyearやmonthに入れるコードがないんだと思います。 他に正しい回答ついたんでそっちで。
guest

0

https://www.sejuku.net/blog/70581

document.querySelector("input").write("今日は" + month + "月"+ day + "日です。");

このquerySelectorの中身をテキストボックスのクラス名('.text')にしても動きませんか?

投稿2019/01/31 04:27

azuapricot

総合スコア2341

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

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

rails_ruby

2019/01/31 05:11

動きませんでした... もしかしたらそもそもtd内に日付のデータが入ってないからかもしれないです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問