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

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

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

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

jQuery

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

Q&A

解決済

2回答

3629閲覧

beforeunloadで、ページ離脱時に出てくるブラウザのダイアログを非表示にしたい

suminoel

総合スコア80

JavaScript

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

jQuery

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

1グッド

2クリップ

投稿2018/10/12 03:15

編集2018/10/12 03:51

現在、サイト離脱時にバナーを表示したく、jQueryで下記のようなコードを組んでいます。

jQuery

1jQuery(function($){ 2 var flg = false; 3 var scrollTop; 4 5 $(document).on('click', 'a', function(){ 6 flg = true; 7 }); 8 9 // ページ離脱時にバナーを表示 10 $(window).on("beforeunload", function(e){ 11 12 // flgがtrueのときは、サイト内にあるリンクなので何もしない 13 if( flg === true ) { 14 flg = false;// flgをfalseに戻しておく 15 } else { 16 var $this = $('.leave-bnr-area'); 17 var width = $(window).width(); 18 var high = $(window).height(); 19 20 $this.css('min-height', high + 'px'); 21 22 scrollTop = $(window).scrollTop();// モーダルが開いたときのポジションを記録 23 $('.leave-bnr-area .leave-bnr-wrap a').css({ 24 'top' : ( high - 250 ) / 2, 25 'left' : ( width - 300 ) / 2, 26 }); 27 $this.addClass('lb-open'); 28 $this.animate({opacity: 'show'}); 29 $('body').addClass('noscroll').css('top', -scrollTop);// スクロールを固定 30 31 e.preventDefault(); 32 33 return false; 34 } 35 }); 36 37 // モーダルの背景をクリックしたら、モーダルを閉じる 38 $('.leave-bnr-bg').on('click touchstart', function() { 39 $('.leave-bnr-area').removeClass('lb-open'); 40 $('.leave-bnr-area').animate({opacity: 'hide'}); 41 $('body').removeClass('noscroll').css({ 'top' : 0 });// 現在のスクロール位置から、0に戻す 42 window.scrollTo( 0, scrollTop );// モーダルを閉じたときに記録した場所までスクロールする 43 }); 44});

HTML

1<div class="leave-bnr-area"> 2 <div class="leave-bnr-bg"></div> 3 4 <div class="leave-bnr-wrap"> 5 <a href="#"><img src="./js/banner.png"></a> 6 </div> 7</div>

CSS

1body.noscroll { 2 overflow: hidden; 3 position: fixed !important; 4 width: 100%; 5} 6.leave-bnr-area { 7 display: none; 8 position: absolute; 9 top: 0; 10 width: 100%; 11 height: 100%; 12 z-index: 99999; 13} 14.leave-bnr-area.lb-open { 15 display: block; 16} 17.leave-bnr-area .leave-bnr-bg { 18 position: absolute; 19 left: 0; 20 top: 0; 21 width: 100%; 22 height: 100%; 23 background-color: rgba(0, 0, 0, 0.85); 24} 25.leave-bnr-area .leave-bnr-wrap { 26 text-align: center; 27 position: relative; 28} 29.leave-bnr-area .leave-bnr-wrap a { 30 position: fixed; 31 margin: auto; 32 display: inline-block; 33}

これで、サイト離脱時にモーダルウインドウでバナーが表示されるようになりました。
ですが、バナーが表示される前に、Chromeでは「このサイトを離れてもよろしいですか?」というダイアログを表示されてしまいます。

こちらを非表示に(スキップ)して、バナーを表示させたいのですが、ブラウザの挙動のようなので、そもそもそれが可能なのかどうかもわからず…
もし可能なのでしたら、その方法もご教示いただけますと幸いです。

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

x_x👍を押しています

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

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

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

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

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

guest

回答2

0

自己解決

自己解決しました。
色々調べてみましたが、やはりbeforeunloadでのダイアログ削除は不可能なようです。

なので、そもそもの仕様確認と、コードの見直しをしました。
仕様としては離脱時にバナーを表示する、というもので、サイト内遷移や、外部リンククリック時はバナー表示をさせなくてもよいということでしたので、beforeunloadを使わない方法があると気付きました。

サイト内遷移や外部リンククリック以外の離脱ということは、お気に入りや、ホームボタンなど、ブラウザバーにマウスカーソルが移動したとき、つまりbody要素からマウスアウトした場合にのみ表示させればOKでした。

そして、何度もバナーが表示されるのは、ただただ鬱陶しいだけなので、一度だけ表示させるように変更しました。
以下、コードです。

jQuery

1jQuery(function($){ 2 var flg = false; 3 var scrollTop; 4 5 $(document).on('click', 'a', function(){ 6 flg = true; 7 }); 8 9 // ページ離脱時にバナーを表示 10 $('body').one('mouseleave', function(e){// ←変更した箇所(ここだけです) 11 12 // flgがtrueのときは、サイト内にあるリンクなので何もしない 13 if( flg === true ) { 14 flg = false;// flgをfalseに戻しておく 15 } else { 16 var $this = $('.leave-bnr-area'); 17 var width = $(window).width(); 18 var high = $(window).height(); 19 20 $this.css('min-height', high + 'px'); 21 22 scrollTop = $(window).scrollTop();// モーダルが開いたときのポジションを記録 23 $('.leave-bnr-area .leave-bnr-wrap a').css({ 24 'top' : ( high - 250 ) / 2, 25 'left' : ( width - 300 ) / 2, 26 }); 27 $this.addClass('lb-open'); 28 $this.animate({opacity: 'show'}); 29 $('body').addClass('noscroll').css('top', -scrollTop);// スクロールを固定 30 } 31 }); 32 33 // モーダルの背景をクリックしたら、モーダルを閉じる 34 $('.leave-bnr-bg').on('click touchstart', function() { 35 $('.leave-bnr-area').removeClass('lb-open'); 36 $('.leave-bnr-area').animate({opacity: 'hide'}); 37 $('body').removeClass('noscroll').css({ 'top' : 0 });// 現在のスクロール位置から、0に戻す 38 window.scrollTo( 0, scrollTop );// モーダルを閉じたときに記録した場所までスクロールする 39 }); 40});

mouseoutだと子要素を判別できず、常にバナーが表示されてしまうため、mouseleaveを使って解決しました。
ありがとうございました。

投稿2018/10/13 11:45

suminoel

総合スコア80

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

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

0

私も過去に同じようにブラウザの出すダイアログを消したいとの要件があり色々と調べましたが、これについては制御のしようが無かったと記憶しています。

何かしらやり方があるのか、気になりますね。

投稿2018/10/12 05:10

SE-studying-now

総合スコア351

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

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

suminoel

2018/10/13 11:36

ご回答ありがとうございます。 仰る通り、beforeunloadでのダイアログ削除はできないみたいですね。 別の方法で解決しましたので、自己解決方法をご参照いただければと思います。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問