イベントをキャンセルする方法 | 質問掲示板 | 独学!未経験からWebデザイナーになる!!

Web制作や付随することを何でも質問できるコーナーです。

未経験からWebデザイナーになる!! > 質問掲示板 > カテゴリ: JavaScript > イベントをキャンセルする方法

イベントをキャンセルする方法

当サイトのリニューアル作業に時間をあてるため、掲示板の投稿は当分停止させていただきます。
 下記のような外部 javascript ファイル(下記が全文です)を設置し、「body {max-width: 400px;}」として、画面の左右50px以内をタップするとページを遷移するようにしていて、その機能自体は問題なく動きます。

 ここで、タップした場所にリンクが貼ってあるようなときにも、リンクよりイベントが優先されてしまうのですが、ここを回避するには、どの位置にどのような javascript コード(jQuery は使わない)を書けば良いでしょうか?

 つまり、「<a href="hoge">fuga</a>」や「<tag onClick='hoge;'>fuga</tag>」というような html が書かれた場所で「fuga」をタップした場合に、タップ・クリック関係のイベントをキャンセルする方法を探しています。

 なお、コードに冗長な表現がありましたら、参考のため、ご指摘いただけると幸いです。
01:window.addEventListener('load', function(event) {
02:  var filenames = ['00','01','011','011_01',・・・,'00']; //「・・・」の部分、配列要素を省略しています。
03:  var filename = document.location.pathname.split('/').pop().split('.')[0];
04:  var next_href = filenames[filenames.indexOf(filename) +1] + '.html';
05:  var prev_href;
06:  if (filename == '00') {prev_href = 'javascript:alert("これより前のページはありません。");';}
07:  else {prev_href = filenames[filenames.indexOf(filename) -1] + '.html';}
08:  var touchStartX;
09:  var e_touchstart = window.ontouchstart === null? 'touchstart' : 'mousedown';
10:  window.addEventListener(e_touchstart, function(event) {
11:    if(window.ontouchstart === null) {touchStartX = event.touches[0].pageX;}
12:    else {touchStartX = event.pageX;}
13:    if (touchStartX > 350) {document.location.href = next_href;}
14:    else if (touchStartX < 50) {document.location.href = prev_href;}
15:  }, false);
16:}, false);

【コードの解説】
02:全ページURL「~~/***.html」の「***」の部分だけを配列 filenames に格納。
03:現ページURLから「***」の部分だけを変数 filename に格納。
04:配列 filenames の中での filename の位置を検索し、filenames の中での次のインデックスを「次ページのURL」として、変数 next_href に格納。
07:同様に、filenames の中での前のインデックスを「前ページのURL」として、変数 prev_href に格納。
09:touchstart イベントが発生する場合は(スマホとして検知し)、イベント変数 e_touchstart に「touchstart」を、そうでなければ「mousedown」を割り当て。
11:同様に、前者は「タップしたところの event.touches[0].pageX」を、
12:後者は、「クリックしたところの event.pageX」を変数 touchStartX に格納。
13:touchStartX が 350px より大きければ(画面右端をタップすれば)、next_href(次ページ)に、
14:50px より小さければ(左端なら)、prev_href(前ページ)に遷移。
わぁ、スミマセン。
 初投稿なのに、ご挨拶もしていませんでした。DOUGLAS と申します。
 ネットで検索して、こちらを発見し、質問したのですが、自己解決してしまいました。

 11: ~ 14: を
if (event.target.hash !== '' && typeof event.target.onclick !== 'function') {
}

で挟んだら、希望のことが出来ました。

 大変、お騒がせいたしました。


 なお、当方、Google Chrome 71.0.3578.98 を使っているのですが、このサイトにおいて「新規の質問を投稿する」とき、「本文」内に[code]を記載した場合、「入力内容を確認する」場面で、[code]以外の部分も、[code]欄と同じように表示され、「div#content」が「div#sidebar」の下に隠れてしまって、入力内容が確認できませんでしたので、取り敢えず、css に、
.table-form {table-layout: fixed;}
と付け加えて投稿いたしました。
DOUGLASさん、はじめまして。

今日は朝から出ており、スマホから内容を確認していたのですが、ぱっとは思いつかなかったので戻ってからレスを……と思っておりました。

解決されたとのこと、たしかにコードを読むとなるほどと思います。
JavaScriptは必要に迫られた時くらいしか最近は書いていないので、勉強になりました。
ありがとうございます。


ご挨拶の件は、言われなければ気づかないくらいでしたので(汗)全くお気になさらないでください。

【code】の不具合も情報ありがとうございます。
当方にも不具合が確認できました。大変ご迷惑をお掛けしました。

その他【code】内の右側の文字が入力確認時にサイドバーに隠れてしまったり等、かなり昔に作ったものなので作り直したい衝動に駆られます(汗)

この度は直接お役に立てず大変恐縮です。
また何かありましたらお気軽にご投稿ください。