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

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

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

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

jQuery

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

Q&A

解決済

2回答

846閲覧

バックブラウザで離脱するユーザーに他のページを表示させたい

kana0701

総合スコア28

JavaScript

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

jQuery

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

0グッド

1クリップ

投稿2019/06/18 04:03

編集2019/07/12 02:45

前提・実現したいこと

javascript,jQery初心者です。
バックブラウザしようとしたらモーダルを表示させ、<i>を押したら前のページに戻る仕組みを
作りたいと思っています。

発生している問題・エラーメッセージ

バックブラウザをしたらポップアップは表示させるところまでは完成したのですが、
<i>ボタンを押しても前のページに戻ることができません。
なので永遠にそのページから離脱することができなくなってしまいました、、、

該当のソースコード

javascript

1<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script> 2 3 <script> 4 $(function(){ 5 history.pushState(null, null, null); 6 $(window).on("popstate", function (event) { 7 history.pushState(null, null, null); 8 $('.modal-wrapper').fadeIn(); 9 }); 10 }); 11 </script>

CSS

1/*モーダル*/ 2.modal-wrapper{ 3 display: none; 4 position: fixed; 5 top: 0; 6 right: 0; 7 bottom: 0; 8 left: 0; 9 background-color: rgba(0, 0, 0, 0.6); 10 z-index: 100; 11} 12 13.modal { 14 position: absolute; 15 top: 20%; 16 left: 10%; 17 background-color: #e6ecf0; 18 padding: 40px 0 40px; 19 border-radius: 10px; 20 width: 80%; 21 height: auto; 22 text-align: center; 23} 24#image{ 25 width:100%; 26} 27 28.fa-times-circle-o { 29 position: absolute; 30 top: 12px; 31 right: 12px; 32 color: rgba(128, 128, 128, 0.46); 33 cursor: pointer; 34 font-size: 30px; 35} 36 37

HTML

1 <div class="modal-wrapper""> 2 <div class="modal"> 3 <div class="close-modal"> 4 <a href="javascript:history.back()"> 5 <i class="fa fa-times-circle-o" aria-hidden="true"></i> 6 </a> 7 </div> 8 <div id="ridatu-form"> 9 <a href="###"><img src="image.jpg" id="image" style="display:block;"></a> 10 </div> 11 </div> 12 </div>

試したこと

①はじめはjavascriptで一つ前の履歴を取得するような書き方をしていたのですが反映されず、
②HTMLのaタグで<i>に一つ前の履歴を取得すという記述の仕方にしてみました。

ですが
<i>を押しても何も起こらない
<i>を押すとモーダルの表示が消えまた表示される

補足情報(FW/ツールのバージョンなど)

バックブラウザを無効化しているからいけないのでしょうか、、、?

勉強中のため根本的にわかっていないところがあるかもしれません。
なにかヒントやアドバイスを頂けたら幸いです。
よろしくお願いいたします!

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

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

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

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

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

guest

回答2

0

history.back()するだけではだめなのでしょうか?

投稿2019/06/18 04:29

yambejp

総合スコア114814

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

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

kana0701

2019/06/18 04:56 編集

バックブラウザしたときにポップアップを表示させたくて、 HTML内にhistory.back()を入れてみたのですが、作動しないのです。 テキストでの説明だとわかりずらいと思い画像追加いたしました! 目的としては離脱しようとしたユーザーに対して他のページの案内もしたくて このようにかんがえてみました!
guest

0

ベストアンサー

戻るボタンを押した時と同じく、history.back()する時にもpopstateが発火するため、戻る動作をブロックするコードhistory.pushStateが実行されているのが原因です。

イベントについてもう少し掘り下げてみましょう。
ブラウザの戻るボタンを押した時、popstateイベントが発生します。history.pushStateにより、空の履歴が追加されるため、ページは戻らず、モーダルを表示しています。ここまでは想定通りだと思います。
しかし、表示したモーダルの中のIタグで、history.back()をする時にも、popstateイベントが発生します。発生したイベントにより、さらにもう一度空の履歴が追加され、ページは戻りません。こうして無限ループに陥ります。

この問題を解決するにはいくつか方法がありますが、一番手っ取り早い方法はIタグのhistory.back()history.go(-2)に変更することです。この変更により、history.pushStateによって追加された空の履歴の一つ前にジャンプすることができます。

EDIT ソースコードの追記場所
$(function(){})の内部であれば、基本的にどこでも構いません。

js

1 $(function(){ 2   // ここか // 3 history.pushState(null, null, null); 4 $(window).on("popstate", function (event) { 5 history.pushState(null, null, null); 6 $('.modal-wrapper').fadeIn(); 7 }); 8 // ここに記述 // 9 });

基本的に、Head内にソースを書いたJavaScriptはHTMLの描写より早く行われます。JavaScriptの中にHTMLの要素を呼び出すコードを記入する際、この順番を意識しなければいけません。なぜなら、HTMLの描写がされていない場合、.close-modalという要素は存在しないからです。

jQueryでは、$()の中にコードを渡すと、そのコードはHTMLの描写が完了した後に呼び出されます。

ちなみに、発展的な内容ですがjQueryを使わずともHTMLの描写が終わった時に呼び出すこともできます。

js

1// document.addEventListener(XX, YY) 2// ページにXXというイベントが発生した時にYYという関数を実行します 3document.addEventListener('DOMContentLoaded', function (event) { 4 // ここに記述 // 5})

XXには様々なものを入れることができます。これはjQuery.on()の中に入れるものと同じで、clickだとかchangeだとかも入れることができます。

JavaScriptではイベントという概念が重要になってきますので、ぜひ勉強してみてください。

投稿2019/06/29 12:28

編集2019/06/29 16:41
kznr.luk

総合スコア27

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

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

kana0701

2019/06/29 14:21

はじめまして! わかりやすい説明ありがとうございます! おっしゃってくださった通りHTMLに記述したところ無事前のページに戻ることができました。 もしよろしければもう一つ質問させていただきたいのですが、 これをjs内に書くにはどうしたらよいのでしょうか? 該当のソースコードの一番下に下記の記述を追加してみたのですが反映されず、、、 できたらjs内に記述したいと思っています。 $('.close-modal').click(function() { history.go(-2); });
kana0701

2019/07/12 02:48

遅くなり申し訳ございません。 とても分かりやすい回答ありがとうございます! これからもっと勉強していきたいと思います!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問