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

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

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

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

JavaScript

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

Q&A

1回答

626閲覧

【JavaScript】リロード直後DOM要素に対して実行する変更内容を、リロード後も維持する方法について

miikan023

総合スコア3

HTML5

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

JavaScript

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

0グッド

0クリップ

投稿2022/09/12 14:52

前提

最近JavaScriptを学び始めたビギナーです。
HTMLとJavaScriptで簡単なアンケートフォームを作成してます。

仕様は以下のようなものです↓
・ボタンクリック後に記載内容の有無を調べるバリデーション
・空の場合はアラートで警告
・入力値をセッションに保存
・保存が確認できたらページを更新
・保存したセッション内容をデフォルトでは非表示にしているliタグ内に入れ表示

実現したいこと

・リロード後も関数rewriteで実行する内容を維持したい

発生している問題

リロードされた後に対象要素のテキストを変更させ、
その要素を表示させたいが、リロード後に全て消えてしまう。

該当のソースコード

HTML/JavaScript

1<!DOCTYPE html> 2<html> 3<head> 4 <title>アンケート</title> 5 <style> 6 #conf{ 7 display: none; 8 } 9 </style> 10</head> 11<body> 12 <h1>アンケートフォーム</h1> 13 <form id="a_form"> 14 氏名:<input type="text" name="name" value="" /> 15 年齢:<input type="number" name="age" value="" /> 16 </form> 17 18 <button id="a_bt">確認</button> 19 20 <ul id="conf"> 21 <li class="name"></li> 22 <li class="age"></li> 23 </ul> 24 25 <script> 26 //確認ボタンを押したイベントを取得 27 document.getElementById('a_bt').addEventListener('click',function(){ 28 var savedFormData = saveInput(getFormInput()); 29 var {name, age} = savedFormData; 30 if (savedFormData !== ' ') { 31 loadPage(); 32 rewrite(name,age); 33 } 34 }); 35 36 //formの入力値を取得し、空かどうかをチェック 37 function getFormInput() { 38 var messages = []; 39 var nameInput = document.querySelector('[name=name]').value; 40 var ageInput = document.querySelector('[name=age]').value; 41 //入力が空だった時はアラートを表示 42 if (nameInput === '' || nameInput === null) { 43 messages.push('氏名を入力して下さい。'); 44 } 45 if (ageInput === '' || ageInput === null) { 46 messages.push('年齢を入力して下さい。'); 47 } 48 if (messages.length > 0) { 49 alert(messages.join('\n')); 50 } else { 51 return { 52 nameInput, 53 ageInput 54 }; 55 } 56 } 57 //入力があれば、入力値をセッションに保存 58 function saveInput(func) { 59 if (func !== ' '){ 60 var {nameInput,ageInput} = func; 61 if (window.localStorage) { 62 sessionStorage.setItem('name',nameInput); 63 sessionStorage.setItem('age',ageInput); 64 const name = sessionStorage.getItem('name'); 65 const age = sessionStorage.getItem('age'); 66 return { 67 name, 68 age 69 }; 70 } 71 } else { 72 return false; 73 } 74 } 75 //セッションに保存したら、画面を更新 76 function loadPage() { 77 document.location.reload(); 78 //console.log('hello'); 79 return true; 80 } 81 //保存したセッションがconfのそれぞれのliタグ内に表示 82 function rewrite(name,age) { 83 var savedFormData = saveInput(getFormInput()); 84 var {name, age} = savedFormData; 85 document.querySelector('.name').textContent = name; 86 document.querySelector('.age').textContent = age; 87 //この時、formは非表示、ulを表示する 88 var form = document.getElementById('a_form'); 89 var lists = document.getElementById('conf'); 90 form.style.display = 'none'; 91 lists.style.display = 'block'; 92 } 93 </script> 94</body> 95</html>

試したこと

document.location.reload();の箇所を、
代わりにconsole.log('hello');など適当なものに変更すると
ほかは思う通りの動きをするので、これが問題なんだろうなとは思うのですが...
解決策が思い浮かばず詰まってしまったため、投稿しました。

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

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

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

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

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

int32_t

2022/09/12 14:56

何のためにリロードしているのでしょうか。
miikan023

2022/09/12 15:00

セッションが保存された後、自動的にリロードし、liタグの内容を表示させたいためです。
int32_t

2022/09/12 15:04 編集

リロードなしで同じ結果の画面を作ったほうが簡単だと思いますが、リロードが必須なのですか?
miikan023

2022/09/12 15:09

はい、それは承知ですが.. リロードは必須の仕様にしたいです。 別のものを以前作成している時に同じような問題に直面し、 諦めたことがあるので、ヒントを得れたらなと思い投稿しました。
guest

回答1

0

location.reload() を行うともちろんリロードが発生するので、そのページは破棄されます。変数はすべて消えますし、location.reload() に続くコードがあっても無意味です。

リロード後に何かをしたいなら、DOMContentLoaded イベントなどで「sessionStorage に値が入っていたらそれを使って何かをする」というコードを書く必要があります。

投稿2022/09/12 15:22

int32_t

総合スコア20884

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

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

miikan023

2022/09/12 16:22

ですよね..location.reload() を行うと破棄されていることが原因だろうなとは思っていました。 DOMContentLoaded イベント等を用いた修正案を教えて頂きありがとうございます!! アドバイスの通り、コードの修正と確認をしてみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問