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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

JavaScript

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

HTML

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

Q&A

解決済

1回答

971閲覧

リーグ戦の勝ち数を表示する

Zengo_Master

総合スコア19

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

JavaScript

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

HTML

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

0グッド

0クリップ

投稿2020/09/25 18:10

解決したいこと

htmlのテーブルでリーグ戦を作成しています。現在は結果を記入したところです。
イメージ説明説明](a1931ae4a638dedb2807537bbe9dc758.png)

**結果を記入した際に、その人の勝ち数を表示したいです。**上図の「勝」の下にあるセル(初期値は0)に、その列の○の数を表示する実装になります。

現在のコードは以下になります。

html

1<div class="header"> 2 <h1 class="title"> 3 第7回しゅが研 リーグ表 4 </h1> 5</div> 6 7<div class="main"> 8 <div class="league-table"> 9 <table border="2" bordercolor="black" style="border-collapse: collapse"> 10 <tr class="top-tr"> 11 <th class="rank-title">順位</th> 12 <th class="member-title">メンバー</th> 13 <td class="opponent-name"></td> 14 <td class="opponent-name"></td> 15 <td class="opponent-name"></td> 16 <td class="opponent-name"></td> 17 <td class="opponent-name"></td> 18 <td class="opponent-name"></td> 19 <td class="opponent-name"></td> 20 <td class="opponent-name"></td> 21 <td class="opponent-name"></td> 22 <td class="opponent-name"></td> 23 <th class="win-count-title"></th> 24 <th class="lose-count-title"></th> 25 <th class="sb-count-title">SB</th> 26 </tr> 27 <tr class="result-cells"> 28 <td class="rank"></td> 29 <td class="self-name"></td> 30 <td id="cell1-1"></td> 31 <td id="cell1-2"></td> 32 <td id="cell1-3"></td> 33 <td id="cell1-4"></td> 34 <td id="cell1-5"></td> 35 <td id="cell1-6"></td> 36 <td id="cell1-7"></td> 37 <td id="cell1-8"></td> 38 <td id="cell1-9"></td> 39 <td id="cell1-10"></td> 40 <td id="win-1">0</td> 41 <td id="lose-1">0</td> 42 <td id="sb-1">0</td> 43 </tr> 44 <tr class="result-cells"> 45 <td class="rank"></td> 46 <td class="self-name"></td> 47 <td id="cell2-1"></td> 48 <td id="cell2-2"></td> 49 <td id="cell2-3"></td> 50 <td id="cell2-4"></td> 51 <td id="cell2-5"></td> 52 <td id="cell2-6"></td> 53 <td id="cell2-7"></td> 54 <td id="cell2-8"></td> 55 <td id="cell2-9"></td> 56 <td id="cell2-10"></td> 57 <td id="win-2">0</td> 58 <td id="lose-2">0</td> 59 <td id="sb-2">0</td> 60 </tr> 61 62// 以下、列が続く 63 64 </div> 65</div>

js

1window.addEventListener('load', function(){ 2 3 const cell1_2 = document.getElementById("cell1-2") 4 const cell1_3 = document.getElementById("cell1-3") 5 const cell1_4 = document.getElementById("cell1-4") 6 const cell1_5 = document.getElementById("cell1-5") 7 const cell1_6 = document.getElementById("cell1-6") 8 const cell1_7 = document.getElementById("cell1-7") 9 const cell1_8 = document.getElementById("cell1-8") 10 const cell1_9 = document.getElementById("cell1-9") 11 const cell1_10 = document.getElementById("cell1-10") 12 const win_1 = document.getElementById("win-1") 13 const lose_1 = document.getElementById("lose-1") 14 15 const cell2_1 = document.getElementById("cell2-1") 16 const cell2_3 = document.getElementById("cell2-3") 17 const cell2_4 = document.getElementById("cell2-4") 18 const cell2_5 = document.getElementById("cell2-5") 19 const cell2_6 = document.getElementById("cell2-6") 20 const cell2_7 = document.getElementById("cell2-7") 21 const cell2_8 = document.getElementById("cell2-8") 22 const cell2_9 = document.getElementById("cell2-9") 23 const cell2_10 = document.getElementById("cell2-10") 24 const win_2 = document.getElementById("win-2") 25 const lose_2 = document.getElementById("lose-2") 26 27// 以下、同様に続く 28 29// セルをクリックすると結果記入ができる 30 31 cell1_2.addEventListener('click', function(){ 32 if (cell1_2.innerHTML == ""){ 33 cell1_2.innerHTML = "○"; 34 cell2_1.innerHTML = "●"; 35 } 36 else if (cell1_2.innerHTML == "○"){ 37 cell1_2.innerHTML = ""; 38 cell2_1.innerHTML = ""; 39 } 40 }) 41 cell1_3.addEventListener('click', function(){ 42 if (cell1_3.innerHTML == ""){ 43 cell1_3.innerHTML = "○"; 44 cell3_1.innerHTML = "●"; 45 } 46 else if (cell1_3.innerHTML == "○"){ 47 cell1_3.innerHTML = ""; 48 cell3_1.innerHTML = ""; 49 } 50 }) 51 52// 以下、同様に続く 53 54})

調べた内容

table内にある特定の文字列(出席)をカウントする方法
https://teratail.com/questions/39823

検証作業と結果

特定の列でなくても、テーブルの○を数えようと試しました。

js

1cell1_2.innerHTML = "○"; 2cell2_1.innerHTML = "●"; 3win_1.innerHTML = $( 'td:contains("○")' ).length;

しかし、反映されませんでした。特定のtrの特定の文字列を数える方法は他にありませんか?

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

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

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

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

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

kuma_kuma_

2020/09/25 20:47

> win_1.innerHTML = $( 'td:contains("○")' ).length; この書き方だとJQueryでの記載方法だけどJQueryを使用したいのですか? あとイベント登録等ループ等を使えば簡略化できますが...
Zengo_Master

2020/09/25 22:06

JQueryを使用したいわけではありません。 イベント登録等ループ等を使えば簡略化できるとは、繰り返し書く手間を省く意味ですか?
kuma_kuma_

2020/09/25 22:57

> JQueryを使用したいわけではありません。 それじゃこの書き方だとエラーになりますね。 > イベント登録等ループ等を使えば簡略化できるとは、繰り返し書く手間を省く意味ですか? そうです。 回答を書こうと思えば書けるんですが全部書き直しになりますが... (学習目的ならあまりよい答え方ではなくなる)
Zengo_Master

2020/09/26 02:10

ありがとうございます。 書き方が根本的にいけなかったかったんですね... 開発目的なので、回答をいただくことは可能でしょうか?
kuma_kuma_

2020/09/26 02:19

> 書き方が根本的にいけなかったかったんですね... 学習を始めたばかりなら知らなくて当然です。 ただ回答の書き方次第で質問者様にためにならない方向は避けたかったので この様な質問をさせていただきました。 プログラムに正解の書き方は存在しません。 ただ今回私が同じ内容で作るとしたらこんな書き方になりますよ という内容でお答えします。
guest

回答1

0

ベストアンサー

対戦表を作ってみました
判りやすく3x3です
またSBも省略しています。

各処理にはコメントをつけているので内容は判ると思います。
今回のポイントとしてはidの付け方です。
質問者様の"cell1-2"からあえて"cell_1_2"に変更したのはidを内容毎に分解しやすくする為です。
これにより反対側の負けの位置がすぐに把握できます。

※あくまでこれは参考例です。これが最適ではありません。
(判りやすい書き方にする為、調整を行っています。)

HTML

1<!DOCTYPE html> 2<html> 3<head> 4 <meta charset="UTF-8"> 5 <title></title> 6</head> 7<body onload="init();"> 8 <div class="header"> 9 <h1 class="title"> 10 第7回しゅが研 リーグ表 11 </h1> 12 </div> 13 14 <div class="main"> 15 <div class="league-table"> 16 <table id="winorlose_table" border="2" bordercolor="black" style="border-collapse: collapse"> 17 <tr class="top-tr"> 18 <th class="rank-title">順位</th> 19 <th class="member-title">メンバー</th> 20 <td class="opponent-name"></td> 21 <td class="opponent-name"></td> 22 <td class="opponent-name"></td> 23 <th class="win-count-title">勝</th> 24 <th class="lose-count-title">負</th> 25 </tr> 26 <tr class="result-cells"> 27 <td class="rank"></td> 28 <td class="self-name"></td> 29 <td id="cell_1_1"></td> 30 <td id="cell_1_2"></td> 31 <td id="cell_1_3"></td> 32 <td id="win_1">0</td> 33 <td id="lose_1">0</td> 34 </tr> 35 <tr class="result-cells"> 36 <td class="rank"></td> 37 <td class="self-name"></td> 38 <td id="cell_2_1"></td> 39 <td id="cell_2_2"></td> 40 <td id="cell_2_3"></td> 41 <td id="win_2">0</td> 42 <td id="lose_2">0</td> 43 </tr> 44 <tr class="result-cells"> 45 <td class="rank"></td> 46 <td class="self-name"></td> 47 <td id="cell_3_1"></td> 48 <td id="cell_3_2"></td> 49 <td id="cell_3_3"></td> 50 <td id="win_3">0</td> 51 <td id="lose_3">0</td> 52 </tr> 53 </table> 54 </div> 55 </div> 56</body> 57</html>

CSS

1 tr { 2 height: 40px; 3 } 4 td { 5 text-align: center; 6 } 7 .opponent-name { 8 width: 37px; 9 } 10 .win-count-title { 11 width: 40px; 12 } 13 .lose-count-title { 14 width: 40px; 15 } 16 .sb-count-title { 17 width: 40px; 18 } 19 /* 右上がりの斜線 */ 20 .right_up_border { 21 background-image: linear-gradient(45deg, /*角度*/ 22 transparent 49%, 23 black 49%, /*斜線の色*/ 24 black 51%, /*斜線の色*/ 25 transparent 51%, 26 transparent); 27 } 28

javascript

1 // 初期処理 2 function init(){ 3 var trs = document.getElementById("winorlose_table").getElementsByTagName('tr'); 4 // 1行目はヘッダーだから飛ばして 5 for(var itr = 1; itr < trs.length; itr++){ 6 // テーブルの行毎に処理 7 var tds = trs[itr].getElementsByTagName('td'); 8 for(var itd = 0; itd < tds.length; itd++){ 9 if(tds[itd].id.indexOf('cell_') != -1){ 10 // 勝ち負け入力<td>タグの場合 11 var arr = tds[itd].id.split('_'); 12 if(arr[1] == arr[2]){ 13 // 対戦が同じ場合 14 tds[itd].classList.add('right_up_border'); // 斜め線を指定 15 }else{ 16 // 対戦が違う場合、イベントを登録 17 // onclick="winorlose_click(this);" とおんなじ内容 18 tds[itd].addEventListener('click', {name: this, handleEvent: winorlose_click}); 19 } 20 } 21 } 22 } 23 } 24 // クリックしたときの処理 25 function winorlose_click(el){ 26 // el にはどこでクリックされたかの情報が入っている 27 var arr = el.target.id.split('_'); // idを'_'で分ける 28 var oppid = arr[0] + '_' + arr[2] + '_'+ arr[1]; // 反対側のid 29 el.target.innerHTML = '○'; // 勝ち 30 document.getElementById(oppid).innerHTML = '●'; // 負け 31 var trs = document.getElementById("winorlose_table").getElementsByTagName('tr'); 32 var win = 0; 33 var loss = 0; 34 // 1行目はヘッダーだから飛ばして 35 for(var itr = 1; itr < trs.length; itr++){ 36 // テーブルの行毎に処理 37 win = 0; 38 loss = 0; 39 var tds = trs[itr].getElementsByTagName('td'); 40 for(var itd = 0; itd < tds.length; itd++){ 41 if(tds[itd].id.indexOf('cell_') != -1){ 42 // 勝ち負け数カウント 43 if(tds[itd].innerHTML == '○'){ 44 win ++; 45 }else if(tds[itd].innerHTML == '●'){ 46 loss ++; 47 } 48 } else if(tds[itd].id.indexOf('win_') != -1){ 49 // 勝ち表示 50 tds[itd].innerHTML = win; 51 } else if(tds[itd].id.indexOf('lose_') != -1){ 52 // 負け表示 53 tds[itd].innerHTML = loss; 54 } 55 } 56 } 57 }

投稿2020/09/26 04:43

kuma_kuma_

総合スコア2506

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

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

Zengo_Master

2020/09/26 05:54

ありがとうございます。 3つのファイルでは動きました。 ただ、今回はRailsで実装するのですが、同じ書き方だと動作しません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問