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

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

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

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

JavaScript

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

Q&A

解決済

1回答

3852閲覧

javaScriptでページ遷移前にsessionStorageの中身を消したいです

t_hoshizaki

総合スコア18

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

JavaScript

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

1グッド

0クリップ

投稿2018/04/06 04:06

編集2018/04/06 06:01

前提・実現したいこと

Web StorageのLocalStorageを利用しています。
あるボタンを押すと、保存されているStorageの内容を消してからページ遷移させたいです。
前提として、LocalStorageにデータの保存は出来ています。

現在実装しているコード

javascript

1var local_storage = sessionStorage; 2 3//値をセット 4local_storage.setItem('pre_test', 'test01');//この値は消したい 5local_storage.setItem('pre_value', 'value01');//この値は消したい 6local_storage.setItem('b_test', 'b_test_value');//この値は消したくない 7 8//Storageの削除関数 9function clear_storage(){ 10 alert('削除開始');//テスト用にアラートを出します。 11 for(var i = (local_storage.length - 1); i >= 0; i--){//ループの方法を変更しました。 12 var key = local_storage.key(i); 13 if(key.match('pre')){//該当するkeyだけ消したいのでif文判定しています 14 local_storage.removeItem(key); 15 } 16 } 17} 18 19//ボタンを押されたら、Storageを消してからページ遷移 20$('#test_button').on('click', function(){ 21 clear_storage(); 22 location.href = '/other_page.php'; 23});

###現状
id = test_buttonの箇所をクリックしても、Storageの削除が行われません。
また、テスト用のアラートも出ません。それらを実行せずにページ遷移が行われています。

ページ遷移前に処理を行いたいです。
以下の様な指摘でも構いません。

・そもそもStorageの消し方が間違っている
・ページ遷移前になんらかの処理はできない

お手数ですが、回答よろしくお願いいたします。

defghi1977👍を押しています

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

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

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

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

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

m.ts10806

2018/04/06 04:15

この記述で削除できていないということでしょうか?sessionstorageに保管している情報のサンプルも追記していただけますか?
defghi1977

2018/04/06 04:29

これ、もう少し詳しく説明して下さい. key.match('pre')ってことは「文字列preが含まれているキーに対応する値全てを削除する」様に見えますが、一切それに関する記述がありません.
t_hoshizaki

2018/04/06 05:11

defghi1977さん ご指摘の通りリダイレクトでなくページ遷移です。ありがとうございます。また、まさに「文字列preが含まれているキーに対応する値全てを削除する」がしたいことです。
t_hoshizaki

2018/04/06 05:13

mts10806さん この記述で削除できておらず、ページ遷移後も残ってしまっています。また指摘していただいた、保管している情報のサンプルを追記しました。
m.ts10806

2018/04/06 05:40

removeItem()をコメントアウトしたらmatch==trueでpre含むキー2つが入ってくるみたいですね。そこが問題かもしれません。
guest

回答1

0

ベストアンサー

ループカウンタのi0からインクリメントしているため removeItemを呼び出す毎にlength値が減り, ループ内の実行回数がずれています.

JavaScript

1//Storageの削除関数 2function clear_storage(){ 3 //↓(2)ここのlength値が一個減ってしまうつまりループ数が足りなくなる. 4 for(var i = 0; local_storage.length; i++){ 5 var key = local_storage.key(i); 6 if(key.match('pre')){//該当するkeyだけ消したいのでif文判定しています 7 local_storage.removeItem(key);//←(1)これを実行すると 8 } 9 } 10} 11

こういった場合は, ループカウンタをlength値からデクリメントするようにすると辻褄が合います.

JavaScript

1"use strict"; 2{ 3 const st = window.sessionStorage; 4 st.setItem("pre0", "a"); 5 st.setItem("any0", "b"); 6 st.setItem("pre1", "c"); 7 st.setItem("any1", "d"); 8 console.log(st.length); 9 10 for(let i = st.length - 1; i >= 0; i--){ 11 const key = st.key(i); 12 if(key.match(/^pre/)){ 13 st.removeItem(key); 14 } 15 } 16 console.log(st.length); 17 console.log("pre0", st.getItem("pre0")); 18 console.log("any0", st.getItem("any0")); 19 console.log("pre1", st.getItem("pre1")); 20 console.log("any1", st.getItem("any1")); 21}

実行結果

text

14 22 3pre0 null 4any0 b 5pre1 null 6any1 d

投稿2018/04/06 05:40

defghi1977

総合スコア4756

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

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

t_hoshizaki

2018/04/06 06:08

defghi1977さん 回答ありがとうございます。 まずはご指摘いただいた通り、for文を修正しました。 しかしこれでは『ボタンを押した後、削除してからページ遷移』がまだ出来ていません。 度々で申し訳ありませんが、助言頂ければ助かります。
defghi1977

2018/04/06 06:17

> また、テスト用のアラートも出ません。それらを実行せずにページ遷移が行われています。 なら、問題はここじゃないよ? (別にlocation.hrefを弄っている場所があるのでは?)
t_hoshizaki

2018/04/06 06:56

defghi1977さん 重ね重ねありがとうございます。ここ以外でlocation.hrefの記述はありません。 location.hrefの前に関数を呼び出して終了後にページ遷移は不可能ということでしょうか・・・
defghi1977

2018/04/06 06:59

あなたのコードそのものはこちらでは動いているのです. ですからこれ以外に原因があるとしか考えられません. そのため, HTML部の提示もお願いいたします.
t_hoshizaki

2018/04/06 07:06

defghi1977さん 非常に申し訳ありません、関数を呼び出すときの名前を間違えていたのが原因でした。 従って、指摘していただいたfor文の時点で解決しておりました。 このようなミスのせいでお時間を取らせてしまいすみません。 以後、投稿する前に確認します。
defghi1977

2018/04/06 07:09

おつかれさまです. バグ潰しはあらゆる可能性を疑う必要があるから、一つ一つ虱潰しにせんとね
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問