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

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

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

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

JavaScript

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

HTML

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

Q&A

解決済

3回答

1722閲覧

javascriptでhtmlのvalueを配列として取得する方法

nanase21

総合スコア144

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

JavaScript

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

HTML

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

0グッド

0クリップ

投稿2019/03/02 09:33

編集2019/03/02 11:28

前提・実現したいこと

mysqlのデータをjsに反映させる方法を知りたいです。
データの中身
0. 2019-03-26-15:00 60分コース
0. 2019-03-10-09:00 90分コース
0. 2019-03-03-09:00 30分コース
0. 2019-02-26-11:00 120分コース
0. 2019-02-26-15:00 150分コース
0. 2019-03-03-15:00 180分コース
0. 2019-03-02-11:00 210分コース
0. 2019-03-02-09:00 120分コース
0. 2019-03-08-10:30 60分コース

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

htmlのvalueをjsを取得して下記のコードでmysqlのデータを反映させているのですが、先頭のデータしか反映させることが出来ずにいます。
恐らく、配列?にしてデータを取得する必要があるのかなと思うのですが、その方法が分からないです。

ruby

1#erb 2<input type="hidden" name="sample" value="<%= booking.start_date.strftime("%Y-%m-%d-%H:%M") %>", id='sample',class='sample_class' readonly>

js

1//sampleはhtmlのinputのIDです。 2 3shedule.setBook (new Date (year, month - 1, day, hour, minutes), course).remake ();

該当のソースコード

js

1window.onload = function() { 2 { 3 const 4 day_name = [ 'sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat'], 5 day_jname = ['(Sun.)', '(Mon.)', '(Tue.)', '(Wed.)', '(Thu.)', '(Fri.)', '(Sat.)'], 6 doc = document, 7 DEF_OPTION = { }; 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 H = d => new Date (d.getFullYear (), d.getMonth (), d.getDate ()), 28 I = d => [('0' + d.getUTCHours ()).slice (-2), ('0' + d.getUTCMinutes ()).slice (-2)].join (':'); 29 30 //_____________ 31 32 33 class Shedule { 34 35 constructor (date = new Date, range = 7, plan = [ ], option = DEF_OPTION) { 36 this.current = H (date);//表の左端の日付、これを基準とする 37 this.date = H (date); 38 this.range = range; //何日分を表示するか 39 this.plan = plan; //予定表が構成される 40 this.table = document.createElement ('table'); 41 this.option = Object.assign ({ }, option); 42 43 this.remake (); 44 } 45 46 47 add (day = this.range) { 48 let d = H (this.current); 49 d.setDate (d.getDate () + day); 50 if (+this.date <= +d) 51 this.current = d; 52 return this; 53 } 54 55 56 setHoliday (...dayNo) { 57 let 58 year = this.current.getFullYear (), 59 start = new Date (year, 0, 1), 60 end = new Date (year, 12, 1), 61 62 b = new Date (Date.UTC (1970,0,1, 0, 0)),//列のスタート時間 63 e = new Date (Date.UTC (1970,0,1,24, 30)),//列の終了時間 64 s = new Date (Date.UTC (1970,0,1, 0,30));//列の感覚調整時間 65 66 dayNo.forEach (n => { 67 let current = new Date (start); 68 69 current.setDate (7 - current.getDate () + n); 70 71 for (; current < end; current.setDate (current.getDate () + 7)) { 72 let idx = F (current); 73 74 for (let c = b; c < e; c = new Date (+s + (+c))) { 75 let key = I (c); 76 if (! this.plan[key]) 77 this.plan[key] = [ ]; 78 this.plan[key][idx] = true; 79 } 80 } 81 }); 82 83 return this; 84 } 85 86 87 88 setLunchTime (...dayNo) { 89 let 90 year = this.current.getFullYear (), 91 start = new Date (year, 0, 1), 92 end = new Date (year, 12, 1), 93 94 b = new Date (Date.UTC (1970,0,1, 12, 0)),//列のスタート時間 95 e = new Date (Date.UTC (1970,0,1,13, 30)),//列の終了時間 96 s = new Date (Date.UTC (1970,0,1, 0,30));//列の感覚調整時間 97 98 dayNo.forEach (n => { 99 let current = new Date (start); 100 current.setDate (7 - current.getDate () + n); 101 102 for (; current < end; current.setDate (current.getDate () + 7)) { 103 let idx = F (current); 104 105 for (let c = b; c < e; c = new Date (+s + (+c))) { 106 let key = I (c); 107 if (! this.plan[key]) 108 this.plan[key] = [ ]; 109 this.plan[key][idx] = true; 110 } 111 } 112 }); 113 114 return this; 115 } 116 117 118 //Booking 119 setBook (date, occupancyTime) {// 予約日時,占有時間(分) 120 let 121 current = new Date (date), 122 dayNo = F (current), 123 sTime = 30,//30間隔 124 step = new Date (Date.UTC (1970,0,1, 0, sTime)), 125 cnt = Math.floor (occupancyTime / sTime); 126 127 for (let i = 0; i < cnt; i++) { 128 let time = D (current); 129 if (! this.plan[time]) 130 this.plan[time] = [ ]; 131 this.plan[time][dayNo] = true; 132 current.setTime (+current +(+step)); 133 } 134 return this; 135 } 136 137 remake () { 138 this.prev_btn = this.next_btn = null; 139 let t = this.table; 140 [...t.childNodes].forEach (e => e.remove ()); 141 142 let 143 h = t.createTHead (), 144 tr0 = h.insertRow (-1), 145 tr1 = h.insertRow (-1), 146 d = H (this.current), 147 s = tr0.insertCell (-1), 148 c = 1, 149 m = d.getMonth (); 150 151 for (let i = 0; i < this.range; i++, c++, B (d, 1)) { 152 let td = tr1.insertCell (-1); 153 if (m !== d.getMonth ()) { 154 s.colSpan = c - 1; 155 s = tr0.insertCell (-1); 156 m = d.getMonth (); 157 c = 1; 158 } 159 s.textContent = C (d); 160 E (td, d); 161 } 162 s.colSpan = c - 1; 163 164 let e = tr0.insertCell (0); 165 e.textContent = '前の一週間'; 166 e.classList.add ('button'); 167 e.rowSpan = 2; 168 this.prev_btn = e; 169 170 e = tr0.insertCell (-1); 171 e.textContent = '次の一週間'; 172 e.classList.add ('button'); 173 e.rowSpan = 2; 174 this.next_btn = e; 175 176 //__ 177 let 178 begin = new Date (Date.UTC (1970,0,1, 9, 0)),//列のスタート時間 179 end = new Date (Date.UTC (1970,0,1,17, 30)),//列の終了時間 180 step = new Date (Date.UTC (1970,0,1, 0,30)),//列の感覚調整時間 181 o = F (this.current), 182 rst = [ ]; 183 184 for (let d = begin; d < end; d = new Date (+step + (+d))) { 185 let 186 a = new Array (this.rangi), 187 b = I (d), 188 c = this.plan[b] || []; 189 190 for (let i = 0; i < this.range; i++) 191 a[i] = c[o + i] ? '-' : '◎'; 192 193 rst.push ([b, ...a, b]); 194 } 195 196 let [tb] = A (t, 'tbody'); 197 rst.forEach (r => { 198 let tr = tb.insertRow (-1); 199 r.forEach (c => tr.insertCell (-1).textContent = c) 200 }); 201 202 return this; 203 } 204 205 206 handleEvent (event) { 207 let t = event.target; 208 if (t === this.prev_btn) this.add (-this.range).remake (); 209 if (t === this.next_btn) this.add ( this.range).remake (); 210 211 let cbfunc = this.option.handleEvent; 212 if ('function' === typeof cbfunc) 213 cbfunc.call (this, event); 214 } 215 216 217 static convert (ary) { 218 let rst = { }; 219 ary.forEach (a => { 220 let 221 dt = new Date (a + ':00.000+09:00'), 222 tm = D (dt), 223 dn = F (dt); 224 if (! rst[tm]) 225 rst[tm] = []; 226 rst[tm][dn] = true; 227 }); 228 return rst; 229 } 230 231 } 232 233 this.Shedule = Shedule; 234 } 235 236 //_____________ 237 function strDateJp (date) { 238 let [y, m, d] = ['getFullYear', 'getMonth', 'getDate'].map (fc => date[fc]()); 239 return `${y}${m+1}${d}`; 240 } 241 242 243 //___________________________ 244 245 const 246 BUSY = ['2019-02-19T14:30', '2019-02-21T14:30'], 247 plan = Shedule.convert (BUSY), 248 shedule = new Shedule (new Date, 7, plan), 249 table = shedule.table; 250 251 table.border = 1; 252 //月水金を休日      昼休みがあるのが日火木土 253 //shedule.setHoliday (1, 3, 5).setLunchTime (0, 2, 4, 6)//..remake (); 254 255 //start--時間の時と分の分割処理 256 var name_start = document.getElementById('sample').value; 257 258 console.log(name_start); 259 var year = name_start.substr( 0, 4 );  260 var month = name_start.substr( 5, 2 ); 261 var day = name_start.substr( 8, 2 ); 262 var hour = name_start.substr( 11, 2 ); 263 var minutes = name_start.substr( 14, 2 ); 264 var course = name_start.substr( 17, 4 ); 265 266 console.log(year); 267 console.log(month); 268 console.log(day); 269 console.log(hour); 270 console.log(minutes); 271 272 //mysqlのデータ 273 shedule.setBook (new Date (year, month - 1, day, hour, minutes), course).remake (); 274  //予約入った時 例) 2月24日 9時30 2時間コースと予約が入った時 275 shedule.setBook (new Date (year, 1, 24, 9, 30), 120).remake (); 276 277 //shedule.remake (); //単独で表を更新 278 document 279 .querySelector ('#calendar') 280 .appendChild (table) 281 .addEventListener ('click', shedule, false);

試したこと

valueを取得する時に配列で取得したかったのですが取得方法がわかりませんでした。また、htmのvalueを取得したコードを見ていただけると分かると思いますがjavascriptを勉強し始めたばかりのため冗長なコードになっています。

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

javascript

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

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

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

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

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

guest

回答3

0

MySQLはWebサーバ側に存在するデータベースです。
ブラウザはWebサーバへHTTPリクエストを投げてHTMLファイルをダウンロードした後に解析、
その中に<script>タグを見つけたらその中身をJavaScriptのコードとして実行するという流れになります。

なのでJavaScriptにMySQLを操る権限はありません。
JavaScriptに出来るのはダウンロードしたHTMLファイルに書かれている内容を元に実行することだけです。

mysqlのデータをjsに反映させる方法を知りたいです。

ふむふむ、上記の理由で日本語でおkみたいな事になっていますが概ね把握しました。
ソースコード指定の「Ruby #erb」という記述がありますね。
つまり、Ruby(多分Railsかな?)がWebサーバとして可動しており、HTTPリクエストが来たらHTMLファイルを動的に生成して投げ返しているのでしょう。

そうであれば、JSに反映させる為には、MySQLのデータをHTMLファイル上に書き出して、
JavaScriptにJavaScriptコードとして読み込んでもらうという形で実現可能です。

まずはerbの学習を進めましょう。

htmlのvalueをjsを取得して下記のコードでmysqlのデータを反映させているのです

お前また言ってる事が変わってるじゃねーか!!
上記言ってる内容は「MySQL→HTML」、今回の言ってる内容は「HTML→MySQL」
つまり、「読み」「書き」両方したいと言ってるわけですね。

ブラウザはformタグがあればWebサーバに対してHTTPリクエストを飛ばす事が出来ます。
その時formタグ内にinput要素があればそれをPOSTやGET等のパラメータとして付与できます。
詳しくはHTMLのformやinputに関して学習してください。

HTTPリクエストを受け取ったWebサーバ、
Rubyでパラメータ情報を吸い上げてMySQLへ反映するためのコードを書きましょう。
恐らくRailsでしょうけど書いてありませんので、そのまま学習を進めるなどしてリクエストを吸い上げる所を勉強してください。

配列?にしてデータを取得する必要があるのかなと思うのですが、その方法が分からないです。

配列にして頑張るのはRubyのerbテンプレートの話です。
JavaScriptではありません。

まずはRubyとerbを学習してください。

投稿2019/03/03 01:46

miyabi-sun

総合スコア21158

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

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

0

ベストアンサー

Ajaxで読み込めばいいものを。

納期とかないのですか?
時間がかかっているようですが大丈夫?

javascript

1<textarea id="sample" style="display:none"> 22019-03-26-15:00 60分コース 32019-03-10-09:00 90分コース 42019-03-03-09:00 30分コース 52019-02-26-11:00 120分コース 62019-02-26-15:00 150分コース 72019-03-03-15:00 180分コース 82019-03-02-11:00 210分コース 92019-03-02-09:00 120分コース 102019-03-08-10:30 60分コース 11</textarea> 12 13<script> 14console.log( 15 document.getElementById('sample') 16 .value.trim() 17 .split(/\n|\r|\r|n/) 18 .map (a=>a.match(/(\d+)/g).map(a=>parseInt(a,10))) 19 .map (([y,m,d,h,mn,c])=>[new Date(y,m-1,d,h,mn), c]) 20); 21</script> 22

投稿2019/03/02 12:13

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

nanase21

2019/03/02 13:51

私自身、プログラミングを勉強し始めた初学者ですので、これは勉強の一環で作っているものでして、特に納期というのは無いです。心配して頂いて申し訳ございません。 今Ajaxについて調べさせていただきました。Ajaxにの使い方についてまだ触れたことがないので勉強してます。 ちなみになんですが、@hai_haiさんはjsを勉強する時どのようにしているのでしょうか?基本的な文法の書き方については分かるようになってきたのですが、ご教示頂いたカレンダーのようなコードを空で書けと言われたら書ける自信がないです...
退会済みユーザー

退会済みユーザー

2019/03/02 14:08

勉強!? 書籍か、写経か、ネットか、御師匠様か? ここ以外で質問してみれば? 関係のないことだけれど 先だって、ここのご意見番どもに「守破離」という言葉をいただいた。 もっともだな、と凄く感銘した。
nanase21

2019/03/03 11:50

稚拙な質問してしまし申し訳ございませんでした。 書籍の方を購入し、勉強してみます。 ご教示いただきありがとうございました。
nanase21

2019/03/21 10:21

@hai_haiさん 以前、カレンダーの実装について質問させて頂いたnanaseと申します。 カレンダーについてまたご質問をさせていただきたい事があるのですが、ご教示頂けないでしょうか? 私なりに頑張ってみたのですが、実力不足のため思うようにいかず困っています。 何度もご質問してしまい、ご迷惑をおかけしてしまい申し訳御座いませんがご教示いただけると幸いです。
guest

0

html

1<ol> 2 <li class="items"></li> 3 <li class="items"></li> 4 <li class="items"></li> 5 <li class="items"></li> 6 <li class="items"></li> 7 <li class="items"></li> 8 <li class="items"></li> 9 <li class="items"></li> 10 <li class="items"></li> 11 <li class="items"></li> 12</ol>

js

1const items = document.getElementsByClassName("items"); 2for (const el of items) { 3 el.innerText = "test"; 4}

取得したい要素全てに適当なクラス名を指定します。
次にJavaScriptでdocument.getElementsByClassName(任意のクラス名);で先程クラス名を書いた要素を配列で取得します。
取得した配列をforofなどを使ってDBから取得したデータを反映させればいいと思います。

投稿2019/03/02 09:44

編集2019/03/02 09:45
gogojp

総合スコア211

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問