teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

14

コードの更新 反対側の●も保存

2020/10/14 07:16

投稿

Zengo_Master
Zengo_Master

スコア19

title CHANGED
File without changes
body CHANGED
@@ -42,14 +42,20 @@
42
42
  end
43
43
 
44
44
  def win_or_lose
45
+ // 数字_数字を分解
46
+ resultAry = params[:id].split("_")
47
+ // 左側が勝利のtd
45
- result = Result.find(params[:id])
48
+ result_win = Result.find(resultAry[0])
49
+ // 右側が敗北のtd
50
+ result_lose = Result.find(resultAry[1])
51
+
46
- if result.result == ""
52
+ if result_win.result == ""
47
- result.update(result: "")
53
+ result_win.update(result: "")
54
+ result_lose.update(result: "")
48
- else result.result == ""
55
+ else result_win.result == ""
49
- result.update(result: "")
56
+ result_win.update(result: "")
57
+ result_lose.update(result: "●")
50
58
  end
51
- item = Result.find(params[:id])
52
- render json: { result: item }
53
59
  end
54
60
 
55
61
  end
@@ -77,9 +83,11 @@
77
83
  <tr class="result-cells">
78
84
  <td id="rank_<%= i + 1 %>"></td>
79
85
  <td class="self-name"><%= member.name %></td>
86
+ // 勝敗記入のtd
80
- <td id="op_<%= i + 1 %>_1" data-id=<%= (i * 10) + 1 %>><%= Result.find((i * 10) + 1).result %></td>
87
+ <td id="op_<%= i + 1 %>_1" data-id="<%= (i * 10) + 1 %>_<%= (10 * (i * 10 + 1)) - (100 * i + (9 - i)) %>"><%= Result.find((i * 10) + 1).result %></td>
81
88
  // 途中略
82
- <td id="op_<%= i + 1 %>_10" data-id=<%= (i * 10) + 10 %>><%= Result.find((i * 10) + 10).result %></td>
89
+ <td id="op_<%= i + 1 %>_10" data-id="<%= (i * 10) + 10 %>_<%= (10 * (i * 10 + 10)) - (100 * i + (9 - i)) %>"><%= Result.find((i * 10) + 10).result %></td>
90
+ // 勝敗のtd
83
91
  <td id="win_<%= i + 1 %>">0</td>
84
92
  <td id="lose_<%= i + 1 %>">0</td>
85
93
  <td id="sb_<%= i + 1 %>">0</td>
@@ -208,14 +216,7 @@
208
216
  var json_data = {"_1":{
209
217
  "member":"Aさん",
210
218
  "_1":{"member":"Aさん","WinOrLose":9},
211
- "_2":{"member":"Bさん","WinOrLose":0},
219
+ // 途中略
212
- "_3":{"member":"Cさん","WinOrLose":0},
213
- "_4":{"member":"Dさん","WinOrLose":0},
214
- "_5":{"member":"Eさん","WinOrLose":0},
215
- "_6":{"member":"Fさん","WinOrLose":0},
216
- "_7":{"member":"Gさん","WinOrLose":0},
217
- "_8":{"member":"Hさん","WinOrLose":0},
218
- "_9":{"member":"Iさん","WinOrLose":0},
219
220
  "_10":{"member":"Jさん","WinOrLose":0}
220
221
  },
221
222
 
@@ -224,14 +225,7 @@
224
225
  "_10":{
225
226
  "member":"Jさん",
226
227
  "_1":{"member":"Aさん","WinOrLose":0},
227
- "_2":{"member":"Bさん","WinOrLose":0},
228
+ // 途中略
228
- "_3":{"member":"Cさん","WinOrLose":0},
229
- "_4":{"member":"Dさん","WinOrLose":0},
230
- "_5":{"member":"Eさん","WinOrLose":0},
231
- "_6":{"member":"Fさん","WinOrLose":0},
232
- "_7":{"member":"Gさん","WinOrLose":0},
233
- "_8":{"member":"Hさん","WinOrLose":0},
234
- "_9":{"member":"Iさん","WinOrLose":0},
235
229
  "_10":{"member":"Jさん","WinOrLose":9}
236
230
  }
237
231
  };

13

コードの更新

2020/10/14 07:16

投稿

Zengo_Master
Zengo_Master

スコア19

title CHANGED
File without changes
body CHANGED
@@ -241,6 +241,8 @@
241
241
  var trs = document.getElementById("winorlose_table").getElementsByTagName('tr');
242
242
  // 1行目はヘッダーだから飛ばして
243
243
  for(var itr = 1; itr < trs.length; itr++){
244
+ var win = 0;
245
+ var lose = 0;
244
246
  // テーブルの行毎に処理
245
247
  var tds = trs[itr].getElementsByTagName('td');
246
248
  for(var itd = 0; itd < tds.length; itd++){
@@ -249,26 +251,36 @@
249
251
  var arr = tds[itd].id.split('_'); // op_数字_数字 → [op, 数字, 数字]
250
252
  if(arr[1] == arr[2]){
251
253
  // 対戦が同じ場合
252
- tds[itd].classList.add('right_down_border');
254
+ tds[itd].classList.add('right_down_border'); // 縦横同値マスにクラスを指定
253
255
  }
254
256
  else {
257
+ // 勝ち数を加算
258
+ if(tds[itd].innerHTML == '○'){
259
+ win ++;
260
+ }
261
+ // 負け数を加算
262
+ else if(tds[itd].innerHTML == '●'){
263
+ lose ++;
264
+ }
255
265
  // 対戦が違う場合、イベントを登録
256
266
  // onclick="winorlose_click(this);" と同じ内容
257
267
  tds[itd].addEventListener('click', {name: this, handleEvent: winorlose_click});
258
268
  if(json_data['_'+ arr[1]]['_'+ arr[2]]["WinOrLose"] == 1){
259
269
  tds[itd].innerHTML = "○";
260
- }
270
+ }
261
271
  else if(json_data['_'+ arr[1]]['_'+ arr[2]]["WinOrLose"] == -1) {
262
272
  tds[itd].innerHTML = "●";
263
273
  }
264
274
  }
265
275
  }
266
- // else if(tds[itd].id.indexOf('win_') != -1){ // idにwin_を含む(勝ち数のtd)
276
+ else if(tds[itd].id.indexOf('win_') != -1) {
267
- // tds[itd].innerHTML = json_data['_'+ arr[1]]['_'+ arr[2]]["WinCount"];
268
- // }
277
+ // 勝ち表示
278
+ tds[itd].innerHTML = win;
279
+ }
269
- // else { // 残るは負け数
280
+ else if(tds[itd].id.indexOf('lose_') != -1) {
270
- // tds[itd].innerHTML = json_data['_'+ arr[1]]['_'+ arr[2]]["LoseCount"];
271
- // }
281
+ // 負け表示
282
+ tds[itd].innerHTML = lose;
283
+ }
272
284
  }
273
285
  }
274
286
  }
@@ -281,21 +293,22 @@
281
293
  send_winorlose = true; // 処理中とする
282
294
 
283
295
  // el にはどこでクリックされたかの情報が入っている
284
- var arr = el.target.id.split('_'); // idを'_'で分ける
296
+ var arr = el.target.id.split('_'); // idを'_'で分ける .targetで親要素イベントも発火
285
297
  var oppid = arr[0] + '_' + arr[2] + '_'+ arr[1]; // 反対側のid
286
298
  // 勝敗の記入と取消
287
299
  if(el.target.innerHTML == ''){ // 勝敗を記入
288
300
  el.target.innerHTML = '○'; // 勝ち
289
- document.getElementById(oppid).innerHTML = '●'; // 負け
301
+ document.getElementById(oppid).innerHTML = '●'; // 負け
290
- json_data['_'+ arr[1]]['_'+ arr[2]]["WinOrLose"] = 1;
302
+ json_data['_'+ arr[1]]['_'+ arr[2]]["WinOrLose"] = 1; //jsonのデータ自体を更新
291
- json_data['_'+ arr[2]]['_'+ arr[1]]["WinOrLose"] = -1;
303
+ json_data['_'+ arr[2]]['_'+ arr[1]]["WinOrLose"] = -1; //jsonのデータ自体を更新
292
304
  }
293
305
  else if(el.target.innerHTML == '○'){ // 勝敗を取消
294
306
  el.target.innerHTML = ''; // 空白
295
307
  document.getElementById(oppid).innerHTML = ''; // 空白
296
- json_data['_'+ arr[1]]['_'+ arr[2]]["WinOrLose"] = 0;
308
+ json_data['_'+ arr[1]]['_'+ arr[2]]["WinOrLose"] = 0; //jsonのデータ自体を更新
297
- json_data['_'+ arr[2]]['_'+ arr[1]]["WinOrLose"] = 0;
309
+ json_data['_'+ arr[2]]['_'+ arr[1]]["WinOrLose"] = 0; //jsonのデータ自体を更新
298
310
  }
311
+
299
312
  // 勝ち数と負け数の計算
300
313
  var trs = document.getElementById("winorlose_table").getElementsByTagName('tr');
301
314
  var win = 0;
@@ -311,7 +324,7 @@
311
324
  // 勝ち負け数カウント
312
325
  if(tds[itd].innerHTML == '○'){
313
326
  win ++;
314
- }else if(tds[itd].innerHTML == '●'){
327
+ } else if(tds[itd].innerHTML == '●'){
315
328
  lose ++;
316
329
  }
317
330
  } else if(tds[itd].id.indexOf('win_') != -1){

12

コードの修正

2020/10/13 13:26

投稿

Zengo_Master
Zengo_Master

スコア19

title CHANGED
File without changes
body CHANGED
@@ -274,8 +274,13 @@
274
274
  }
275
275
 
276
276
  // クリックしたときの処理
277
+ var send_winorlose = false;
278
+ var XHR;
277
279
  function winorlose_click(el){
280
+ if(send_winorlose) return; // 送信中は実行できない
281
+ send_winorlose = true; // 処理中とする
282
+
278
- // el にはどこでクリックされたかの情報が入っている
283
+ // el にはどこでクリックされたかの情報が入っている
279
284
  var arr = el.target.id.split('_'); // idを'_'で分ける
280
285
  var oppid = arr[0] + '_' + arr[2] + '_'+ arr[1]; // 反対側のid
281
286
  // 勝敗の記入と取消
@@ -318,20 +323,22 @@
318
323
  }
319
324
  }
320
325
  }
326
+
327
+ //※ データの送信は処理の最後
328
+ //※ 非同期でも結果が返ってくるまでクリックを無視するように変更
321
- let resultId = el.target.getAttribute("data-id");
329
+ let resultId = el.target.getAttribute("data-id");
330
+ if(!XHR){
322
- let XHR = new XMLHttpRequest();
331
+ XHR = new XMLHttpRequest();
323
- XHR.open("GET", `/results/${resultId}`, false);
324
- XHR.responseType = "text";
332
+ XHR.responseType = "json";
325
- XHR.send();
326
- XHR.onload = function (e) {
333
+ XHR.onload = function() {
327
- if (xhr.readyState === 4) {
328
- if (xhr.status === 200) {
329
- console.log(xhr.responseText);
334
+ send_winorlose = false; // 送信完了
330
- } else {
331
- console.error(xhr.statusText);
332
- }
333
- }
334
335
  };
336
+ XHR.onerror = function() {
337
+ send_winorlose = false; // 送信完了
338
+ };
339
+ }
340
+ XHR.open("GET", `/results/${resultId}`, true);
341
+ XHR.send();
335
342
  }
336
343
 
337
344
  window.addEventListener("load", init);

11

データ送信部分のコード修正

2020/10/13 12:36

投稿

Zengo_Master
Zengo_Master

スコア19

title CHANGED
File without changes
body CHANGED
@@ -321,8 +321,17 @@
321
321
  let resultId = el.target.getAttribute("data-id");
322
322
  let XHR = new XMLHttpRequest();
323
323
  XHR.open("GET", `/results/${resultId}`, false);
324
- XHR.responseType = "json";
324
+ XHR.responseType = "text";
325
325
  XHR.send();
326
+ XHR.onload = function (e) {
327
+ if (xhr.readyState === 4) {
328
+ if (xhr.status === 200) {
329
+ console.log(xhr.responseText);
330
+ } else {
331
+ console.error(xhr.statusText);
332
+ }
333
+ }
334
+ };
326
335
  }
327
336
 
328
337
  window.addEventListener("load", init);

10

コードの修正

2020/10/13 09:05

投稿

Zengo_Master
Zengo_Master

スコア19

title CHANGED
File without changes
body CHANGED
@@ -275,11 +275,6 @@
275
275
 
276
276
  // クリックしたときの処理
277
277
  function winorlose_click(el){
278
- const resultId = el.target.getAttribute("data-id");
279
- const XHR = new XMLHttpRequest();
280
- XHR.open("GET", `/results/${resultId}`, true);
281
- XHR.responseType = "json";
282
- XHR.send();
283
278
  // el にはどこでクリックされたかの情報が入っている
284
279
  var arr = el.target.id.split('_'); // idを'_'で分ける
285
280
  var oppid = arr[0] + '_' + arr[2] + '_'+ arr[1]; // 反対側のid

9

コードの変更

2020/10/12 12:57

投稿

Zengo_Master
Zengo_Master

スコア19

title CHANGED
File without changes
body CHANGED
@@ -78,14 +78,7 @@
78
78
  <td id="rank_<%= i + 1 %>"></td>
79
79
  <td class="self-name"><%= member.name %></td>
80
80
  <td id="op_<%= i + 1 %>_1" data-id=<%= (i * 10) + 1 %>><%= Result.find((i * 10) + 1).result %></td>
81
- <td id="op_<%= i + 1 %>_2" data-id=<%= (i * 10) + 2 %>><%= Result.find((i * 10) + 2).result %></td>
81
+ // 途中略
82
- <td id="op_<%= i + 1 %>_3" data-id=<%= (i * 10) + 3 %>><%= Result.find((i * 10) + 3).result %></td>
83
- <td id="op_<%= i + 1 %>_4" data-id=<%= (i * 10) + 4 %>><%= Result.find((i * 10) + 4).result %></td>
84
- <td id="op_<%= i + 1 %>_5" data-id=<%= (i * 10) + 5 %>><%= Result.find((i * 10) + 5).result %></td>
85
- <td id="op_<%= i + 1 %>_6" data-id=<%= (i * 10) + 6 %>><%= Result.find((i * 10) + 6).result %></td>
86
- <td id="op_<%= i + 1 %>_7" data-id=<%= (i * 10) + 7 %>><%= Result.find((i * 10) + 7).result %></td>
87
- <td id="op_<%= i + 1 %>_8" data-id=<%= (i * 10) + 8 %>><%= Result.find((i * 10) + 8).result %></td>
88
- <td id="op_<%= i + 1 %>_9" data-id=<%= (i * 10) + 9 %>><%= Result.find((i * 10) + 9).result %></td>
89
82
  <td id="op_<%= i + 1 %>_10" data-id=<%= (i * 10) + 10 %>><%= Result.find((i * 10) + 10).result %></td>
90
83
  <td id="win_<%= i + 1 %>">0</td>
91
84
  <td id="lose_<%= i + 1 %>">0</td>
@@ -256,7 +249,7 @@
256
249
  var arr = tds[itd].id.split('_'); // op_数字_数字 → [op, 数字, 数字]
257
250
  if(arr[1] == arr[2]){
258
251
  // 対戦が同じ場合
259
- tds[itd].classList.add('right_down_border'); // 縦横同値マスにクラスを指定
252
+ tds[itd].classList.add('right_down_border');
260
253
  }
261
254
  else {
262
255
  // 対戦が違う場合、イベントを登録
@@ -288,16 +281,20 @@
288
281
  XHR.responseType = "json";
289
282
  XHR.send();
290
283
  // el にはどこでクリックされたかの情報が入っている
291
- var arr = el.target.id.split('_'); // idを'_'で分ける .targetで親要素イベントも発火
284
+ var arr = el.target.id.split('_'); // idを'_'で分ける
292
285
  var oppid = arr[0] + '_' + arr[2] + '_'+ arr[1]; // 反対側のid
293
286
  // 勝敗の記入と取消
294
287
  if(el.target.innerHTML == ''){ // 勝敗を記入
295
288
  el.target.innerHTML = '○'; // 勝ち
296
- document.getElementById(oppid).innerHTML = '●'; // 負け
289
+ document.getElementById(oppid).innerHTML = '●'; // 負け
290
+ json_data['_'+ arr[1]]['_'+ arr[2]]["WinOrLose"] = 1;
291
+ json_data['_'+ arr[2]]['_'+ arr[1]]["WinOrLose"] = -1;
297
292
  }
298
293
  else if(el.target.innerHTML == '○'){ // 勝敗を取消
299
294
  el.target.innerHTML = ''; // 空白
300
295
  document.getElementById(oppid).innerHTML = ''; // 空白
296
+ json_data['_'+ arr[1]]['_'+ arr[2]]["WinOrLose"] = 0;
297
+ json_data['_'+ arr[2]]['_'+ arr[1]]["WinOrLose"] = 0;
301
298
  }
302
299
  // 勝ち数と負け数の計算
303
300
  var trs = document.getElementById("winorlose_table").getElementsByTagName('tr');
@@ -325,8 +322,12 @@
325
322
  tds[itd].innerHTML = lose;
326
323
  }
327
324
  }
328
- // json_dataの更新?
329
325
  }
326
+ let resultId = el.target.getAttribute("data-id");
327
+ let XHR = new XMLHttpRequest();
328
+ XHR.open("GET", `/results/${resultId}`, false);
329
+ XHR.responseType = "json";
330
+ XHR.send();
330
331
  }
331
332
 
332
333
  window.addEventListener("load", init);

8

コードの変更

2020/10/12 12:55

投稿

Zengo_Master
Zengo_Master

スコア19

title CHANGED
File without changes
body CHANGED
@@ -29,9 +29,8 @@
29
29
 
30
30
  ```ruby
31
31
  Rails.application.routes.draw do
32
- get 'json_p/parse'
33
32
  root to: 'results#index'
34
- post 'json_p/parse'
33
+ get 'results/:id', to: 'results#win_or_lose'
35
34
  end
36
35
  ```
37
36
 
@@ -42,30 +41,21 @@
42
41
  @members = Member.all
43
42
  end
44
43
 
44
+ def win_or_lose
45
+ result = Result.find(params[:id])
46
+ if result.result == "◯"
47
+ result.update(result: "")
48
+ else result.result == ""
49
+ result.update(result: "◯")
45
- end
50
+ end
51
+ item = Result.find(params[:id])
52
+ render json: { result: item }
46
- ```
53
+ end
47
54
 
48
- ```ruby
49
- class JsonPController < ApplicationController
50
- def parse
51
- json_str = request.body.read # リクエストのJSON
52
- json_hash = JSON.parse(json_data,symbolize_names: true) # Hashに変換
53
-
54
- # 見やすいように整形
55
- response_str =
56
- "JSON: " + json_str + "n" +
57
- "Hash: " + json_hash.to_s + "n"
58
-
59
- render plain: response_str
60
- end
61
55
  end
62
56
  ```
63
57
 
64
58
  ```html
65
- <div class="header">
66
- <h1 class="title">第7回しゅが研<span>毎週金曜日20時〜</span></h1>
67
- </div>
68
-
69
59
  <div class="main">
70
60
  <div class="league-table">
71
61
  <h2 class="league-table-title">【リーグ表】</h2>
@@ -87,16 +77,16 @@
87
77
  <tr class="result-cells">
88
78
  <td id="rank_<%= i + 1 %>"></td>
89
79
  <td class="self-name"><%= member.name %></td>
90
- <td id="op_<%= i + 1 %>_1"></td>
80
+ <td id="op_<%= i + 1 %>_1" data-id=<%= (i * 10) + 1 %>><%= Result.find((i * 10) + 1).result %></td>
91
- <td id="op_<%= i + 1 %>_2"></td>
81
+ <td id="op_<%= i + 1 %>_2" data-id=<%= (i * 10) + 2 %>><%= Result.find((i * 10) + 2).result %></td>
92
- <td id="op_<%= i + 1 %>_3"></td>
82
+ <td id="op_<%= i + 1 %>_3" data-id=<%= (i * 10) + 3 %>><%= Result.find((i * 10) + 3).result %></td>
93
- <td id="op_<%= i + 1 %>_4"></td>
83
+ <td id="op_<%= i + 1 %>_4" data-id=<%= (i * 10) + 4 %>><%= Result.find((i * 10) + 4).result %></td>
94
- <td id="op_<%= i + 1 %>_5"></td>
84
+ <td id="op_<%= i + 1 %>_5" data-id=<%= (i * 10) + 5 %>><%= Result.find((i * 10) + 5).result %></td>
95
- <td id="op_<%= i + 1 %>_6"></td>
85
+ <td id="op_<%= i + 1 %>_6" data-id=<%= (i * 10) + 6 %>><%= Result.find((i * 10) + 6).result %></td>
96
- <td id="op_<%= i + 1 %>_7"></td>
86
+ <td id="op_<%= i + 1 %>_7" data-id=<%= (i * 10) + 7 %>><%= Result.find((i * 10) + 7).result %></td>
97
- <td id="op_<%= i + 1 %>_8"></td>
87
+ <td id="op_<%= i + 1 %>_8" data-id=<%= (i * 10) + 8 %>><%= Result.find((i * 10) + 8).result %></td>
98
- <td id="op_<%= i + 1 %>_9"></td>
88
+ <td id="op_<%= i + 1 %>_9" data-id=<%= (i * 10) + 9 %>><%= Result.find((i * 10) + 9).result %></td>
99
- <td id="op_<%= i + 1 %>_10"></td>
89
+ <td id="op_<%= i + 1 %>_10" data-id=<%= (i * 10) + 10 %>><%= Result.find((i * 10) + 10).result %></td>
100
90
  <td id="win_<%= i + 1 %>">0</td>
101
91
  <td id="lose_<%= i + 1 %>">0</td>
102
92
  <td id="sb_<%= i + 1 %>">0</td>
@@ -105,34 +95,7 @@
105
95
 
106
96
  </table>
107
97
  </div>
108
-
109
- <div class="member-list">
110
- <h2 class="member-list-title">【対局者紹介】</h2>
111
- <table border="2" bordercolor="black" style="border-collapse: collapse" class="member-table">
112
-
113
- <tr class="member-info">
114
- <th class="member-title">対局者</th>
115
- <th class="account-title">アカウント</th>
116
- <th class="achievement-title">実績</th>
117
- </tr>
118
-
119
- <% @members.each do |member| %>
120
- <tr class="member-introduction">
121
- <td class="member"><%= member.name %></td>
122
- <td class="account"><%= member.account %></td>
123
- <td class="achievement"><%= member.achievement %></td>
124
- </tr>
125
- <% end %>
126
-
127
- </table>
128
- </div>
129
- </div>
130
98
  </div>
131
-
132
- <div class="footer">
133
- <div>
134
- </div>
135
- </div>
136
99
  ```
137
100
 
138
101
  ```css
@@ -245,10 +208,6 @@
245
208
  .member-introduction td {
246
209
  height: 30px;
247
210
  }
248
-
249
- .footer {
250
-
251
- }
252
211
  ```
253
212
 
254
213
  ```js
@@ -323,7 +282,12 @@
323
282
 
324
283
  // クリックしたときの処理
325
284
  function winorlose_click(el){
285
+ const resultId = el.target.getAttribute("data-id");
286
+ const XHR = new XMLHttpRequest();
287
+ XHR.open("GET", `/results/${resultId}`, true);
288
+ XHR.responseType = "json";
289
+ XHR.send();
326
- // el にはどこでクリックされたかの情報が入っている
290
+ // el にはどこでクリックされたかの情報が入っている
327
291
  var arr = el.target.id.split('_'); // idを'_'で分ける .targetで親要素イベントも発火
328
292
  var oppid = arr[0] + '_' + arr[2] + '_'+ arr[1]; // 反対側のid
329
293
  // 勝敗の記入と取消

7

JSON.parseでパラメーターをHashに変換

2020/10/12 05:58

投稿

Zengo_Master
Zengo_Master

スコア19

title CHANGED
File without changes
body CHANGED
@@ -28,24 +28,36 @@
28
28
  # 現在のコード
29
29
 
30
30
  ```ruby
31
+ Rails.application.routes.draw do
32
+ get 'json_p/parse'
33
+ root to: 'results#index'
34
+ post 'json_p/parse'
35
+ end
36
+ ```
37
+
38
+ ```ruby
31
39
  class ResultsController < ApplicationController
32
40
 
33
41
  def index
34
42
  @members = Member.all
35
43
  end
36
44
 
37
- # def win_or_lose
38
- # result = Result.find(params[:id])
39
- # binding.pry
40
- # if result.op_2 == nil
41
- # result.update(op_2: "○")
42
- # else result.op_2 == "○"
43
- # result.update(op_2: nil)
44
- # end
45
- # item = Result.find(params[:id])
46
- # render json: { result: item }
47
- # end
45
+ end
46
+ ```
48
47
 
48
+ ```ruby
49
+ class JsonPController < ApplicationController
50
+ def parse
51
+ json_str = request.body.read # リクエストのJSON
52
+ json_hash = JSON.parse(json_data,symbolize_names: true) # Hashに変換
53
+
54
+ # 見やすいように整形
55
+ response_str =
56
+ "JSON: " + json_str + "n" +
57
+ "Hash: " + json_hash.to_s + "n"
58
+
59
+ render plain: response_str
60
+ end
49
61
  end
50
62
  ```
51
63
 

6

ビューの微修正

2020/10/01 14:44

投稿

Zengo_Master
Zengo_Master

スコア19

title CHANGED
File without changes
body CHANGED
@@ -73,8 +73,8 @@
73
73
 
74
74
  <% @members.each_with_index do |member, i| %>
75
75
  <tr class="result-cells">
76
+ <td id="rank_<%= i + 1 %>"></td>
76
77
  <td class="self-name"><%= member.name %></td>
77
- <td id="rank_<%= i + 1 %>"></td>
78
78
  <td id="op_<%= i + 1 %>_1"></td>
79
79
  <td id="op_<%= i + 1 %>_2"></td>
80
80
  <td id="op_<%= i + 1 %>_3"></td>

5

データベース設計の修正と、それに伴う他ファイルの修正

2020/10/01 04:34

投稿

Zengo_Master
Zengo_Master

スコア19

title CHANGED
File without changes
body CHANGED
@@ -11,30 +11,36 @@
11
11
  結果の記入は出来るのですが、ページをリロードすると○と●が全て消えてしまいます。そこで、データベースの中で更新(例:空白→○)するように実装したいです。
12
12
 
13
13
  # データベース設計
14
- ![イメジ説明](696a9027dada54db5e1be8fdb1288609.png)
14
+ membersテブル(10人)
15
+ ・メンバーID
16
+ ・メンバー名
17
+ ・アカウント
18
+ ・実績
19
+ ・勝ち数
20
+ ・負け数
21
+ ・SB
15
22
 
23
+ resultsテーブル(1人に対して9人(10人))
24
+ ・メンバーID
25
+ ・対戦相手ID
26
+ ・勝敗
27
+
16
28
  # 現在のコード
17
29
 
18
30
  ```ruby
19
- Rails.application.routes.draw do
20
- root to: 'results#index'
21
- get 'results/:id', to: 'results#win_or_lose'
22
- end
23
- ```
24
-
25
- ```ruby
26
31
  class ResultsController < ApplicationController
27
32
 
28
33
  def index
29
- @results = Result.all
34
+ @members = Member.all
30
35
  end
31
36
 
32
37
  # def win_or_lose
33
38
  # result = Result.find(params[:id])
39
+ # binding.pry
34
- # if result.クリックしたtdのop == ""
40
+ # if result.op_2 == nil
35
- # result.update(クリックしたtdのop: "○")
41
+ # result.update(op_2: "○")
36
- # else result.クリックしたtdのop == "○"
42
+ # else result.op_2 == "○"
37
- # result.update(クリックしたtdのop: "")
43
+ # result.update(op_2: nil)
38
44
  # end
39
45
  # item = Result.find(params[:id])
40
46
  # render json: { result: item }
@@ -45,19 +51,19 @@
45
51
 
46
52
  ```html
47
53
  <div class="header">
48
- <h1 class="title">第7回しゅが研</h1>
54
+ <h1 class="title">第7回しゅが研<span>毎週金曜日20時〜</span></h1>
49
55
  </div>
50
56
 
51
57
  <div class="main">
52
58
  <div class="league-table">
53
- <h2 class="league-table-title">リーグ表</h2>
59
+ <h2 class="league-table-title">リーグ表</h2>
54
60
  <table id="winorlose_table" border="2" bordercolor="black" style="border-collapse: collapse">
55
61
  <tr class="top-title">
56
62
  <th class="rank-title">順位</th>
57
63
  <th class="player-title">対局者</th>
58
64
 
59
- <% @results.each do |result| %>
65
+ <% @members.each do |member| %>
60
- <td class="opponent-name"><%= result.player %></td>
66
+ <td class="opponent-name"><%= member.name %></td>
61
67
  <% end %>
62
68
 
63
69
  <th class="win-count-title">勝</th>
@@ -65,15 +71,20 @@
65
71
  <th class="sb-count-title">SB</th>
66
72
  </tr>
67
73
 
68
- <% @results.each_with_index do |result, i| %>
74
+ <% @members.each_with_index do |member, i| %>
69
75
  <tr class="result-cells">
70
- <td class="rank"></td>
71
- <td class="self-name"><%= result.player %></td>
76
+ <td class="self-name"><%= member.name %></td>
77
+ <td id="rank_<%= i + 1 %>"></td>
72
- <td id="op_<%= i + 1 %>_1" data-id=<%= result.id %> data-result=<%= result.op_1 %>><%= result.op_1 %></td>
78
+ <td id="op_<%= i + 1 %>_1"></td>
73
-
74
- <%# 途中略 2~9を記述%>
79
+ <td id="op_<%= i + 1 %>_2"></td>
75
-
80
+ <td id="op_<%= i + 1 %>_3"></td>
81
+ <td id="op_<%= i + 1 %>_4"></td>
82
+ <td id="op_<%= i + 1 %>_5"></td>
83
+ <td id="op_<%= i + 1 %>_6"></td>
84
+ <td id="op_<%= i + 1 %>_7"></td>
85
+ <td id="op_<%= i + 1 %>_8"></td>
86
+ <td id="op_<%= i + 1 %>_9"></td>
76
- <td id="op_<%= i + 1 %>_10" data-id=<%= result.id %> data-result=<%= result.op_10 %>><%= result.op_10 %></td>
87
+ <td id="op_<%= i + 1 %>_10"></td>
77
88
  <td id="win_<%= i + 1 %>">0</td>
78
89
  <td id="lose_<%= i + 1 %>">0</td>
79
90
  <td id="sb_<%= i + 1 %>">0</td>
@@ -84,7 +95,7 @@
84
95
  </div>
85
96
 
86
97
  <div class="member-list">
87
- <h2 class="member-list-title">対局者紹介</h2>
98
+ <h2 class="member-list-title">対局者紹介</h2>
88
99
  <table border="2" bordercolor="black" style="border-collapse: collapse" class="member-table">
89
100
 
90
101
  <tr class="member-info">
@@ -93,11 +104,11 @@
93
104
  <th class="achievement-title">実績</th>
94
105
  </tr>
95
106
 
96
- <% @results.each do |result| %>
107
+ <% @members.each do |member| %>
97
108
  <tr class="member-introduction">
98
- <td class="member"><%= result.player %></td>
109
+ <td class="member"><%= member.name %></td>
99
- <td class="account"><%= result.account %></td>
110
+ <td class="account"><%= member.account %></td>
100
- <td class="achievement"><%= result.achievement %></td>
111
+ <td class="achievement"><%= member.achievement %></td>
101
112
  </tr>
102
113
  <% end %>
103
114
 
@@ -105,15 +116,27 @@
105
116
  </div>
106
117
  </div>
107
118
  </div>
119
+
120
+ <div class="footer">
121
+ <div>
122
+ </div>
123
+ </div>
108
124
  ```
109
125
 
110
126
  ```css
111
127
  .header {
112
128
  margin: 20px;
129
+ padding-bottom: 5px;
130
+ border-bottom: 2px solid lightgray;
113
131
  }
114
132
 
133
+ .header span {
134
+ padding-left: 20px;
135
+ font-size: 25px;
136
+ }
137
+
115
138
  .main {
116
- margin: 20px;
139
+ margin: 30px;
117
140
  }
118
141
 
119
142
  .league-table {
@@ -210,6 +233,10 @@
210
233
  .member-introduction td {
211
234
  height: 30px;
212
235
  }
236
+
237
+ .footer {
238
+
239
+ }
213
240
  ```
214
241
 
215
242
  ```js
@@ -228,7 +255,7 @@
228
255
  "_10":{"member":"Jさん","WinOrLose":0}
229
256
  },
230
257
 
231
- // 途中略
258
+ // 途中略
232
259
 
233
260
  "_10":{
234
261
  "member":"Jさん",
@@ -253,7 +280,7 @@
253
280
  // テーブルの行毎に処理
254
281
  var tds = trs[itr].getElementsByTagName('td');
255
282
  for(var itd = 0; itd < tds.length; itd++){
256
- if(tds[itd].id.indexOf('op_') != -1){
283
+ if(tds[itd].id.indexOf('op_') != -1){ // idにop_を含む(勝敗記入のtd)
257
284
  // 勝ち負け入力<td>タグの場合
258
285
  var arr = tds[itd].id.split('_'); // op_数字_数字 → [op, 数字, 数字]
259
286
  if(arr[1] == arr[2]){
@@ -272,6 +299,12 @@
272
299
  }
273
300
  }
274
301
  }
302
+ // else if(tds[itd].id.indexOf('win_') != -1){ // idにwin_を含む(勝ち数のtd)
303
+ // tds[itd].innerHTML = json_data['_'+ arr[1]]['_'+ arr[2]]["WinCount"];
304
+ // }
305
+ // else { // 残るは負け数
306
+ // tds[itd].innerHTML = json_data['_'+ arr[1]]['_'+ arr[2]]["LoseCount"];
307
+ // }
275
308
  }
276
309
  }
277
310
  }
@@ -279,31 +312,16 @@
279
312
  // クリックしたときの処理
280
313
  function winorlose_click(el){
281
314
  // el にはどこでクリックされたかの情報が入っている
282
- const resultId = el.target.getAttribute("data-id");
283
- const XHR = new XMLHttpRequest();
284
- XHR.open("GET", `/results/${resultId}`, true);
285
- XHR.responseType = "json";
286
- XHR.send();
287
- XHR.onload = () => {
288
- const item = XHR.response.el.target;
289
- if (item === "") {
290
- el.setAttribute("data-result", "○");
291
- }
292
- else if (item === "○") {
293
- el.setAttribute("data-result", "");
294
- }
295
- };
296
- // el にはどこでクリックされたかの情報が入っている
297
315
  var arr = el.target.id.split('_'); // idを'_'で分ける .targetで親要素イベントも発火
298
316
  var oppid = arr[0] + '_' + arr[2] + '_'+ arr[1]; // 反対側のid
299
317
  // 勝敗の記入と取消
300
- if(el.target.innerHTML == ''){ // 勝敗を記入
318
+ if(el.target.innerHTML == ''){ // 勝敗を記入
301
- el.target.innerHTML = '○'; // 勝ち
319
+ el.target.innerHTML = '○'; // 勝ち
302
- document.getElementById(oppid).innerHTML = '●'; // 負け
320
+ document.getElementById(oppid).innerHTML = '●'; // 負け
303
321
  }
304
- else if(el.target.innerHTML == '○'){ // 勝敗を取消
322
+ else if(el.target.innerHTML == '○'){ // 勝敗を取消
305
- el.target.innerHTML = ''; // 空白
323
+ el.target.innerHTML = ''; // 空白
306
- document.getElementById(oppid).innerHTML = ''; // 空白
324
+ document.getElementById(oppid).innerHTML = ''; // 空白
307
325
  }
308
326
  // 勝ち数と負け数の計算
309
327
  var trs = document.getElementById("winorlose_table").getElementsByTagName('tr');
@@ -331,6 +349,7 @@
331
349
  tds[itd].innerHTML = lose;
332
350
  }
333
351
  }
352
+ // json_dataの更新?
334
353
  }
335
354
  }
336
355
 

4

routes.rbの追加

2020/10/01 04:19

投稿

Zengo_Master
Zengo_Master

スコア19

title CHANGED
File without changes
body CHANGED
@@ -14,7 +14,15 @@
14
14
  ![イメージ説明](696a9027dada54db5e1be8fdb1288609.png)
15
15
 
16
16
  # 現在のコード
17
+
17
18
  ```ruby
19
+ Rails.application.routes.draw do
20
+ root to: 'results#index'
21
+ get 'results/:id', to: 'results#win_or_lose'
22
+ end
23
+ ```
24
+
25
+ ```ruby
18
26
  class ResultsController < ApplicationController
19
27
 
20
28
  def index

3

コードの更新

2020/09/30 07:43

投稿

Zengo_Master
Zengo_Master

スコア19

title CHANGED
File without changes
body CHANGED
@@ -14,6 +14,27 @@
14
14
  ![イメージ説明](696a9027dada54db5e1be8fdb1288609.png)
15
15
 
16
16
  # 現在のコード
17
+ ```ruby
18
+ class ResultsController < ApplicationController
19
+
20
+ def index
21
+ @results = Result.all
22
+ end
23
+
24
+ # def win_or_lose
25
+ # result = Result.find(params[:id])
26
+ # if result.クリックしたtdのop == ""
27
+ # result.update(クリックしたtdのop: "○")
28
+ # else result.クリックしたtdのop == "○"
29
+ # result.update(クリックしたtdのop: "")
30
+ # end
31
+ # item = Result.find(params[:id])
32
+ # render json: { result: item }
33
+ # end
34
+
35
+ end
36
+ ```
37
+
17
38
  ```html
18
39
  <div class="header">
19
40
  <h1 class="title">第7回しゅが研</h1>
@@ -40,16 +61,11 @@
40
61
  <tr class="result-cells">
41
62
  <td class="rank"></td>
42
63
  <td class="self-name"><%= result.player %></td>
43
- <td id="op_<%= i + 1 %>_1"><%= result.op_1 %></td>
64
+ <td id="op_<%= i + 1 %>_1" data-id=<%= result.id %> data-result=<%= result.op_1 %>><%= result.op_1 %></td>
65
+
44
- <td id="op_<%= i + 1 %>_2"><%= result.op_2 %></td>
66
+ <%# 途中略 2~9を記述%>
45
- <td id="op_<%= i + 1 %>_3"><%= result.op_3 %></td>
67
+
46
- <td id="op_<%= i + 1 %>_4"><%= result.op_4 %></td>
47
- <td id="op_<%= i + 1 %>_5"><%= result.op_5 %></td>
48
- <td id="op_<%= i + 1 %>_6"><%= result.op_6 %></td>
49
- <td id="op_<%= i + 1 %>_7"><%= result.op_7 %></td>
50
- <td id="op_<%= i + 1 %>_8"><%= result.op_8 %></td>
51
- <td id="op_<%= i + 1 %>_9"><%= result.op_9 %></td>
52
- <td id="op_<%= i + 1 %>_10"><%= result.op_10 %></td>
68
+ <td id="op_<%= i + 1 %>_10" data-id=<%= result.id %> data-result=<%= result.op_10 %>><%= result.op_10 %></td>
53
69
  <td id="win_<%= i + 1 %>">0</td>
54
70
  <td id="lose_<%= i + 1 %>">0</td>
55
71
  <td id="sb_<%= i + 1 %>">0</td>
@@ -240,7 +256,6 @@
240
256
  // 対戦が違う場合、イベントを登録
241
257
  // onclick="winorlose_click(this);" と同じ内容
242
258
  tds[itd].addEventListener('click', {name: this, handleEvent: winorlose_click});
243
-
244
259
  if(json_data['_'+ arr[1]]['_'+ arr[2]]["WinOrLose"] == 1){
245
260
  tds[itd].innerHTML = "○";
246
261
  }
@@ -256,6 +271,21 @@
256
271
  // クリックしたときの処理
257
272
  function winorlose_click(el){
258
273
  // el にはどこでクリックされたかの情報が入っている
274
+ const resultId = el.target.getAttribute("data-id");
275
+ const XHR = new XMLHttpRequest();
276
+ XHR.open("GET", `/results/${resultId}`, true);
277
+ XHR.responseType = "json";
278
+ XHR.send();
279
+ XHR.onload = () => {
280
+ const item = XHR.response.el.target;
281
+ if (item === "") {
282
+ el.setAttribute("data-result", "○");
283
+ }
284
+ else if (item === "○") {
285
+ el.setAttribute("data-result", "");
286
+ }
287
+ };
288
+ // el にはどこでクリックされたかの情報が入っている
259
289
  var arr = el.target.id.split('_'); // idを'_'で分ける .targetで親要素イベントも発火
260
290
  var oppid = arr[0] + '_' + arr[2] + '_'+ arr[1]; // 反対側のid
261
291
  // 勝敗の記入と取消

2

コードの更新を反映させました。

2020/09/30 07:17

投稿

Zengo_Master
Zengo_Master

スコア19

title CHANGED
File without changes
body CHANGED
@@ -27,7 +27,6 @@
27
27
  <th class="rank-title">順位</th>
28
28
  <th class="player-title">対局者</th>
29
29
 
30
- <%# 対戦相手の名前を動的に生成 %>
31
30
  <% @results.each do |result| %>
32
31
  <td class="opponent-name"><%= result.player %></td>
33
32
  <% end %>
@@ -37,7 +36,6 @@
37
36
  <th class="sb-count-title">SB</th>
38
37
  </tr>
39
38
 
40
- <%# 対局者の行を動的に生成 %>
41
39
  <% @results.each_with_index do |result, i| %>
42
40
  <tr class="result-cells">
43
41
  <td class="rank"></td>
@@ -106,29 +104,10 @@
106
104
  text-align: center;
107
105
  }
108
106
 
109
- // 指定したtdに斜線を引く
110
- #op_1_1,
111
- #op_2_2,
112
- #op_3_3,
113
- #op_4_4,
114
- #op_5_5,
115
- #op_6_6,
116
- #op_7_7,
117
- #op_8_8,
118
- #op_9_9,
119
- #op_10_10 {
107
+ .right_down_border {
120
108
  background-image: linear-gradient(to top right, transparent, transparent 48%, black 49%, black 51%, transparent 52%, transparent);
121
109
  }
122
110
 
123
- // .right_down_border {
124
- // background-image: linear-gradient(45deg, /*角度*/
125
- // transparent 49%,
126
- // black 49%, /*斜線の色*/
127
- // black 51%, /*斜線の色*/
128
- // transparent 51%,
129
- // transparent);
130
- // }
131
-
132
111
  .top-title {
133
112
  height: 30px;
134
113
  }
@@ -163,14 +142,6 @@
163
142
  background-color: #F3FFD8;
164
143
  }
165
144
 
166
- .win-count {
167
-
168
- }
169
-
170
- .lose-count {
171
-
172
- }
173
-
174
145
  .result-cells {
175
146
  height:40px ;
176
147
  }
@@ -218,6 +189,38 @@
218
189
  ```
219
190
 
220
191
  ```js
192
+ // ※リーグ表の中身の定義
193
+ var json_data = {"_1":{
194
+ "member":"Aさん",
195
+ "_1":{"member":"Aさん","WinOrLose":9},
196
+ "_2":{"member":"Bさん","WinOrLose":0},
197
+ "_3":{"member":"Cさん","WinOrLose":0},
198
+ "_4":{"member":"Dさん","WinOrLose":0},
199
+ "_5":{"member":"Eさん","WinOrLose":0},
200
+ "_6":{"member":"Fさん","WinOrLose":0},
201
+ "_7":{"member":"Gさん","WinOrLose":0},
202
+ "_8":{"member":"Hさん","WinOrLose":0},
203
+ "_9":{"member":"Iさん","WinOrLose":0},
204
+ "_10":{"member":"Jさん","WinOrLose":0}
205
+ },
206
+
207
+ // 途中略
208
+
209
+ "_10":{
210
+ "member":"Jさん",
211
+ "_1":{"member":"Aさん","WinOrLose":0},
212
+ "_2":{"member":"Bさん","WinOrLose":0},
213
+ "_3":{"member":"Cさん","WinOrLose":0},
214
+ "_4":{"member":"Dさん","WinOrLose":0},
215
+ "_5":{"member":"Eさん","WinOrLose":0},
216
+ "_6":{"member":"Fさん","WinOrLose":0},
217
+ "_7":{"member":"Gさん","WinOrLose":0},
218
+ "_8":{"member":"Hさん","WinOrLose":0},
219
+ "_9":{"member":"Iさん","WinOrLose":0},
220
+ "_10":{"member":"Jさん","WinOrLose":9}
221
+ }
222
+ };
223
+
221
224
  // 初期処理
222
225
  function init(){
223
226
  var trs = document.getElementById("winorlose_table").getElementsByTagName('tr');
@@ -232,42 +235,12 @@
232
235
  if(arr[1] == arr[2]){
233
236
  // 対戦が同じ場合
234
237
  tds[itd].classList.add('right_down_border'); // 縦横同値マスにクラスを指定
235
- }
238
+ }
236
239
  else {
237
240
  // 対戦が違う場合、イベントを登録
238
241
  // onclick="winorlose_click(this);" と同じ内容
239
242
  tds[itd].addEventListener('click', {name: this, handleEvent: winorlose_click});
240
243
 
241
- // ※リーグ表の中身の定義
242
- var json_data = {"_1":{
243
- "member":"Aさん",
244
- "_1":{"member":"Aさん","WinOrLose":9},
245
- "_2":{"member":"Bさん","WinOrLose":0},
246
- "_3":{"member":"Cさん","WinOrLose":0},
247
- "_4":{"member":"Dさん","WinOrLose":0},
248
- "_5":{"member":"Eさん","WinOrLose":0},
249
- "_6":{"member":"Fさん","WinOrLose":0},
250
- "_7":{"member":"Gさん","WinOrLose":0},
251
- "_8":{"member":"Hさん","WinOrLose":0},
252
- "_9":{"member":"Iさん","WinOrLose":0},
253
- "_10":{"member":"Jさん","WinOrLose":0}
254
- },
255
- // 途中略
256
- "_10":{
257
- "member":"Jさん",
258
- "_1":{"member":"Aさん","WinOrLose":0},
259
- "_2":{"member":"Bさん","WinOrLose":0},
260
- "_3":{"member":"Cさん","WinOrLose":0},
261
- "_4":{"member":"Dさん","WinOrLose":0},
262
- "_5":{"member":"Eさん","WinOrLose":0},
263
- "_6":{"member":"Fさん","WinOrLose":0},
264
- "_7":{"member":"Gさん","WinOrLose":0},
265
- "_8":{"member":"Hさん","WinOrLose":0},
266
- "_9":{"member":"Iさん","WinOrLose":0},
267
- "_10":{"member":"Jさん","WinOrLose":9}
268
- }
269
- };
270
-
271
244
  if(json_data['_'+ arr[1]]['_'+ arr[2]]["WinOrLose"] == 1){
272
245
  tds[itd].innerHTML = "○";
273
246
  }
@@ -286,14 +259,15 @@
286
259
  var arr = el.target.id.split('_'); // idを'_'で分ける .targetで親要素イベントも発火
287
260
  var oppid = arr[0] + '_' + arr[2] + '_'+ arr[1]; // 反対側のid
288
261
  // 勝敗の記入と取消
289
- if(el.target.innerHTML = ''){ // 勝敗を記入
262
+ if(el.target.innerHTML == ''){ // 勝敗を記入
290
263
  el.target.innerHTML = '○'; // 勝ち
291
264
  document.getElementById(oppid).innerHTML = '●'; // 負け
292
265
  }
293
- else if(el.target.innerHTML = '○'){ // 勝敗を取消
266
+ else if(el.target.innerHTML == '○'){ // 勝敗を取消
294
267
  el.target.innerHTML = ''; // 空白
295
268
  document.getElementById(oppid).innerHTML = ''; // 空白
296
269
  }
270
+ // 勝ち数と負け数の計算
297
271
  var trs = document.getElementById("winorlose_table").getElementsByTagName('tr');
298
272
  var win = 0;
299
273
  var lose = 0;
@@ -321,6 +295,8 @@
321
295
  }
322
296
  }
323
297
  }
298
+
299
+ window.addEventListener("load", init);
324
300
  ```
325
301
 
326
302
  # 調べた内容

1

コードの加筆・修正

2020/09/30 03:39

投稿

Zengo_Master
Zengo_Master

スコア19

title CHANGED
File without changes
body CHANGED
@@ -120,6 +120,15 @@
120
120
  background-image: linear-gradient(to top right, transparent, transparent 48%, black 49%, black 51%, transparent 52%, transparent);
121
121
  }
122
122
 
123
+ // .right_down_border {
124
+ // background-image: linear-gradient(45deg, /*角度*/
125
+ // transparent 49%,
126
+ // black 49%, /*斜線の色*/
127
+ // black 51%, /*斜線の色*/
128
+ // transparent 51%,
129
+ // transparent);
130
+ // }
131
+
123
132
  .top-title {
124
133
  height: 30px;
125
134
  }
@@ -209,57 +218,109 @@
209
218
  ```
210
219
 
211
220
  ```js
221
+ // 初期処理
222
+ function init(){
223
+ var trs = document.getElementById("winorlose_table").getElementsByTagName('tr');
224
+ // 1行目はヘッダーだから飛ばして
225
+ for(var itr = 1; itr < trs.length; itr++){
226
+ // テーブルの行毎に処理
227
+ var tds = trs[itr].getElementsByTagName('td');
228
+ for(var itd = 0; itd < tds.length; itd++){
212
- window.addEventListener('load', function(){
229
+ if(tds[itd].id.indexOf('op_') != -1){
213
- const op_1_2 = document.getElementById("op_1_2")
230
+ // 勝ち負け入力<td>タグの場合
214
- const op_1_3 = document.getElementById("op_1_3")
215
- const op_1_4 = document.getElementById("op_1_4")
216
- const op_1_5 = document.getElementById("op_1_5")
217
- const op_1_6 = document.getElementById("op_1_6")
218
- const op_1_7 = document.getElementById("op_1_7")
219
- const op_1_8 = document.getElementById("op_1_8")
220
- const op_1_9 = document.getElementById("op_1_9")
221
- const op_1_10 = document.getElementById("op_1_10")
231
+ var arr = tds[itd].id.split('_'); // op_数字_数字 → [op, 数字, 数字]
232
+ if(arr[1] == arr[2]){
233
+ // 対戦が同じ場合
234
+ tds[itd].classList.add('right_down_border'); // 縦横同値マスにクラスを指定
235
+ }
236
+ else {
237
+ // 対戦が違う場合、イベントを登録
222
- const win_1 = document.getElementById("win_1")
238
+ // onclick="winorlose_click(this);" と同じ内容
223
- const lose_1 = document.getElementById("lose_1")
239
+ tds[itd].addEventListener('click', {name: this, handleEvent: winorlose_click});
224
240
 
241
+ // ※リーグ表の中身の定義
242
+ var json_data = {"_1":{
243
+ "member":"Aさん",
244
+ "_1":{"member":"Aさん","WinOrLose":9},
245
+ "_2":{"member":"Bさん","WinOrLose":0},
246
+ "_3":{"member":"Cさん","WinOrLose":0},
247
+ "_4":{"member":"Dさん","WinOrLose":0},
248
+ "_5":{"member":"Eさん","WinOrLose":0},
249
+ "_6":{"member":"Fさん","WinOrLose":0},
250
+ "_7":{"member":"Gさん","WinOrLose":0},
251
+ "_8":{"member":"Hさん","WinOrLose":0},
252
+ "_9":{"member":"Iさん","WinOrLose":0},
253
+ "_10":{"member":"Jさん","WinOrLose":0}
254
+ },
225
255
  // 途中略
256
+ "_10":{
257
+ "member":"Jさん",
258
+ "_1":{"member":"Aさん","WinOrLose":0},
259
+ "_2":{"member":"Bさん","WinOrLose":0},
260
+ "_3":{"member":"Cさん","WinOrLose":0},
261
+ "_4":{"member":"Dさん","WinOrLose":0},
262
+ "_5":{"member":"Eさん","WinOrLose":0},
263
+ "_6":{"member":"Fさん","WinOrLose":0},
264
+ "_7":{"member":"Gさん","WinOrLose":0},
265
+ "_8":{"member":"Hさん","WinOrLose":0},
266
+ "_9":{"member":"Iさん","WinOrLose":0},
267
+ "_10":{"member":"Jさん","WinOrLose":9}
268
+ }
269
+ };
226
270
 
227
- const op_10_1 = document.getElementById("op_10_1")
228
- const op_10_2 = document.getElementById("op_10_2")
229
- const op_10_3 = document.getElementById("op_10_3")
230
- const op_10_4 = document.getElementById("op_10_4")
231
- const op_10_5 = document.getElementById("op_10_5")
232
- const op_10_6 = document.getElementById("op_10_6")
233
- const op_10_7 = document.getElementById("op_10_7")
234
- const op_10_8 = document.getElementById("op_10_8")
235
- const op_10_9 = document.getElementById("op_10_9")
236
- const win_10 = document.getElementById("win_10")
271
+ if(json_data['_'+ arr[1]]['_'+ arr[2]]["WinOrLose"] == 1){
237
- const lose_10 = document.getElementById("lose_10")
238
-
239
- op_1_2.addEventListener('click', function(){
240
- if (op_1_2.innerHTML == ""){
241
- op_1_2.innerHTML = "○";
272
+ tds[itd].innerHTML = "○";
273
+ }
274
+ else if(json_data['_'+ arr[1]]['_'+ arr[2]]["WinOrLose"] == -1) {
242
- op_2_1.innerHTML = "●";
275
+ tds[itd].innerHTML = "●";
276
+ }
277
+ }
278
+ }
243
279
  }
244
- else if (op_1_2.innerHTML == "○"){
245
- op_1_2.innerHTML = "";
246
- op_2_1.innerHTML = "";
247
- }
280
+ }
248
- })
281
+ }
249
282
 
283
+ // クリックしたときの処理
284
+ function winorlose_click(el){
285
+ // el にはどこでクリックされたかの情報が入っている
286
+ var arr = el.target.id.split('_'); // idを'_'で分ける .targetで親要素イベントも発火
287
+ var oppid = arr[0] + '_' + arr[2] + '_'+ arr[1]; // 反対側のid
250
- // 途中略
288
+ // 勝敗の記入と取消
251
-
289
+ if(el.target.innerHTML = ''){ // 勝敗を記入
290
+ el.target.innerHTML = '○'; // 勝ち
252
- op_10_9.addEventListener('click', function(){
291
+ document.getElementById(oppid).innerHTML = ''; // 負け
253
- if (op_10_9.innerHTML == "") {
254
- op_10_9.innerHTML = "○";
255
- op_9_10.innerHTML = "●";
256
- }
292
+ }
257
- else if (op_10_9.innerHTML == ""){
293
+ else if(el.target.innerHTML = ''){ // 勝敗を取消
294
+ el.target.innerHTML = ''; // 空白
258
- op_10_9.innerHTML = "";
295
+ document.getElementById(oppid).innerHTML = ''; // 空白
259
- op_9_10.innerHTML = "";
260
- }
296
+ }
297
+ var trs = document.getElementById("winorlose_table").getElementsByTagName('tr');
298
+ var win = 0;
299
+ var lose = 0;
300
+ // 1行目はヘッダーだから飛ばして
301
+ for(var itr = 1; itr < trs.length; itr++){
302
+ // テーブルの行毎に処理
303
+ win = 0;
304
+ lose = 0;
305
+ var tds = trs[itr].getElementsByTagName('td');
306
+ for(var itd = 0; itd < tds.length; itd++){
307
+ if(tds[itd].id.indexOf('op_') != -1){
308
+ // 勝ち負け数カウント
309
+ if(tds[itd].innerHTML == '○'){
310
+ win ++;
311
+ }else if(tds[itd].innerHTML == '●'){
312
+ lose ++;
261
- })
313
+ }
314
+ } else if(tds[itd].id.indexOf('win_') != -1){
315
+ // 勝ち表示
316
+ tds[itd].innerHTML = win;
317
+ } else if(tds[itd].id.indexOf('lose_') != -1){
318
+ // 負け表示
319
+ tds[itd].innerHTML = lose;
262
- })
320
+ }
321
+ }
322
+ }
323
+ }
263
324
  ```
264
325
 
265
326
  # 調べた内容