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

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

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

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

jQuery

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

Q&A

解決済

2回答

5760閲覧

JavaScriptのhistory.back()の挙動について

span

総合スコア32

JavaScript

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

jQuery

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

0グッド

0クリップ

投稿2017/09/12 08:27

###該当のソースコード

  • HTML
<div class="backBtn">戻る</div>
  • JavaScript
$(".backBtn").on('touchend click', function() { history.back(); });

###問題
遷移先のページより戻るをタッチした際に、戻った先の指の下に存在する別リンクが反応してしまい意図しない挙動をして他ページへ飛んでしまいます。これはなぜなのでしょうか?
(※スマートフォンサイトのみです。PCは問題なく動きます。)
history.back();の下でreturn false;をすれば意図した挙動になるのですがtouchendイベントをキャンセルさせることでなぜ戻り先のリンクもキャンセルされるのか理解できず釈然とした状況です。
どなたか理由がわかる方がいらっしゃったら教えていただけないでしょうか。

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

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

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

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

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

guest

回答2

0

touchstartイベントが発生するタイミングはGoogleのWeb Fundamentals サイト上でのタップ操作をサポートするによると初めて要素に指が触れたとき、またはユーザーがマウスでクリックをしたときに発生と記載してあります。

なので、ボタンをクリックしてmodalが出現するUIで、modal内に設定してあるtouchstartイベントや、リンクなどのDOMの位置がボタンと一緒になった場合や、戻った先の指の下に存在する別リンクが存在する場合は、画面上ではボタンの位置をtouchしているので、イベントが発生してしまいます。

投稿2017/09/12 08:34

MasakazuFukami

総合スコア1869

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

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

span

2017/09/12 08:49

ご回答ありがとうございます!いただいたサポートページ拝見させていただきtouchstartイベントの場合は理解できたのですが今回のケースのtouchendイベントの場合は要素から指を離した時に発生という認識なのですが、その場合は離した瞬間にイベントの処理が発生→終了→戻り先のページの読み込み(離した後に戻り先のページが読み込まれているので戻り先のリンクなどのDOMには触れようがない)というのは間違った認識でしょうか?
MasakazuFukami

2017/09/12 09:41

すいません下の方の回答で大丈夫そうでしょうか? おそらく下の方が仰っているのは、イベントのcapure, target, bubblingの各phaseへイベントの伝達が行われるということ、return false(実際はbubblingを止めるにはe.stopPropagation()、今回の事例ではe.preventDefault()だけで大丈夫)を行うとそれを止めることが出来るということ。 なので、今回の事例でそれが起きるとすれば、 div.backBtnを囲うようにリンク要素が配置されている場合でかつ、ページ遷移自体をJSで制御するようなSPAで出来ている場合だと思われます。 僕の勝手な想像ですが、すべてサーバーサイドレンダリングで実装されているのではないかと思っており、hitory,back()をすると新しいhtmlがレンダリングされ始められるのでbubbling系の話ではないのではないかなぁと思っています。 仮に僕の勘違いでしたらスイマセン!
unau

2017/09/12 09:58

なるほど、SPA やら SSR はまだまともに実装したことがないので、そういうところにまで頭がいっていなかったのが実状です。今、SPA なサービスを設計中ではあるので、勉強になります。
MasakazuFukami

2017/09/12 10:06

@unau さん なんか文句を言ってるみたいになってスイマセン。。。 僕もcapture phaseとbubbling phaseに関しての知識はあったのですが、target phaseというものを知らなかったので勉強になりました!! ありがとうございます!
unau

2017/09/12 10:52

よい質問をキッカケに、より正しい知識、深い見識、広い視野などが得られるのが teratail のいちばんの醍醐味ではないでしょうか。 なので、間違っているところを間違っていると指摘されるのは、驚くことがあっても、不快に思うことはありません。まあ、個人の恥みたいなものに頓着することなく、中身のある議論をしていきたいところですよね!
span

2017/09/12 11:15

お二人とも本当に有難うございます。今回お二人からの助言で今まで勘違いしていたイベントの挙動など知り得る事ができました! 正直助言いただいた中でまだ理解しきれていない事もありますがこれから一つずつ読み解いて理解に繋げたいと思います。本当に有難うございました!
guest

0

ベストアンサー

UI Events : 3.1. Event dispatch and DOM event flow の図がわかりやすいと思いますが、div.backBtntouchend イベントハンドラキックされるのは、div.backBtn が末端としたら Target Phase のときです。div.backBtn 親要素にイベントが登録されていれば、Capture Phase のときにすでにチェックされイベントを認識し、Bubbling Phase で戻ってきたときにイベントハンドラが起動します。つまり、div.backBtn のイベントハンドラが実行されているときには、すでに親要素のイベントハンドラも実行待ちの状態になっているということです。
もし、div.backBtntouchend イベントハンドラの最後に return false; があると、Bubbling がキャンセルされるので、Capture Phase で用意されていたイベントハンドラは実行されません。が、Bubbling がおこれば、Capture Phase で用意されていたイベントハンドラが実行されます。

(用語の正しさには自信ありません ...)

投稿2017/09/12 09:09

編集2017/09/12 09:12
unau

総合スコア2468

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

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

span

2017/09/12 09:23

なるほど理解できました!そもそものhistory.backの挙動を勘違いしていたことも原因でした,,,ご回答ありがとうございました!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問