現在HTML,Javascript(jQuery)を使ってスマホ用Webページを作っています。
そこでおかしな現象が起こってしまい対処したいのですが、そのように対処するのがいいか検討中です。
結論から言うと、
touchstartによるイベント処理時、タップしたボタンだけでなく、そのボタンを押したことにより表示されるモーダル内のリンクも処理が実行されてしまいます。そのリンクがタップした場所に表示される場合に限ってですが。つまりタップした場所にボタンとリンクが時間差でも表示される時そのどちらもが実行されてしまいます。そのような現象の対応方法はどのようにすべきでしょうか?
コードは以下のようになっています。
javascript
1var _e = ("ontouchstart" in document) ? 'touchstart':'click'; 2$(window).on("load resize",function(){ 3 $(#a_btn).on({_e,function(){ 4 // モーダルを表示する処理。hiddenになっているモーダルエリアをshowする。 5 }) 6})
結果的に次のようにすることで対処はできたのですが、いまいち綺麗な直し方とは言えないですし、動きがモッサリしてしまったり、端末によって時間のズレが生じそうだったりと懸念点は多いです。
javascript
1var _e = ("ontouchend" in document) ? 'touchend':'click'; 2$(window).on("load resize",function(){ 3 4 $(#a_btn).on({_e,function(){ 5 setTimeout(function(){ 6 // モーダルを表示する処理。hiddenになっているモーダルエリアをshowする。 7 },10); 8 9 // settimeoutを書く前は以下のような記述を入れていましたが、起動したモーダルはクリックされました。 10 // _e.preventDefault(); 11})
touchendに変更し、setTimeoutを使っています。
どうも2つ処理が実行される原因がtouchstartのイベントが維持時間がありそうなのです。
イベントが瞬間的には知らず、少し続いているような。そのためsetTimeoutで実行を遅らせることにより、2つの処理が発生するのを防ぎました。
touchendは手が離れた瞬間から計測しないと処理にばらつきが出るためです。
このような暫定的な対応は致しましたが、かなり懸念点が残ります。
このような経験がある方などアドバイス頂ける方がいらっしゃいましたらよろしくお願いいたします。
ちなみに処理の最後に
・preventDefault();
・return false;
を書いても問題は解決されませんでした。
よろしくお願い致します。

回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/09/04 20:07
2017/09/05 02:13
2017/09/06 02:56
2017/09/11 23:13
2017/09/12 01:37