0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

JavaScript学習ログ ダブルクリックの禁止処理

Posted at

ダブルクリック禁止の処理

業務でダブルクリックを禁止する処理が必要となり、自分なりに調べたうえで、練習として実装を行いました。

練習では要素の取得をタグ名で行っていますが、実際の案件では対象の要素が多くなりすぎるため、クラス名で取得するように変更する予定です。

また、今回の案件はスマートフォン端末がメインとなるため、挙動を安定させる目的でdblclickイベントではなく、1回目のクリックから1秒間は2回目のクリックを受け付けない処理を採用しました。

  <a href="https://example.com">アンカー</a>
  <form action="https://example.com">
    <button type="submit">ボタン</button>
  </form>
    .disabled {
      pointer-events: none;
    }

    document.addEventListener('DOMContentLoaded', function () {
      const btnAnchors = document.querySelectorAll('a');
      const btnButtons = document.querySelectorAll('button');

      let isClicked = false; // クリック未実行と定義

      // リンクのクリックイベント
      btnAnchors.forEach((btnAnchor) => {
        btnAnchor.addEventListener('click', function (event) {
          if (isClicked) {
            event.preventDefault(); // デフォルトの挙動を阻止→リンク無効化
            return; // これ以上処理を行わない
          }

          isClicked = true; // クリック時のデフォルトの挙動を行う
          btnAnchor.classList.add('disabled'); // 2回目のクリック禁止

          // 1秒後に再度クリックできるように
          setTimeout(() => {
            isClicked = false;
            btnButton.classList.remove('disabled'); // 無効化解除
          }, 1000);
        });
      });

      // ボタンのクリックイベント
      btnButtons.forEach((btnButton) => {
        btnButton.addEventListener('click', function (event) {
          if (isClicked) {
            event.preventDefault(); // デフォルトの挙動を阻止→リンク無効化
            return; // これ以上処理を行わない
          }

          isClicked = true; // クリック時のデフォルトの挙動を行う
          btnButton.disabled = true; // ボタンを無効化(disabled属性)

          // 1秒後に再度クリックできるように
          setTimeout(() => {
            isClicked = false;
            btnButton.disabled = false; // ボタンの無効化解除
          }, 1000);
        });
      });
    });

aタグの場合は.disabledクラスを付与し、buttonタグの場合はdisabled属性を設定することで、2回目のクリックを防止しています。

現在はその違いによって処理を分けていますが、共通部分を関数にまとめて引数で制御すれば、記述量を減らせるのではないかと考えました。

ただし今回は、まだそのような実装を行うだけの理解が十分ではないため、チャットGPTに相談しつつコードの簡略化を試みようと思っています。

❗最初に詰まった部分

  • loadイベントを設定していなかったため、要素の取得に失敗していました。

  • 実装練習時にボタンが複数存在していたため、意図した要素すべてに対して処理が適用されず、aタグやbuttonタグのクリック禁止処理が1つの要素にしか反映されていませんでした。背景の色を赤く変えることで確認していたのですが、1つしか反応しませんでした。

今回新しく出会ったメソッド

  • Event: preventDefault() メソッド
    ブラウザがそのイベントに対して行う「デフォルトの動作」をキャンセルする。

  • Window: setTimeout() メソッド
    指定した時間(ミリ秒)経ったあとに、1回だけ関数を実行する。

0
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?