ローカルストレージに全てのメモを都度保存していくと管理が煩雑になりますし、同一のキーの場合に上書きされるなどの問題もあります。
色々なやり方はあると思いますが、メモ自体は配列で管理しておき、配列をJSON形式で保存するのがシンプルだと思います。
MDN web docs : JSON
parseメソッド : JSON文字列をオブジェクトに変換
stringifyメソッド : オブジェクトをJSON文字列に変換
この二つを覚えておけばOKです。
javascript
1 const STORAGE_KEY = 'memo' ;
2
3 //格納用の配列
4 let data = [ ] ;
5
6 //保存データ取得
7 if ( localStorage . getItem ( STORAGE_KEY ) ) {
8 data = JSON . parse ( localStorage . getItem ( STORAGE_KEY ) ) ;
9 }
10
11 //保存データ表示
12 data . 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 //現在時刻取得
2 const date = new Date ( ) ;
3 const year = date . getFullYear ( ) ;
4 const month = date . getMonth ( ) ;
5 const day = date . getDate ( ) ;
6 const hour = date . getHours ( ) ;
7 const minutes = date . getMinutes ( ) ;
8 const seconds = date . getSeconds ( ) ;
9 const milliseconds = date . getMilliseconds ( ) ;
10 const time = ` ${ year } / ${ month } / ${ day } ${ hour } : ${ minutes } : ${ seconds } ` ;
11 console . 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/28 05:39