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

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

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

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

Q&A

2回答

444閲覧

別のページから遷移してアクセスした際にモーダルが開かない

alpaca-no

総合スコア0

JavaScript

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

0グッド

3クリップ

投稿2024/08/16 06:59

編集2024/08/16 07:02

実現したいこと

1.ページにアクセスした場合に、モーダルダイアログでポップアップを表示したい
2.かつ、該当ページへのアクセスは同サイト内のリンクからである(トップページではない)

下記は挙動確認済です

・該当ページのURLをブラウザに打ち込んで直接アクセスした場合
・(上記と意味的には同じですが)該当ページへのリンクを"別ページ/ウィンドウ/タブで開いた場合"

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

同じタブ内(ウィンドウ内)リンクでアクセスした場合、ポップアップの表示がされません。

該当のソースコード

HTML

1<div class="bg_onetime_popup"> 2 <div class="onetime_popup"> 3 <div class="onetime_popup_title"> 4 <!--<span class="onetime_popup_title_close"></span>--> 5 <span style="font-size:3rem;"><i class="fas fa-exclamation-circle"></i></span><br>ご注意ください 6 </div> 7 <div class="onetime_popup_content"> 8 <p>記入漏れ・記入間違いが増えています。</p> 9 <label class="onetime_popup_title_close">確認しました</label> 10 </div> 11 </div> 12</div> 13

CSS

1body.open_popup { 2 overflow: hidden; 3} 4 5.bg_onetime_popup { 6 position: fixed; 7 top: 0px; 8 left: 0px; 9 z-index: 9999; 10 width: 100vw; 11 height: 100vh; 12 background-color: rgba(0, 0, 0, 0.7); 13 opacity: 0; 14 visibility: hidden; 15 transition: 0.5s; 16} 17 18body.open_popup .bg_onetime_popup { 19 opacity: 1; 20 visibility: visible; 21} 22 23.onetime_popup { 24 position: absolute; 25 top: 50%; 26 left: 50%; 27 transform: translateX(-50%) translateY(-50%); 28 width: 40%; 29 background-color: #F5F5F5; 30 border-radius: 5px; 31} 32 33.onetime_popup_title { 34 position: relative; 35 padding-top: 0.8em; 36 margin: 0px; 37 color: #5D653B; 38 font-size: 1rem; 39 text-align: center; 40 line-height: 1.5; 41 font-weight: bold; 42} 43 44 45.onetime_popup_title_close { 46 position: relative; 47 display: inline-block; 48 background: #A5AF7E; 49 color: #fff; 50 border-radius: 0px 0px 5px 5px; 51 cursor: pointer; 52 left: 50%; 53 transform: translateX(-50%); 54 font-size: 0.8rem; 55 line-height: 3rem; 56 width: 100%; 57 text-align: center; 58 font-weight: bold; 59} 60 61.onetime_popup_content { 62 text-align: left; 63 color: #000; 64} 65 66.onetime_popup_content p { 67 font-size: 0.8rem; 68 line-height: 1.7; 69 padding: 20px; 70}

JavaScript

1window.addEventListener('load', function() { 2 if(!sessionStorage.getItem('disp_popup')) { 3 sessionStorage.setItem('disp_popup', 'on'); 4 const body = document.querySelector('body'); 5 const bgPopup = document.querySelector('.bg_onetime_popup'); 6 const popup = document.querySelector('.onetime_popup'); 7 const popupTitleClose = document.querySelector('.onetime_popup_title_close'); 8 body.classList.add('open_popup'); 9 10 bgPopup.addEventListener('click', function() { 11 closePopup(); 12 }); 13 popup.addEventListener('click', function(e) { 14 e.stopPropagation(); 15 }); 16 popupTitleClose.addEventListener('click', function() { 17 closePopup(); 18 }); 19 20 function closePopup() { 21 body.classList.remove('open_popup'); 22 } 23 } 24}, false);

試したこと

javascriptに関しては全くの無知なのでお手上げ状態です。
なぜ新規ウィンドウで開いた(or直接アクセスした場合)のみ問題なくポップアップが表示されるのかの理由も全くわからないです。
直接アクセスでの挙動が確認できていること・デザインの崩れ等はないことから、html・CSSではなくjavascriptになにか要因があるのではと考えています。

いっそのこと他サイトのテンプレートを参考に差し替えようと探したのですが、
大体のモーダルポップアップのテンプレートが「ボタンを押した場合に表示」等のもので、表示条件が異なる為それも出来かねている状態です。

お手数をおかけしますが、ご教示よろしくお願いいたします。

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

・該当のページへのリンクをtarget="_blank"にするのは運用上非現実的なのでそれは避けたいと思っています。
・現在、該当リンクのtarget指定はありません。

こちら(https://migi.me/javascript/popup-modal-window-only-once/)のサイトを参考にさせていただいています。
※ほぼコピペになります。

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

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

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

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

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

guest

回答2

0

sessionStorage を使用しているのは、参考サイトの「ページを訪問する度に一度だけポップアップ表示したい」サンプルなので

『同じタブ内(ウィンドウ内)リンクでアクセスした場合』というのが、タブを開いてから1度でもsessionStorage.setItem('disp_popup', xxx)した状態(例えば既に同一タブで一度だけポップアップを表示済み)でのアクセスであれば
sessionStorageの仕様通り&サンプルコードの意図通り……ということになります。

もしこの挙動(一度だけ)が質問者さんの要求と異なるのであれば、サンプルコードから改変が必要になります。

そうではなく「要求通りではあるが、同一タブ内で初回アクセスにもかかわらず一度もポップアップが表示されない」であれば
例えば該当ページ以外でもsessionStorage.setItem('disp_popup', xxx)している…など、質問で挙げられたコード以外に別の要因があるかもしれません。


参考
https://developer.mozilla.org/ja/docs/Web/API/Window/sessionStorage

sessionStorage に保存されたデータはページのセッションが終了するときに消去される

文書がブラウザー内の特定のタブに読み込まれるたびに、固有のページセッションが作成され、その特定のタブに割り当てられます。そのページセッションは特定のタブでのみ有効です。

ページセッションはタブやブラウザーが開いている限り続き

新しいタブやウィンドウでページを開くと、最上位の閲覧コンテキストの値で新しいセッションが作成されます

2024/08/23 07:50 追記

質問者さんは『javascriptに関しては全くの無知』とのことなので
これ以上の解決は独力では難しいかもしれないですが、一応調査のための手順だけ記載しておきます。

モダンなPCブラウザであれば、開発者ツール(F12キーとかで表示されるやつ)で sessionStorage の中身を監視したりできます。
たとえば以下のような手順で問題のキー=disp_popupが想定外のタイミング(手順の①)で設定されていないか確認することで、問題箇所の特定に繋がるかもしれません。
(というか、現状の情報からするとこの辺りで設定している…くらいしか怪しい所がなさそうです)

  1. 新しいタブで無関係なページ(例えば空白のページ)を開く
  2. 開発者ツール > Storage用のタブを開いておく
  3. 手前のページを開く
  4. 開発者ツールでStorage確認①
    ※この時点では当該ホスト(URLの前半部分)の sessionStorage 内にキー=disp_popupのデータが存在していないはず
  5. 当該ページを開く
    初回アクセスなのでダイアログが表示されるべき
  6. 開発者ツールでStorage確認
    ※キー=disp_popupのデータが追加されている

投稿2024/08/16 10:22

編集2024/08/22 22:50
pecmm

総合スコア760

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

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

alpaca-no

2024/08/16 10:42

早速のご回答ありがとうございます。 ご指摘の通り、 >「要求通りではあるが、同一タブ内で初回アクセスにもかかわらず一度もポップアップが表示されない」 の方にあたります。 (※別端末等で試した場合も同症状でした。) 一旦、今回実装しようとしているモーダルのコード以外の部分にも要因がないかちょっと調べてみます。 ありがとうございます!
pecmm

2024/08/16 13:22

念のため確認ですが、以下のような手順でも間違いなく問題が再現しますか? ①新規タブで直接表示(問題なし) 1. ブラウザの新しいタブで当該ページを直接開く 2. ダイアログが表示される ②新規タブで直前のページから遷移(問題あり) 1. ブラウザの新しいタブで手前のページを開く 2. リンクから当該ページへ遷移 3. ダイアログが表示されない
utm.

2024/08/16 18:04

仕組みに興味が無いのであればsessionStorage.setItem('disp_popup', 'on');を削除すれば良いです。
alpaca-no

2024/08/19 09:33

>pecmm様 ご返信ありがとうございます。 おっしゃるとおり、 ①の場合→問題なし(表示される) ②の場合→問題あり(表示されない) となりました。
alpaca-no

2024/08/19 09:34

>utm.様 ご回答ありがとうございます。 ひとまず応急処置として、sessionStorage.setItem('disp_popup', 'on');を削除しました。 (アクセスの度に表示) ご教示ありがとうございます。
pecmm

2024/08/22 22:51

一応ですが、調査のための手順を追記しました。
guest

0

モーダルの処理はdialogがよいでしょう。
仕様としては新規で開くor別ページから飛んでくる場合モーダルを表示し、リロードやページバック、ページ内リンクなどの場合はモーダルを表示しないということでよろしいですか?

html

1<style> 2dialog { 3 background-color: #F5F5F5; 4 border: solid 0; 5 border-radius: 20px; 6 padding:0; 7} 8dialog:focus{ 9 outline: none; 10} 11dialog::backdrop{ 12 background-color: rgba(0, 0, 0, 0.7); 13} 14.onetime_popup_title { 15 color: #5D653B; 16 font-size: 1rem; 17 text-align: center; 18 font-weight: bold; 19} 20.onetime_popup_title_close { 21 display: inline-block; 22 background: #A5AF7E; 23 color: #fff; 24 cursor: pointer; 25 font-size: 0.8rem; 26 line-height: 3rem; 27 width: 100%; 28 text-align: center; 29 font-weight: bold; 30} 31.onetime_popup_content p { 32 font-size: 0.8rem; 33 line-height: 1.7; 34 padding: 20px; 35} 36</style> 37<script> 38const nav=performance.getEntriesByType("navigation")[0].type; 39window.addEventListener('DOMContentLoaded', ()=>{ 40 if(nav=="navigate"){ 41 document.querySelector('.onetime_popup').showModal(); 42 } 43}); 44document.addEventListener('click',({target})=>{ 45 if(target.matches('.onetime_popup_title_close')){ 46 target.closest('dialog').close(); 47 } 48}); 49 50</script> 51<dialog class="onetime_popup"> 52<div class="onetime_popup_title"> 53<span style="font-size:3rem;"><i class="fas fa-exclamation-circle"></i></span><br>ご注意ください 54</div> 55<div class="onetime_popup_content"> 56<p>記入漏れ・記入間違いが増えています。</p> 57<label class="onetime_popup_title_close">確認しました</label> 58</div> 59</dialog>

投稿2024/08/17 06:16

yambejp

総合スコア117615

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問