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

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

詳細はこちら
date

dateは、date型や日付に関する関数や処理についてのタグです

JavaScript

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

Q&A

解決済

3回答

2173閲覧

[JavaScript]localStorageに保存した内容が画面に表示されない

wada_RY

総合スコア3

date

dateは、date型や日付に関する関数や処理についてのタグです

JavaScript

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

0グッド

0クリップ

投稿2020/12/12 01:08

編集2020/12/12 07:07

前提・実現したいこと

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>&nbsp;</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>&nbsp;</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>

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

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

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

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

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

guest

回答3

0

キーがnull_body、null_titleとなっています

という状況から推測すると、

//日記を保存 localStorage[dateStr + "_title"] = diary_title; localStorage[dateStr + "_body"] = diary_body;

で使われている変数 dateStr の内容が null なのだと思われます。

dateStrの値は、下記のコードで設定されています。
それが null になるのは、id="data-date" の要素が存在しないからではないでしょうか?

//ボタンのdata-date属性から日付文字列を取得 var dateStr = obj.getAttribute("data-date");

===
どのようなHTMLファイルに質問のJavascriptのプログラムが書かれていたのかが判りませんので、具体的な回答をできかねます。

質問をするのであれば、必要な情報を提示するようにしてください。

投稿2020/12/12 02:33

fumu7

総合スコア121

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

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

wada_RY

2020/12/12 07:10

ご回答ありがとうございます。 scriptタグだけに問題があると思い込んでbodyタグを省略していました。 今後質問する際は気を付けたいと思います。
guest

0

localStorage の使い方を調べましょう。
Window.localStorage - Web API | MDN
保存にはsetItem、取得にはgetItemを使います。

あと直接は関係ないですがvarをやめてletconstを使ったほうが良いですよ。

投稿2020/12/12 01:38

A_kirisaki

総合スコア2853

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

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

wada_RY

2020/12/12 01:43

ご回答ありがとうございます。 書籍を使って勉強しており、setItemやgetItemのことも載ってはいたのですが、サンプルを見たところそれらを使っておらず「使わなくても書けるのかな?」と勝手に勘違いしておりました。 URLや変数についても丁寧に書いてくださり、ありがとうございます。
guest

0

自己解決

下記の「button.setAtrribute("data-diary",dateStr);」の部分の「"data-diary"」を「"data-date"」に書き換えると希望通りの捜査をしました。

<script> //指定した日付の日記を表示 function presetDiary(dateStr){ //ボタンのdate属性にキーの日付部分を指定する var button = document.getElementById('button'); button.setAttribute("data-diary", dateStr);

投稿2020/12/21 05:33

wada_RY

総合スコア3

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問