🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
JavaScript

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

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Q&A

解決済

2回答

2674閲覧

localStorageに複数のテキストを保存、取得したいです

退会済みユーザー

退会済みユーザー

総合スコア0

JavaScript

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

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

0グッド

1クリップ

投稿2019/10/27 07:08

jQuery初心者です。みなさま教えて下さい。
今、簡易なメモパッドを作っています。
左側にはメモを書くテキストエリアを、右側にはメモした内容をlocalStorageから引っ張って過去のメモ履歴を一覧で作りたいと思っています。以下の記述ですと、localStorageのKeyには表題である<input>が入り、Valueには本文である<textarea>が入ると思いますが、

①メモを記入した時刻も入れたいと思います。どのようにすれば宜しいでしょうか?「JSON形式」にしないといけないものでしょうか?
②右側のメモ履歴の<dl>をクリックすると、左側の<input><textarea>に過去のメモが再度反映されるようにしたいのですが、どのようにすれば宜しいでしょうか?

html <div id="memopad"> <input type="text" id="key"> <textarea id="memo"></textarea> <li id="save">保存</li> <li id="clear">クリア</li> <div id="list"> <dl id="line"> <dt></dt> <dd></dd> <a></a> </dl> </div>
Javascript(jQuery) /保存 クリックイベント $("#save").on("click",function(){ const key = $("#key").val(); const value = $("#memo").val(); localStorage.setItem(key,value); const html='<dl><dt>'+key+'</dt><dd>'+value+'</dd></dl>'; $("#list").prepend(html); }); //クリア クリックイベント $("#clear").on("click",function(){ $("#key").val(""); $("#memo").val(""); }); //保存データ取得表示 for(let i=0; i<localStorage.length; i++){ const key = localStorage.key(i); const value = localStorage.getItem(key); const html='<dl><dt>'+key+'</dt><dd>'+value+'</dd></dl>'; $("#list").prepend(html); }

拙いコード、拙い質問で申し訳ございませんが、分かる方がいらっしゃればご教示宜しくおねがいします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

ローカルストレージに全てのメモを都度保存していくと管理が煩雑になりますし、同一のキーの場合に上書きされるなどの問題もあります。

色々なやり方はあると思いますが、メモ自体は配列で管理しておき、配列をJSON形式で保存するのがシンプルだと思います。

MDN web docs : JSON

  • parseメソッド : JSON文字列をオブジェクトに変換
  • stringifyメソッド : オブジェクトをJSON文字列に変換

この二つを覚えておけばOKです。

javascript

1const STORAGE_KEY = 'memo'; 2 3//格納用の配列 4let data = []; 5 6//保存データ取得 7if(localStorage.getItem(STORAGE_KEY)) { 8 data = JSON.parse(localStorage.getItem(STORAGE_KEY)); 9} 10 11//保存データ表示 12data.forEach(item => { 13 const html = ` 14 <dl> 15 <dt>${item.title}</dt> 16 <dd>${item.value}</dd> 17 </dl>`; 18 $("#list").prepend(html); 19}) 20 21//保存 クリックイベント 22$("#save").on("click",function(){ 23 const title = $("#key").val(); 24 const value = $("#memo").val(); 25 26 //配列へ追加 27 data.push({title, value}); 28 29 //配列をローカルストレージへ保存 30 localStorage.setItem(STORAGE_KEY, JSON.stringify(data)); 31});

Dateオブジェクトを使うと時刻を取得できます。
メモの内容と一緒にJSONで保存すれば良いかと思います。(保存のコードは②にまとめます)

javascript

1//現在時刻取得 2const date = new Date(); 3const year = date.getFullYear(); 4const month = date.getMonth(); 5const day = date.getDate(); 6const hour = date.getHours(); 7const minutes = date.getMinutes(); 8const seconds = date.getSeconds(); 9const milliseconds = date.getMilliseconds(); 10const time = `${year}/${month}/${day} ${hour}:${minutes}:${seconds}`; 11console.log(time); // (例) 2019-10-27 18:00:00 12

こちらも色々やり方があると思いますが以下の方法はいかがでしょうか。(あくまで一例です)
0. 一意のメモIDを発行し、メモの内容と一緒に保存しておく
0. <dl></dl>タグにdata属性を持たせ、メモIDを保持する
0. クリックイベントでdata属性からメモIDを読み取り、配列からメモIDをキーにして対象のデータを読み出す
0. 読みだしたデータの中身をフォームにセットする

なお、保存時には新規と編集で処理が分かれるので、そのあたりも考慮が必要です。
↓の例では、メモをクリックした際にcurrentMemoという変数にクリックされたメモの内容を格納し、その変数に中身があるかどうかで新規か編集かを判別しています。

javascript

1$(function() { 2 const STORAGE_KEY = "memo"; 3 4 //格納用の配列 5 let data = []; 6 7 //編集中メモ保持用 8 let currentMemo; 9 10 //保存データ取得 11 if(localStorage.getItem(STORAGE_KEY)) { 12 data = JSON.parse(localStorage.getItem(STORAGE_KEY)); 13 } 14 15 //保存データ表示(使いまわすため関数化) 16 const loadData = () => { 17 //一旦全部消す 18 $("#list").html(""); 19 $("#key").val(""); 20 $("#memo").val(""); 21 currentMemo = undefined; 22 23 data.forEach(item => { 24 const html = ` 25 <dl data-memo-id="${item.memoId}"> 26 <dt>${item.title}(${item.time})</dt> 27 <dd>${item.value}</dd> 28 </dl>`; 29 $("#list").prepend(html); 30 }) 31 }; 32 33 loadData(); 34 35 //保存 クリックイベント 36 $("#save").on("click",function(){ 37 const title = $("#key").val(); 38 const value = $("#memo").val(); 39 40 //現在時刻取得 41 const date = new Date(); 42 const year = date.getFullYear(); 43 const month = date.getMonth(); 44 const day = date.getDate(); 45 const hour = date.getHours(); 46 const minutes = date.getMinutes(); 47 const seconds = date.getSeconds(); 48 const milliseconds = date.getMilliseconds(); 49 const now = `${year}/${month}/${day} ${hour}:${minutes}:${seconds}`; 50 51 //編集なら元のtimeを使う 52 const time = currentMemo ? currentMemo.time : now; 53 54 //編集なら元のIDを使う 55 const memoId = currentMemo ? currentMemo.memoId : `${year}${month}${day}${hour}${minutes}${seconds}${milliseconds}`; 56 57 const newItem = {memoId, title, value, time}; 58 59 if(currentMemo) { 60 //配列を編集 61 const index = data.findIndex(n => n.memoId == memoId); 62 data[index] = newItem; 63 } else { 64 //配列へ追加 65 data.push(newItem); 66 } 67 68 //ローカルストレージへ保存 69 localStorage.setItem(STORAGE_KEY, JSON.stringify(data)); 70 71 //再表示 72 loadData(); 73 }); 74 75 //クリア クリックイベント 76 $("#clear").on("click",function(){ 77 $("#key").val(""); 78 $("#memo").val(""); 79 currentMemo = undefined; 80 }); 81 82 //読み出し(動的に追加した要素はこの書き方じゃないとイベント発火しません) 83 $(document).on("click", "#list > dl", function() { 84 85 //data属性からメモID取得 86 const id = $(this).data("memo-id"); 87 88 //配列からメモIDをキーにしてデータ取得 89 const memo = data.filter(n => n.memoId == id)[0]; 90 currentMemo = memo; 91 92 //フォームへセット 93 $("#key").val(memo.title); 94 $("#memo").val(memo.value); 95 }); 96});

投稿2019/10/27 11:32

m.kagawa

総合スコア113

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

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

退会済みユーザー

退会済みユーザー

2019/10/28 05:39

早速、回答していただきありがとうございます!実装できました! こういうやり方があったのか「!」の気づきと、そもそも頭が追いついておらず読解できず「?」という内容もありましたが、シンプルなコードで助かりました。ありがとうございます。
guest

0

localStorage は 簡便な キー・バリュー・ストレージ ですが、keyもvalueも文字列でなければならない制限があります。

Storage の派生オブジェクトなので、HTML Standard:Storage インタフェースを見てみます

IDL

1[Exposed=Worker] 2interface Storage { 3 readonly attribute unsigned long length; 4 DOMString? key(unsigned long index); 5 getter DOMString? getItem(DOMString key); 6 setter void setItem(DOMString key, DOMString value); // ここに注目!! 7 deleter void removeItem(DOMString key); 8 void clear(); 9};

setItem() 関数は、key,value 共に、DOMString(一般的なstring)しか指定できません。

ということで、オブジェクト構造を格納するには JSON.stringify() は必須です。

投稿2019/10/28 01:50

AkitoshiManabe

総合スコア5434

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問