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

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

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

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

jQuery

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

Q&A

解決済

2回答

4026閲覧

ページ離脱時の確認用のJavascriptが、IEとChrome、FFで挙動が異なる

imonikai

総合スコア13

JavaScript

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

jQuery

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

0グッド

0クリップ

投稿2019/02/21 09:36

JSを使用して、ページ離脱時の確認を作成(といってもコピペですが…)しました。
下記のソースのように、submitボタンについては、JSにて行っております。

問題としては、IEとChromeではページ離脱確認JSの挙動が異なっており困っております。

Chromeでは意図した通りの挙動で
1)画面初期表示
2)テキストエリアに文字入力
3)一時保存、確定(name="btn_regist")押下以外でページを離脱する
4)確認ダイアログの表示

または、
11)画面初期表示
12)テキストエリアに文字入力
13)一時保存、確定(name="btn_regist")押下でページを離脱する
14)確認ダイアログは非表示で、通常登録

になります。

IEは
1)画面初期表示
2)テキストエリアに文字入力
3)一時保存、確定(name="btn_regist")押下以外でページを離脱する
4)確認ダイアログの表示

または、
11)画面初期表示
12)テキストエリアに文字入力
13)一時保存、確定(name="btn_regist")押下でページを離脱する
14)確認ダイアログが表示
と14)のようにダイアログが表示されてしまっています。

alertを入れて追ってみたのですが、
chromeでは、一時保存、確定(name="btn_regist")押下には、
1番目:(3)を通る
2番目:(1)を通るが、changeFlgがfalseなので動作しない
と動いている要で鵜sが、
IEでは、一時保存、確定(name="btn_regist")押下には、
1番目:(1)を通る
2番目:(1)のフラグがtrueなのでダイアログ表示
3番目:(3)を通る

IEとChromeでの挙動が異なっているようです。

IEでもChromeと同じ挙動をさせる方法がありましたら
ご教授お願いできますでしょうか。

よろしくお願いいたします。

P。S.
FireFoxでも正常(?)通りの挙動になっております。

javascript

1 2//-------------------- 3// ページ離脱時確認用 4//-------------------- 5$(function(){ 6 7 changeFlg = false; 8 9 //(1) 10 $(window).on('beforeunload', function() { 11 if (changeFlg) { 12 return "ページを移動しようとしています。\n入力した内容が失われますがよろしいですか?"; 13 } 14 }); 15 16 //(2) 17 $("form input, form textarea, form select").change(function() { 18 changeFlg = true; 19 }); 20 21 //(3) 22 $("button[name=btn_regist]").click(function() { 23 changeFlg = false; 24 }); 25 26}); 27 28 29//-------------------- 30// submit時(仮登録・本登録)のボタンの挙動 31//-------------------- 32function submitAction(url, section) 33{ 34 $('form').attr('action', url); 35 $('form').submit(); 36}

HTML

1<form action method="post"> 2 <div id="user-button"> 3 <button class="buttonC" type="button" onclick="location.href='~'">戻る</button> 4 <button class="buttonC" type="button" name="btn_regist" value="一時" onclick="submitAction('~,~')">一時保存</button> 5 <button class="buttonC" type="button" name="btn_regist" value="確定" onclick="submitAction('~,~')">確定</button> 6 </div> 7</form>

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

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

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

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

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

guest

回答2

0

ベストアンサー

問題は IE で onclick が先に実行されることにあります。
属性で指定するのをやめて、jQueryでまとめてすれば実行順を考慮しなくて済みます。

jQuery

1 $('button[name="btn_regist"]').click(function() { 2 changeFlg = false; 3 switch(this.value) { 4 case '一時': 5 submitAction(); 6 break; 7 case '確定': 8 submitAction(); 9 break; 10 } 11 });

投稿2019/02/22 05:05

x_x

総合スコア13749

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

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

imonikai

2019/02/27 01:54

返信遅れて申し訳ありません onclickをやめ、参考のjqueryを基に作成した所、 想定の動作をIE、Chrome、FFで得ることができました。 今後は、onclickとjqueryを同居させずに作成していきたいと思います。 ありがとうございました。
guest

0

これと同じ現象ですかね?
IEでonbeforeunloadを使ったときの挙動

まずはこのページの1と同じ、 onclick="submitAction('~,~');return false"で
やってみればどうでしょうか?

P.S 解決できたと思います。こういう方法でいかがでしょうか? ---

フラグを操っているのはchange及びclickイベントなので、このイベントそれぞれにフラグを分岐し、同じbeforeunloadがイベント化された関数をコールすれば大丈夫です。そして、分岐で片方にはエラーメッセージ、片方にはreturn falseとします。

jQuery

1 2$(function(){ 3 4 var changeFlg; 5 6 //(1) 7 unload = function(changeFlg){ 8 $(window).on('beforeunload', function() { 9 if (changeFlg) { 10 return "ページを移動しようとしています。\n入力した内容が失われますがよろしいですか?"; 11 } 12 return false; 13 }); 14 } 15 16 //(2) 17 $("form textarea, form select").change(function(event) { 18 changeFlg = false; 19 unload(changeFlg); 20 }); 21 22 //(3) 23 $("button[name=btn_regist]").click(function(event) { 24 changeFlg = true; 25 unload(changeFlg); 26 }); 27 28}); 29

投稿2019/02/21 10:05

編集2019/02/22 05:10
FKM

総合スコア3624

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

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

imonikai

2019/02/22 04:21

ご回答ありがとうございます。 ご指摘の通り、return falseを入れてみたのですがやはりIEでの挙動は変わらずでした。 試しにsubmitActionメソッドの内部にもreturn falseしてみたのですが同様の動きでした。 参考URLですが、これに似た現象だとは思います。 挙動がどうなるかわかりませんが、 changeFlg の変数をグローバルにして、 submitAction()メソッド内でfalseにして 対応してみようかと思います (jsの仕様というか作法として良いのかわかりませんが…) ご回答ありがとうございました
FKM

2019/02/22 05:09

解決策載せましたので、ご参照ください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問