前提・実現したいこと
JavaScriptのlocalStorage機能を使って日記アプリを作る演習を行っており、入力した内容をlocalStorageに保存するところまではうまくいったのですが、保存した日記の内容を画面に表示することができずに困っています。
日記アプリの概要ですが、ブラウザ上に当月のカレンダーを表示して日記を書きたい日付をクリックするとその日の日記を書き込むことができ、日記を書いた日付をクリックするとその日の日記が画面に表示されるというものです。
試したこと
初学者ゆえ、この問題に対してどのように調べればよいか分からず、「localStorage 保存されない」などと検索しても、似たような事案を解説したサイトが出てきませんでした。
補足情報(FW/ツールのバージョンなど)
デベロッパーツールを開いてApplicationのlocalStorageを調べてみると、入力内容の保存自体はできているようですが、キーがnull_body、null_titleとなっています。エラーも出ていません。ちなみにエディタはAtomを、ブラウザはgooglechromeを使っています。
以下が実際のコードです。
html
1<script> 2 //指定した日付の日記を表示 3 function presetDiary(dateStr){ 4 //ボタンのdate属性にキーの日付部分を指定する 5 var button = document.getElementById('button'); 6 button.setAttribute("data-diary", dateStr); 7 //日記の日付を表示 8 var diary_date = document.getElementById('diary_date'); 9 diary_date.innerHTML = dateStr; 10 //localStorageから日記の本文とタイトルを取得 11 var title = localStorage[dateStr + "_title"] 12 var body = localStorage[dateStr + "_body"] 13 //日記の入力欄を取得 14 var diary_title = document.getElementById('diary_title'); 15 var diary_body = document.getElementById('diary_body'); 16 //日記のデータがあれば表示 17 if(title){ 18 diary_title.value = title; 19 }else { 20 diary_title.value = ""; 21 } 22 if(body){ 23 diary_body.value = body; 24 }else { 25 diary_body.value = ""; 26 } 27 } 28 //日記を保存 29 function onSave(obj){ 30 //ボタンのdata-date属性から日付文字列を取得 31 var dateStr = obj.getAttribute("data-date"); 32 //日記の入力欄から入力内容を取得 33 var diary_title = document.getElementById('diary_title').value; 34 var diary_body = document.getElementById('diary_body').value; 35 //日記を保存 36 localStorage[dateStr + "_title"] = diary_title; 37 localStorage[dateStr + "_body"] = diary_body; 38 //完了メッセージを表示 39 window.alert("日記を投稿しました"); 40 //ページをリロード 41 location.reload(); 42 } 43 44 window.onload = function(){ 45 //本日の日付を取得 46 var date = new Date(); 47 var year = date.getFullYear(); 48 var month = date.getMonth() + 1; 49 //当月1日の日付を取得 50 var firstDate = new Date(year, month-1, 1); 51 //翌月の0日を指定して当月の月末日を取得 52 var lastDate = new Date(year, month, 0); 53 //本日の日記のプリセット 54 var todayStr = year + "." + month + "." + date; 55 presetDiary(todayStr); 56 //当月の表示 57 var table_title = year + "年 "+ month + " 月"; 58 var captionHtml = "<caption>" + table_title + "</caption>" 59 //曜日の行を作成 60 var weekdays = ["日","月","火","水","木","金","土"]; 61 var weekdaysStr = "<tr>"; 62 for(var i=0; i<7; i++){ 63 if(i==0){ 64 weekdaysStr += "<td class='sun'>" + weekdays[i] + "</td>"; 65 }else if(i==6){ 66 weekdaysStr += "<td class='sat'>" + weekdays[i] + "</td>"; 67 }else{ 68 weekdaysStr += "<td>" + weekdays[i] + "</td>"; 69 } 70 } 71 weekdaysStr += "</tr>"; 72 73 //カレンダーの日付セル部分を作成 74 var htmlStr = "<tr>"; 75 //当月1日の曜日 76 var startWeekDay = firstDate.getDay(); 77 //1日までを空白で埋める 78 for(var i=0; i<startWeekDay; i++){ 79 htmlStr += "<td> </td>" 80 } 81 //1日から月末日までループ 82 for(var i=1; i <= lastDate.getDate(); i++){ 83 //当月i日のDateオブジェクトを生成 84 var date = new Date(year, month-1, i); 85 //i日の曜日を取得 86 var weekDay = date.getDay(); 87 //日記を保存する際の日付部分のキー 88 var dateStr = year + "." + month + "." + i; 89 //日を取得 90 var cellStr = date.getDate(); 91 //日記データがあれば日付の下に下線を表示 92 if(localStorage[dateStr + "_title"]) cellStr = "<u>" + cellStr + "</u>"; 93 //日曜日の場合は行の開始なのでtr開始タグ 94 if(weekDay == 0) htmlStr += "<tr>"; 95 if(weekDay == 0){ 96 htmlStr += "<td class = 'sun'>"; 97 }else if(weekDay == 6){ 98 htmlStr += "<td class = 'sat'>"; 99 }else{ 100 htmlStr += "<td>"; 101 } 102 htmlStr += "<a onclick='presetDiary(\""+ dateStr +"\");'>" + cellStr + "</a></td>"; 103 //土曜日の場合は行の終わりなのでtr終了タグ 104 if(weekDay == 6) htmlStr += "</tr>\n"; 105 } 106 //月末日の曜日 107 var lastDayWeek = lastDate.getDay(); 108 //月末日が土曜日でない場合、空白のセルでテーブルを埋める 109 if(lastDayWeek != 6){ 110 //月末日の翌日の曜日から土曜日までをfor文で回す 111 for(var i=lastDayWeek + 1; i<=6; i++){ 112 htmlStr += "<td> </td>"; 113 } 114 htmlStr += "</tr>"; 115 } 116 document.getElementById("calendar").innerHTML = "<table>" + captionHtml + weekdaysStr + htmlStr + "</table>"; 117 } 118 </script>
こちらがHTMLのbodyタグです。
<body> <div class="frame-box"> <div class="calendar-box"> <div id="calendar" class="calendar"></div> </div> <div class="diary-box"> <div id="diary_date" class="diary_date"></div> <input type="text" id="diary_title"><br><br> <textarea id="diary_body" rows="10" cols="80"></textarea><br><br> <input type="button" id="button" onclick="onSave(this)" value="保存"> </div> </div> </body>
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/12/12 07:10