アプリ版:「スタンプのみでお礼する」機能のリリースについて

現在、パソコンスクールでJavaScriptの勉強しています。

授業でtableタグを利用して表の中で商品の名前や在庫を表示するコードを作成しました。
元のコードはidを使っているため、項目を1回しか表示することができませんでした。

なのでカテゴリーだけクラスで名前を付けて2回目以降も同じクラス名で利用出来るように、
自分でカスタマイズしてみました。

ところが、クラス名を利用すると1回目から表示できません。

以下のサイトを参考にし、自分ではこのコードで動作すると思っていました。
ですが何か根本的に間違っているようです。
※タイプミスは確認しました。

https://bit.ly/2UOCebX

要するにtableタグを利用して表を作成する時に同じ項目を2行目以降も表示したいのですが、
こういう時にはクラス名を利用し、getElementsByClassNameで値を取得したり代入することはできないのでしょうか?

お手数ですが詳しい方、説明の上手な方、教えて下さい。よろしくお願いします。

コードは以下の通りです。
ブラウザーでの表示は画像のようになります。

<html>
<body>
<h5>idなので同じidをhtmlページで2回表示することは出来ない</h5>
<h5>getElementsByClassNameを使ったけど表示できない</h5>
<section>
<table>
<tr>
<td>title</td>
<td>categoly</td>
<td>price</td>
<td>stock</td>
<td>cat:ここだけClassName</td>
</tr>
<tr>
<td id="title"></td>
<td id="categoly"></td>
<td id="price"></td>
<td id="stock"></td>
<td class="cat"></td>
</tr>
<!--3段目は表示されない-->
<tr>
<td id="title"></td>
<td id="categoly"></td>
<td id="price"></td>
<td id="stock"></td>
<td class="cat">「あり」「なし」</td>
</tr>
</table>
</section>

<script>
var jsbook = {title:'JavaScript入門', price:2500, stock:3, categoly:'書籍', cat:'付属品',};
document.getElementById('title').textContent = jsbook.title;
document.getElementById('price').textContent = jsbook.price + '円';
document.getElementById('stock').textContent = '在庫:' + jsbook.stock;
document.getElementById('categoly').textContent = jsbook.categoly;

document.getElementsByClassName("cat").textContent = jsbook.cat;
</script>
</body>
</html>

「【JavaScript】tableタグを」の質問画像

質問者からの補足コメント

  • どう思う?

    解答して頂きありがとうございます。
    お礼にあるやりたいことはこんな感じです。

    「【JavaScript】tableタグを」の補足画像1
    No.3の回答に寄せられた補足コメントです。 補足日時:2018/12/17 17:20

A 回答 (4件)

とにかくidは2箇所以上に使えないので文法としてまちがっています



<script>
var jsbook = {title:'JavaScript入門', price:2500, stock:3, categoly:'書籍', cat:'付属品',};
window.addEventListener('DOMContentLoaded', function(e){
[].forEach.call(document.querySelectorAll('.title'),function(x,y){
x.textContent=jsbook.title;
document.querySelectorAll('.price')[y].textContent = jsbook.price + '円';
document.querySelectorAll('.stock')[y].textContent = '在庫:' + jsbook.stock;
document.querySelectorAll('.categoly')[y].textContent = jsbook.categoly;
document.querySelectorAll('.cat')[y].textContent = jsbook.cat;
});
});
</script>

<section>
<table>
<tr>
<td>title</td>
<td>categoly</td>
<td>price</td>
<td>stock</td>
<td>cat:ここだけClassName</td>
</tr>
<tr>
<td class="title"></td>
<td class="categoly"></td>
<td class="price"></td>
<td class="stock"></td>
<td class="cat"></td>
</tr>
<tr>
<td class="title"></td>
<td class="categoly"></td>
<td class="price"></td>
<td class="stock"></td>
<td class="cat"></td>
</tr>
<tr>
<td class="title"></td>
<td class="categoly"></td>
<td class="price"></td>
<td class="stock"></td>
<td class="cat"></td>
</tr>
</table>
</section>
    • good
    • 1
この回答へのお礼

解答して頂きありがとうございます。

見事にやりたいことそのままです。

今回は解答して頂きありがとうございます。
機会がありましたら、またお願いします。


追記
以下の1行だけ何をやっているのか全くイメージできないです。

window.addEventListener('DOMContentLoaded', function(e)

まだDOMを利用した要素の取得を習っていないので、
(テキストで軽く読みました)

細かく説明して頂いても、こちらの知識不足で理解できないと思います。

ですが、これから習うので、どういうコードの構造になるのかを理解するために、
ヒントになるような事がありましたら簡単に説明して頂ければうれしいです。

※とりあえず、以下のサイトを参考にquerySelectorAllについて調べてみました
http://www.sirochro.com/note/js-queryselector-qu …

※お手数でしたらスルーでOKです。
※他の方よりのアドバイスがあるかもしれないので、質問はしばらく開けておきます。

お礼日時:2018/12/17 14:32

> window.addEventListener('DOMContentLoaded'



これはjsをhead内や別ファイルにするとき
どこで宣言しても動くようにつけておくおまじないみたいなものです
試しにこの部分と、最後の「});」を外すと動かないのがわかると思います。
(jsをケツにもっていくと動く)

でやっていることはwindow.onload的なロード時にする処理の指示ですが
load時の処理とは画面がレンダリングされる前に動作する点が違います
(つまり動き出しが速い)
    • good
    • 1
この回答へのお礼

何度も解答して頂きありがとうございます。

> window.addEventListener('DOMContentLoaded'

これはjsをhead内や別ファイルにするとき
どこで宣言しても動くようにつけておくおまじないみたいなものです
試しにこの部分と、最後の「});」を外すと動かないのがわかると思います。

よくわかりました。
↓ これみたいなものですね。
window.onload = function(){

何度も解答して頂きありがとうございます。
機会がありましたら、またお願いします。

※別の方がアドバイスして下さったので、しばらく質問は開けておきます。

お礼日時:2018/12/17 17:31

いずれこうしたくなる!かも?



<!DOCTYPE html>
 <meta charset="UTF-8">
 <title>Table</title>
   <style>
    tr td:first-of-type {
       color: red;
        width: 20em;
        }
        tr td:nth-of-type(2), tr td:nth-of-type(3) {
         text-align: right;
       }
      tr td:nth-of-type(2):after {
     content: "円"
   }
 tr td:nth-of-type(3):before {
  content: "在庫:"
}
 td.cat { color: blue; }
 </style>
   
    <body>
      <table border="1">
       <tr><th>title <th>categoly <th>price <th>stock <th>cat
        </table>
        
        <script>
       const BOOKS = [
       {title:'JavaScript入門', price:2500, stock:3, categoly:'書籍', cat:'付属品'},
     {title:'JavaScript初級入門', price:25000, stock:2, categoly:'書籍', cat:'付属品'},
    {title:'JavaScript中級入門', price:250000, stock:1, categoly:'書籍', cat:'付属品'}
 ];
 
let table = document.querySelector ('table');
 
 BOOKS.forEach (book => {
    let tr = table.insertRow (-1);
     Object.keys (book).forEach (key => {
       let td = tr.insertCell (-1);
        td.classList.add (key);
         td.textContent = book[key];
         });
        });
       
      </script>
この回答への補足あり
    • good
    • 1
この回答へのお礼

解答して頂きありがとうございます。

今のレベルでは使い方が全く理解できないです(笑)。
本当は以下のようにしたいと思っていました。

ですが、まだ知識不足なので、とりあえず同じものを2行書けるようにしたい、、、
ということで、今回の質問をさせて頂きました。

目標としていること
1)カテゴリーを「書籍」と「雑誌」の2つにわける ※クラスで分けたい
2)「付属品」の有無を「あり」と「なし」で記載できるようにする ※クラスで別けたい
3)「付属品」の内容は手作業で入力 ※いろんな「おまけ」があるのでクラス別けは不可
4)「タイトル」はidでもOK ※同じ書籍は「在庫」でカウントできるから

※捕捉に画像で張り付けておきます。

今回は解答して頂きありがとうございます。
機会がありましたら、またお願いします。

※しばらく質問はあけておきます。

お礼日時:2018/12/17 17:21

読解力がなくてもうしわけない。


そもそも何を自動化したいのかがわからない。
提示されたサンプルの表では、何をクラス分けしたいのかもわからない。
categoly で並び変えたいの?
「catgo:ここだけ手入力」のデータ状態によって「catgol」が「あり/なし」に自動で変わるとか?

--
あとはまか
    • good
    • 1
この回答へのお礼

何回も解答して頂きありがとうございます。

こちらこそ説明が下手ですいません。
No.1さんの解答で解決しているので大丈夫です。

機会がありましたら、またお願いします。

お礼日時:2018/12/17 19:47

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!