46
47

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

JavaScript シングル/ダブルクリックイベントを両方取得する

Last updated at Posted at 2015-11-20

とあるプログラムを書いているときに、ある要素をシングルクリックしたときの処理と、ダブルクリックしたときの処理を別々にしたいと思いました。
それをスマートに実現する方法がなく、自前で実現したのでその方法をメモ。

onclickとondblclickを両方登録すればいいのでは?

それがそうもいかないのです。
イベントの発火順序がシングルクリック→ダブルクリックとなっているようです。
そのため、両方登録してもシングルクリックの処理しか行われないみたいです。

ならどうする?

そこで、クリックされた状態を保持するフラグを用意し、クリック後一定時間以内に再度クリックした場合、ダブルクリックと判定します。
ごちゃごちゃ言うよりコードを示すほうが早いと思います。
こんな感じ。

// グローバル変数
var clicked = false;	// クリック状態を保持するフラグ
// id="hoge"の要素をシングル/ダブルクリックしたときのイベント
document.getElementById("hoge").onclick = function (evt) {
    // クリックフラグが立っている状態でのクリック
    //     -> ダブルクリック
    if (clicked) {
        alert("double click!!");
        
        clicked = false;
        return;
    }
    
    // シングルクリックを受理、300ms間だけダブルクリック判定を残す
    clicked = true;
    setTimeout(function () {
        // ダブルクリックによりclickedフラグがリセットされていない
        //     -> シングルクリックだった
        if (clicked) {
            alert("single click!");
        }
        
        clicked = false;
    }, 300);
};

これで実現できます。

動くサンプル

46
47
1

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
46
47

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?