質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.49%
JavaScript

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

2回答

2500閲覧

JavaScriptでローカルストレージを使用したい

aiki

総合スコア13

JavaScript

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

1クリップ

投稿2016/10/12 18:44

###前提・実現したいこと
JavaScriptでローカルストレージ(localstrage)を利用したい
リンク先のコードをそのまま使用しています。画面に「こんにちはlocalStorage」と表示させるだけです。
http://team-lab.github.io/skillup-nodejs/1/6.html

###発生している問題・エラーメッセージ

画面になにも表示されない。 Chromeのコンソールを見てもエラーは表示されていないのでどうしたらいいか分からない

###該当のソースコード

HTML/JavaScript

1<!DOCTYPE html> 2<html lang="ja"> 3 <head> 4 <meta charset="UTF-8" /> 5 <title>JavaScriptのサンプル</title> 6 <script type="text/javascript"> 7 function (){ 8 // messageというキーに「こんにちはlocalStorage」という値を保存 9 localStorage.setItem("message", "こんにちはlocalStorage"); 10 // messageというキーに保存した値を取得して表示 11 var val = localStorage.getItem("message"); 12 document.querySelector("#result").innerHTML = val 13 } 14 </script> 15 </head> 16 <body> 17 <div id="result"></div> 18 </body> 19 20</html> 21 22

###試したこと
ローカルストレージを使用している以下のサンプルコードは動く。
どこで違いが出ているのか分かっていない。

<!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8" /> <title>JavaScriptのサンプル</title> 保存したい文字列:<br> <textarea id="edit_00" style="width:100%; height:100px; margin:0px 0px 5px 0px;"></textarea><br> <input type="button" id="button_00_load" style="width:80px; height:40px; margin:0px 0px 10px 0px;" value="読み込み"> <input type="button" id="button_00_save" style="width:80px; height:40px; margin:0px 0px 10px 0px;" value="保存"> <input type="button" id="button_00_del" style="width:80px; height:40px; margin:0px 0px 10px 0px;" value="削除"> <script type="text/javascript"> <!-- // 匿名関数内で実行 (function (){ // テキストフォームの element を取得 var element_edit = document.getElementById("edit_00"); var element; // 読み込みボタンの element を取得 element = document.getElementById("button_00_load"); // ボタンが押されたときに実行されるイベント element.onclick = function (){ try{ // "test_key" からデータを取り出す element_edit.value = localStorage.getItem("test_key"); }catch(e){ // エラーを出力 element_edit.value = e + "\n" + element_edit.value; } }; // 保存ボタンの element を取得 element = document.getElementById("button_00_save"); // ボタンが押されたときに実行されるイベント element.onclick = function (){ try{ // "test_key" にデータを保存する localStorage.setItem("test_key",element_edit.value); }catch(e){ // エラーを出力 element_edit.value = e + "\n" + element_edit.value; } }; // 削除ボタンの element を取得 element = document.getElementById("button_00_del"); // ボタンが押されたときに実行されるイベント element.onclick = function (){ try{ // "test_key" のデータを削除する localStorage.removeItem("test_key"); }catch(e){ // エラーを出力 element_edit.value = e + "\n" + element_edit.value; } }; })(); //--> </script> </head> <body> <div id="result"></div> </body> </html>

###補足情報(言語/FW/ツール等のバージョンなど)
特になし。

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

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

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

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

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

kei344

2016/10/14 09:23

まだ質問が「受付中」になっていますが、いったん「解決済」にされてはいかがでしょうか。また、解決されていないなら状況をお教えください。
guest

回答2

0

ベストアンサー

まるっとコピペしてChromeで試してみましたが、

Uncaught SyntaxError: Unexpected token (

このようなエラーが出ています。これは、

JavaScript

1function (){

ここでfunction文を使って関数を定義しようとしていますが、関数に名前を付けていないことです。

JavaScript

1function testStorage(){

任意のもので構いませんが、何らかの関数名を付けてください。


次に、定義した関数を適切なタイミングで実行する必要があります。現在は、関数を定義しているだけで実行しようとしていませんので、関数名のところを修正しただけでは動作しません。

関数自体は定義したその場で実行することもできますが、script要素はhead要素内にありますので、定義した時点ではまだbody要素やその中身が読み込まれていません。

そのため即実行すると、localStorageの処理はいいのですが、

JavaScript

1document.querySelector("#result").innerHTML = val

ここで#resultが見つからないため、結果をinnerHTMLに書き込むことができません。

JavaScript

1window.addEventListener("load", testStorage, false);

例えばこのようにして、定義した関数をwindowの読み込み完了まで遅らせるといった対応をすることとなります。

他にも、script要素ごとbody要素の末尾(</body>の直前)に移したり(この場合は関数にせずベタ書きしても可)、windowのloadイベントではなくボタンのclickイベントを使ったりと、タイミングの取り方は色々あります。

投稿2016/10/12 20:01

sii_side

総合スコア849

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

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

aiki

2016/10/13 00:25

とてもわかりやすくありがとうございます!! 関数の定義と実行、実行のタイミングについて今後意識していきたいと思います。
AkitoshiManabe

2019/10/27 01:22

onload イベントは、DOMの描画、APIの初期化が完了したときに発するイベントですのでlocalStorageも使えるようになっていますよ。即時関数内部を ready関数にして window.addEventHandler("load", ready ) とするのが、ページ読み込み後の最速タイミングですね。
guest

0

・コピペした簡単なコードが動かないと思っていたが、確認するとリンク先のコードに
document.querySelector("#result").innerHTML = val
などの行を加わっており、自分でどこからか引っ張ってきたことを忘れていたらしい。

・適当にいじっているとinnerHTMLがnullになっているというようなエラーが出た。
要素がロードされる前に参照しているのが問題のようで、関数にonloadを付けると正しく表示された。

投稿2016/10/12 19:59

aiki

総合スコア13

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問