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

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

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

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

JavaScript

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

Struts

StrutsはJava向けのWebアプリケーションフレームです。MVCモデルに基づいており、JSPやJavaサーブレットを組み合わせ、アプリケーション構築時に使用する各機能を提供しています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

WebGL

WebGL(ウェブジーエル)は、ウェブブラウザで 3次元コンピュータグラフィックスを表示させるための標準仕様です。

Q&A

4回答

11702閲覧

JavaScriptにて初回起動時と現在のform(画面項目)の値の比較

nandemoiii

総合スコア14

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

JavaScript

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

Struts

StrutsはJava向けのWebアプリケーションフレームです。MVCモデルに基づいており、JSPやJavaサーブレットを組み合わせ、アプリケーション構築時に使用する各機能を提供しています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

WebGL

WebGL(ウェブジーエル)は、ウェブブラウザで 3次元コンピュータグラフィックスを表示させるための標準仕様です。

0グッド

0クリップ

投稿2016/06/09 15:17

javascriptについて質問があります。
初回起動時のform(画面項目)の値と現在の値を比較して1つでも変更があった場合にはポップアップを表示するといった処理を実装したいのですが何か良い方法

があれば、ご教授お願い致します。

はじめはその項目のvalueとdefaultValueにて比較できると思いましたが、defaultValueは画面を再描画するタイミングで取得しますが、行いたい処理の途中でアクションが走り必ず再描画されるタイミングがあるためその方法では比較できないことに気づきました。(また項目の入力チェックなのでエラーになった場合にも)

なので再描画されても、初期表示時の値と現在の値を比較する方法はないでしょうか…

ちなみに画面はJSPにて実装しており、項目はtextやradioやoptionなどあります。

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

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

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

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

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

guest

回答4

0

様々方法は有ると思いますが、LocalStorage に入れておいて、ロード時に内容を確認するという手段があります。これであればたとえ不意な再描画でもデータを保持できます。ただ、フォーム送信後にデータを消しておかないと比較に失敗する原因になるのでご注意ください。

【フォームの内容をLocalStorage(SessionStorage)にJSONで保存・復旧する - Qiita】
http://qiita.com/nbnb/items/b44810b7ccffcdfa8ac7

【LocalStorageをもっとデータベースライクに使う方法 - Qiita】
http://qiita.com/masamitsu-konya/items/ce7f6469434076448238

投稿2016/06/09 15:54

kei344

総合スコア69407

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

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

nandemoiii

2016/06/09 16:21

回答ありがとうございました。 まだプログラマーとしてはかけだしなので...LocalStorageよりもう少し簡単な方法などはないでしょうか...? 申し訳ありません。
kei344

2016/06/09 16:30

「 JavaScriptにて」というタイトルだったのでそれでしたいのかな、と思っていたのですが、そうではないのですね。 「初回起動時のform(画面項目)の値」が以前のユーザー入力値 「現在の値」フォームの送信時のユーザー入力値 「行いたい処理の途中でアクションが走り必ず再描画されるタイミング」ステップ式のフォーム ということでしょうか。 それであれば JavaScript を使わずにフォームの再描画時に <input type="hidden"> を項目の数だけ入れて、JSP側でチェックするというのも手です。 「行いたい処理の途中でアクションが走り必ず再描画されるタイミング」というか全体のフローがもう少し具体的になれば回答もしやすいです。
kei344

2016/06/09 16:53

ちなみにクッキーに格納する方法はお勧めできません。あまりにも容量が小さいため少しのテキストしか保存できません。 【最新ブラウザのクッキーの制限(数,サイズ)を調べてみた - ITコンサルタント成長録】 http://d.hatena.ne.jp/hosikiti/20120720/1342750879
nandemoiii

2016/06/09 17:09

回答ありがとうございます。 具体的にやりたい処理を下記に記載していきますね。 ------------------------------------------------------------ 画面A、画面Bがあるとします。 画面Aから画面Bに遷移し、画面Bから戻るボタンで画面Aに遷移できる仕様です。 画面Bから戻るボタンで画面Aに遷移する際に、画面Aから遷移し表示したform(画面)の内容と1つでもformの値(テキストボックス・ラジオ・ドロップダウン)の内容が変更してあればポップアップを表示したいです。 はじめはjavascriptにてvalueとdefaultValuを使用して初期表示時の値と現在の値を比較できると思ったのですが、その項目の中にファイルアップロードがあり画像削除ボタン押下した際にはDBに登録されているファイル名とファイルパスをnullで更新する処理になっております。この際に画像削除がエラーなく成功した場合はアクションが走り自画面にフォアードします。アクションが走るということは画面を再読み込みするのでformの内容が上書きされていまし、初期表示のformの内容ではなくなって比較することができなくなってしまいます。(項目の入力チェックにてエラーメッセージを表示する際もアクションが走り画面が再読み込みされます) なので画面が再読み込みされても、画面Aから画面Bに遷移したformの状態をずっと保持しておく方法はないでしょうかね? 長々とした文章で申し訳ありませんが、わかる範囲でよろしいのでご教授ください。
kei344

2016/06/09 17:18

「画面A」が入力フォーム、「画面B」が確認及び編集フォームという感じでしょうか。 それであれば、「画面B」の描画時に「画面A」の入力内容全てを<input type="hidden">で埋め込み、その値と表示されているフォーム(@画面B)の内容を比較されてはいかがでしょうか。(入力チェックや画像の再描画時にもhiddenの項目を正しく入れる必要がありますが)
kei344

2016/06/09 17:23

[A] <form method="post" action="to_B"> <input type="text" name="my_text1"> <input type="text" name="my_text2"> </form> ↓POST通信 [B] <form method="post" action="to_B"> <input type="hidden" name="hidden_my_text1" value="aaaa"><!-- サーバ側で入力 --> <input type="hidden" name="hidden_my_text2" value="bbbb"><!-- 〃 --> <input type="text" name="my_text1" value="aaaa"><!-- 〃 --> <input type="text" name="my_text2" value="bbbb"><!-- 〃 --> </form> として、hidden_my_text1とmy_text1のvalueを比較すればよいと思います。
nandemoiii

2016/06/09 17:44

すいません、画面Aが登録されている情報を確認する画面です。参照だけだのですべての項目がリードオンリーです。そして画面Bが編集画面になります。画面Aの内容をもとにデータを取得します。また画面Bは新規モードもあり、その場合は全ての項目は空白の情報で初期表示します。
nandemoiii

2016/06/09 17:44

大変申し訳ありませんが、上記の回答をもとに再度ご教授お願い致します…
kei344

2016/06/09 17:51

> 面Aの内容をもとにデータを取得します。 ではどちらにせよhiddenで埋め込むことは可能ですが、何が問題なのでしょうか。 <input type="hidden" name="hidden_my_text1" value="aaaa"><!-- サーバ側で入力 --> <input type="hidden" name="hidden_my_text2" value="bbbb"><!-- 〃 -->
nandemoiii

2016/06/09 17:57

プログラマー駆け出しなのでおこがましい質問ですが、hiddenで埋め込んだ値は画面更新時には上書きされず、hidden以外(textやradioやoption)などの項目は上書きされる認識であってますか? またformの項目すべてをhiddenに一括で保持しておく方法はありますでしょうか? 初歩的な質問ばかりで申し訳ありませんが、ご教授お願い致します。
kei344

2016/06/09 18:08

>hiddenで埋め込んだ値は画面更新時には上書きされず、hidden以外(textやradioやoption)などの項目は上書きされる認識であってますか? コードの書き方によります。 > hiddenに一括で保持しておく方法はありますでしょうか? いくつも有るとは思いますが、JavaScriptに慣れておられないならお勧めしません。
guest

0

ajaxで初期値をJSONで受け取るように最初から作っておいて
適宜比較すればよいのでは?

投稿2016/06/10 04:57

yambejp

総合スコア114839

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

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

0

画面描画後に入力フォーム内の入力項目に何らかの変更をしたこと(テキストボックスに何かを入力した、ラジオボタンを変更した、チェックボックスのON/OFFをした、など)を検知する仕組みとして JavaScriptのform.onchangeイベントがあります。

ただし"何らかの変更"ですので、結果的に変更前と同じ値であっても「変更した」と判定します。

もっと厳密な比較を実装する場合には、やはり画面出力後の値をすべて保管しておき、チェックしたいタイミングですべて比較することになるでしょうか。

お手軽に入力項目の変更を検知するので良ければ、form.onchangeが一番でしょうか。

参考サイト:
Ajax Tower|フォーム変更時の処理(onChange)

投稿2016/06/09 16:34

A-pZ

総合スコア12011

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

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

nandemoiii

2016/06/09 16:46

回答ありがとうございます。 画面出力後の値をすべて保持しておきとありましたが、値をセッションに格納しておこうと思っていました。しかし入力チェックなどでエラーになりエラーメッセージを画面に出力させる仕様なのでそうなるとアクションが走り、画面が再描画した際にセッションの値はリセットされてしまいます。なので何か画面が再描画しても値をそのまま保持しておく方法などはないでしょうか? 拙い文章で申し訳ありませんが、よろしくお願い致します。
guest

0

簡単なサンプルを作成しました。
こういう事ですかね・・・?

html

1<!DOCTYPE html> 2<html lang="ja"> 3<head> 4 <meta charset="utf8"> 5 <title>formの比較</title> 6</head> 7<body> 8<form id="form"> 9 <input type="text" value="あいうえお"> 10 <select> 11 <option value="aaa"></option> 12 <option value="bbb"></option> 13 <option value="ccc"></option> 14 </select> 15 <textarea>あいうえお</textarea> 16 <p id="checkBtn">フォームを確認</p> 17</form><!-- /#form --> 18 19<script src="https://code.jquery.com/jquery-2.1.4.min.js"></script> 20<script> 21var $item = $('#form').find('input,select,textarea'), 22 valArr = [], 23 checkChange = function() { 24 $item.each(function(e){ 25 if(valArr[e] != $(this).val()) 26 alert('値が変更されています'); 27 }); 28 }; 29 30$item.each(function(e){ 31 valArr[e] = $(this).val(); 32}); 33 34$('#checkBtn').click(checkChange); 35</script> 36</body> 37</html> 38

投稿2016/06/09 16:26

fuji_fe

総合スコア93

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

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

nandemoiii

2016/06/09 16:39

わざわざご丁寧にありがとうございます! そのサンプルで質問なのですが、valArrとありますがこれは宣言時はvar valArr = []と0の長さの配列を用意するという認識で合っていますか? またこの場合だとループしませんが配列の要素は取得できるのですか? 最後にこのロジックの場合に、項目の入力チェックであエラーになったりしアクションが走りformが再読み込みされてもformの項目の内容は画面遷移してきたときの初期表示時の値を保持しているのでしょうか? つたない文章で申し訳ありません
fuji_fe

2016/06/09 16:44

説明が少なく申し訳ございません。 以下、コメントをつけたソースです。 var $item = $('#form').find('input,select,textarea'),//対象のDOMをjQueryオブジェクトに変更 valArr = [],//比較するための空の配列を用意 checkChange = function() {//現在の状態と比較する関数 $item.each(function(e){ if(valArr[e] != $(this).val()) alert('値が変更されています'); }); }; //この処理で初期描画の値を配列に入れています $item.each(function(e){ valArr[e] = $(this).val(); }); //alert(valArr);で配列の内容確認できます //ボタンクリックでcheckChangeを実行 $('#checkBtn').click(checkChange);
fuji_fe

2016/06/09 16:48 編集

>最後にこのロジックの場合に、項目の入力チェックであエラーになったりしアクションが走りformが再読み込みされてもformの項目の内容は画面遷移してきたときの初期表示時の値を保持しているのでしょうか? formの再読み込みをどのように行っているか存じ上げませんが この処理では項目の内容を変更する処理はしていません。 「ブラウザが更新された時の初期値」 と 「現在の値」 を比較しています。
nandemoiii

2016/06/09 16:51

この配列には初期表示時の値が格納されているとのことでしたが、この配列の中身は今後アクションが走りformを再読み込みした場合でも保持されているのでしょうか? はじめはセッションに格納しておこうと思いましたが、セッションはformを再読み込みしたら消えてしまうものなのでセッションで保持するのは無理だなと思いました。
fuji_fe

2016/06/09 16:55

この処理が実行された段階で描画されているものが格納されています。 「formを再読み込みした場合でも」 この処理でブラウザを更新する場合は更新した時の初期表示が格納され、 formのみが変更される場合は、ページを一番最初に読み込んだ時の値が残っています。
fuji_fe

2016/06/09 16:57

また、formの更新でDOMを再描画する場合は$itemが使えなくなります。 その場合は関数内で毎度DOMを取得する必要があります。 checkChange = function() { $('#form').find('input,select,textarea').each(function(e){...
nandemoiii

2016/06/09 17:16

回答ありがとうございます。 具体的にやりたい処理を下記に記載していきますね。 ------------------------------------------------------------ 画面A、画面Bがあるとします。 画面Aから画面Bに遷移し、画面Bから戻るボタンで画面Aに遷移できる仕様です。 画面Bから戻るボタンで画面Aに遷移する際に、画面Aから遷移し表示したform(画面)の内容と1つでもformの値(テキストボックス・ラジオ・ドロップダウン)の内容が変更してあればポップアップを表示したいです。 はじめはjavascriptにてvalueとdefaultValuを使用して初期表示時の値と現在の値を比較できると思ったのですが、その項目の中にファイルアップロードがあり画像削除ボタン押下した際にはDBに登録されているファイル名とファイルパスをnullで更新する処理になっております。この際に画像削除がエラーなく成功した場合はアクションが走り自画面にフォアードします。アクションが走るということは画面を再読み込みするのでformの内容が上書きされていまし、初期表示のformの内容ではなくなって比較することができなくなってしまいます。(項目の入力チェックにてエラーメッセージを表示する際もアクションが走り画面が再読み込みされます) なので画面が再読み込みされても、画面Aから画面Bに遷移したformの状態をずっと保持しておく方法はないでしょうかね? またformの再読み込みはHTML(JSP)を構築しなおしている で伝わりますでしょうか? なのでjavascriptももう一度呼ばれます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問