単語帳がローカルストレージに保存出来るようになったのですが、流れが分かりません。
教えて貰えると助かります。
97行目のwordはクラスのものとは別ですよね?
質問の要点の一つは、118行のlist.push(word);があるので99行の list.push(new Word(word.en, word.ja));をどう解釈するかということ。突然のnew Word(word.en, word.ja)に面食らっています。
これは要るんだろうかと思い92~102行をコメントにして実行したら以降のようになりました。
驚いたのは、コメントにしない場合と同じ結果だった事です。
以前のコード
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 //btnにクリックイベントを登録 90 btn.addEventListener('click', () => { 91 // 入力値を取得(前後についた無駄なスペースを除去) 92 const enValue = inputs[0].value.trim(); 93 const jaValue = inputs[1].value.trim(); 94 95 if (enValue === '' || jaValue === '') { 96 alert('単語と意味を両方入力してください。'); 97 return; // 入力が不正な場合は処理を中断 98 } 99 100 //Wordインスタンスを作成 101 let word = new Word(enValue, jaValue); 102 //インスタンスを配列に追加 103 list.push(word); 104 //すべてのinput要素を空欄にする 105 inputs.forEach((input) => { 106 input.value = ''; 107 }); 108 updateTable(); 109 }); 110 111 function updateTable() { 112 //見出し行を作成 113 // table.innerHTML = '<tr><th>単語</th><th>意味</th></tr>'; 114 // table.innerHTML = '<tr><td>BASIC 300</td></tr>'; 115 116 //配列から1件1件取り出しながら処理を行う(取り出した1件をwordとして扱う) 117 list.forEach((word) => { 118 //tr要素を作成 119 let tr = document.createElement('tr'); 120 //trの子要素をhtmlが含まれた文字列で設定 121 tr.innerHTML = word.showInfo(); 122 //table要素の子要素として作成したtr要素を追加 123 table.appendChild(tr); 124 }); 125 126 //total要素のテキストコンテントを設定 127 total.textContent = `全${list.length}件`; 128 } 129 130 131 updateTable(); 132 }; 133 </script> 134 135</body> 136 137</html>
今のコード。88~102、124,125が追加されてます。
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>
gitデータはGitHubで送れますか?その場合htmlファイルだけで良いんですか?
回答1件
あなたの回答
tips
プレビュー