前回の続きです。お手数ですがよろしくお願いします。
コメントに基づきコードを変えてみました。
html
1<!DOCTYPE html> 2<html lang="ja"> 3 4<head> 5 <meta charset="UTF-8"> 6 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 7 <title>単語帳</title> 8</head> 9 10<body> 11 <h1>プログラミング必須英単語600+</h1> 12 <input type="text" placeholder="単語"> 13 <input type="text" placeholder="意味"> 14 <button id="btn">登録</button> 15 <p id="total">全0件</p> 16 <table id="table"> 17 <tr> 18 <th>単語</th> 19 <th>意味</th> 20 </tr> 21 <tr> 22 <td colspan=2 id="class">BASIC 300</td> 23 </tr> 24 </table> 25 26 27 <style> 28 h1 { 29 font-family: "Yu Gothic"; 30 } 31 32 /*idにテーブルがついている要素*/ 33 #table { 34 /* テーブルの境界線を重ねて表示し、隣接するセルの境界線を1本にまとめる */ 35 border-collapse: collapse; 36 } 37 38 /*td要素とth要素*/ 39 td, 40 th { 41 /*1px実践の罫線(色は#333)*/ 42 border: 1px solid #333; 43 /*上下0 左右10pxのパディング*/ 44 padding: 0 10px; 45 /*テキストを中央揃えにする */ 46 text-align: center; 47 } 48 49 th { 50 background: #0000ff; 51 /*文字色を白に設定*/ 52 color: white; 53 } 54 55 #class { 56 background: pink; 57 } 58 </style> 59 60 61 <script> 62 'use strict'; 63 64 //文書が読み込み終わったら処理を実行 65 window.onload = () => { 66 class Word { 67 //コンストラクター 68 constructor(en, ja) { 69 this.en = en; 70 this.ja = ja; 71 } 72 73 //メソッド 74 showInfo() { 75 return `<td>${this.en}</td><td>${this.ja}</td>`; 76 } 77 } 78 79 //input要素をNodeListとして取得 80 const inputs = document.querySelectorAll('input'); 81 //セレクタをもとに要素を取得 82 const btn = document.querySelector('#btn'); 83 const total = document.querySelector('#total'); 84 const table = document.querySelector('#table'); 85 86 //空の配列を準備 87 let list = []; 88 89 //localStorageからwordsというキーがついた項目を取得 90 const loadData = localStorage.getItem('words'); 91 92 //データがあれば 93 if (loadData !== null) { 94 //取得したJSON形式のデータをオブジェクトの配列に変換 95 const words = JSON.parse(loadData); 96 //配列から1件ずつwordとして取り出す 97 words.forEach((word) => { 98 //listにWordインスタンスを追加 99 list.push(new Word(word.en, word.ja)); 100 }); 101 updateTable(); 102 } 103 104 //btnにクリックイベントを登録 105 btn.addEventListener('click', () => { 106 // 入力値を取得(前後についた無駄なスペースを除去) 107 const enValue = inputs[0].value.trim(); 108 const jaValue = inputs[1].value.trim(); 109 110 if (enValue === '' || jaValue === '') { 111 alert('単語と意味を両方入力してください。'); 112 return; // 入力が不正な場合は処理を中断 113 } 114 115 //Wordインスタンスを作成 116 let word = new Word(enValue, jaValue); 117 //インスタンスを配列に追加 118 list.push(word); 119 //すべてのinput要素を空欄にする 120 inputs.forEach((input) => { 121 input.value = ''; 122 }); 123 updateTable(); 124 //配列の単語リストをJSON形式に変換し、localStorageに保存 125 localStorage.setItem('words', JSON.stringify(list)); 126 }); 127 128 function updateTable() { 129 //見出し行を作成 130 table.innerHTML = '<tr><th>単語</th><th>意味</th></tr>'; 131 table.innerHTML += '<tr><td>BASIC 300</td></tr>'; 132 133 //配列から1件1件取り出しながら処理を行う(取り出した1件をwordとして扱う) 134 list.forEach((word) => { 135 //tr要素を作成 136 let tr = document.createElement('tr'); 137 //trの子要素をhtmlが含まれた文字列で設定 138 tr.innerHTML = word.showInfo(); 139 //table要素の子要素として作成したtr要素を追加 140 table.appendChild(tr); 141 }); 142 143 //total要素のテキストコンテントを設定 144 total.textContent = `全${list.length}件`; 145 } 146 147 updateTable(); 148 }; 149 </script> 150 151</body> 152 153</html>
結果は以下のようになり、表の重複は解消されています。
しかし、BASIC 300のcolspan(22行)とCSS加飾が無くなっています。
どうやったら戻せますか?
回答3件
あなたの回答
tips
プレビュー