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

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

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

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

JavaScript

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

Q&A

解決済

1回答

3456閲覧

画面離脱時のモーダルをsubmit時うまく制御したい

k499778

総合スコア599

HTML5

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

JavaScript

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

0グッド

0クリップ

投稿2018/03/07 09:20

画面離脱時のモーダル表示の実装を行なっています。

jsで以下のように実装しました。

JavaScript

1<script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script> 2<script> 3$(function(){ 4 $("input[type=text]").change(function() { 5 $(window).on('beforeunload', function() { 6 return '投稿が完了していません。このまま移動しますか?'; 7 }); 8 }); 9 $("input[type=submit]").click(function() { 10 $(window).off('beforeunload'); 11 }); 12}); 13</script> 14<form method="post" action="foo.cgi"> 15<input type="text" value="" /> 16<input type="submit" value="送信" /> 17</form>

submit時にはモーダルを表示しないようにoffメソッドでイベントハンドラを取り除いています。

しかしここで問題があります。
質問としては、
submitボタン押下時に
・バリデーションエラー
・モーダルのこのページにとどまる押下
をされた場合、どのようにoffしないようにすればいいでしょうか?あるいは、再設定すればいいでしょうか?

というのも、offで一度イベントハンドラを削除されるので、次にページ遷移したときにモーダルが表示されません。
「画面遷移する寸前にイベントハンドラ削除」みたいなことをしようと思い、pagehideイベントを使おうとしましたが、
そのイベントは発生しませんでした。
windowにpagehideをonした形です。

こういう時の対応方法がわかる方がいればよろしくお願い致します。

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

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

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

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

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

guest

回答1

0

ベストアンサー

僕なら、バリデーションエラーを判定して

あるいは、再設定すればいいでしょうか?

でいきますね。

他には、submitをajaxにしてもやりやすいと思いますが、現状のロジックをサーバーサイド含めていろいろ変更しなければいけないでしょうから、変更するのはめんどくさそうですね。

投稿2018/03/07 09:34

h_daido

総合スコア824

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

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

k499778

2018/03/07 09:40 編集

回答ありがとうございます。 バリデーションエラーに関しては、jsでバリデーションチェックしてる、後にロジック入れればなんとかなる気はしますが(共通化を図るため少し不安)、画面離脱モーダル立ち上がって、「このページにとどまる」にした場合はどうすればいいでしょうか?イベントハンドラが削除されているため、次はモーダルが立ち上がりません。
h_daido

2018/03/07 09:52

具体的なケースとしては、 1. テキスト変更 2. 離脱 3. 画面離脱モーダルが立ち上がる -> 「とどまる」を選択 4. 再度離脱 というケースということであってます? であればまだoffされていないはずですので、問題なさそうですが。。。
k499778

2018/03/07 18:36

返答ありがとうございます。penまで作っていただき。 あーそうですね。勘違いしていました。 submitボタン押下時はそもそもモーダルが立ち上がらないので、そのようなケースは起こり得ないですね。 やはりバリデーションエラーだけを乗り越えられれば、このような実装でいけそうですね。
k499778

2018/03/07 18:43

ちなみにバリデーションエラー後にoffを入れる上で懸念していることがあるのですが、 jQuery Validation(jquery.validate.min.js)を使っており、「バリデーションエラーがあれば」の条件を確実にバリデーションの後にできるのか不安です。jQuery Validationが少し変な動きをしており、ひょっとすると非同期処理を中で行っているかもしれないので。 そういった場合、読み込み順が確実にoffの方が後にする方法ってありますでしょうか?
h_daido

2018/03/08 01:39

基本的にフローとしては以下になるとおもいます 0. テキスト変更 -> onにする 1. submit -> offにする 2. もしsubmitが失敗していれば(= バリデーションにかかっていれば)、再度bindする。(* このときにはテキスト変更がなくてもonにする) あとは前提としてですが、バリデーションをフロントエンドのみで行うのは危険だと思います。 フロントエンドバリデーションはユーザビリティの向上のみを目的とし、入力値が正しいことの検証はサーバーサイドで行わないと、セキュリティホールにもなりますし、思わぬバグも呼び込んでしまいます。 ですので、「バリデーションエラーがあれば」の判定はsubmitの結果で判定するほうが良いかと思います。 具体的な方法はsubmitした結果のレスポンスがどのようになるか?次第ではありますが、サーバーサイド側の人と相談してみても良いのではないでしょうか?エラーメッセージなどを表示しているでしょうから、方法は絶対あるはずと思います。
k499778

2018/03/09 20:49

回答ありがとうございます。 サーバー側のバリデーションも入れています。 サーバー側でバリデーションがあった場合は、画面リロードされるのでonした状態になっているので問題ありません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問