js中單擊和雙擊事件的區分

js中單擊和雙擊事件的區分

1. 首先要了解鼠標點擊(單擊或雙擊)時包含的事件。

mousedown 事件:

  當鼠標指針移動到元素上方,並按下鼠標按鍵時,會發生 mousedown 事件。與 click 事件不同,mousedown 事件僅需要按鍵被按下,而不需要鬆開即可發生。

mouseup 事件:

  當在元素上放鬆鼠標按鈕時,會發生 mouseup 事件。與 click 事件不同,mouseup 事件僅需要放鬆按鈕。當鼠標指針位於元素上方時,放鬆鼠標按鈕就會觸發該事件。

click(單擊)事件:

  當鼠標指針停留在元素上方,然後按下並鬆開鼠標左鍵時,就會發生一次 click。

dblclick(雙擊)事件:

  當鼠標指針停留在元素上方,然後按下並鬆開鼠標左鍵時,就會發生一次 click。在很短的時間內發生兩次 click,即是一次 double click 事件。

2. 其次要了解鼠標點擊事件中各個事件的執行順序。

先看個例子:

<html>
    <head>
        <script type="text/javascript" src="jquery-1.12.1.js"></script>
    </head>
    <body>
        <input type="button" id="testBtn" value="單擊我或者雙擊我">  
        <script language="javascript">  
            var a = 0;
            $("#testBtn").on("mousedown",function(){
                console.log("this is mousedown event");
                console.log("a=" + a++);
            });
            $("#testBtn").on("mouseup",function(){
                console.log("this is mouseup event");
                console.log("a=" + a++);
            });
            $("#testBtn").on("click",function(){
                console.log("this is click event");
                if(a==2){
                    $("#testBtn").css("background-color","red");
                }
                if(a==5){
                    $("#testBtn").css("background-color","green");
                }
                console.log("a=" + a++);
            });
            $("#testBtn").on("dblclick",function(){
                console.log("this is dblclick event");
                console.log("a=" + a++);
            });
        </script>  
    </body>
</html>

單擊時,以上代碼在瀏覽器控制檯中的輸出結果是:

this is mousedown event
a=0
this is mouseup event
a=1
this is click event
a=2

雙擊時,以上代碼在瀏覽器控制檯中的輸出結果是:

this is mousedown event
a=0
this is mouseup event
a=1
this is click event
a=2
this is mousedown event
a=3
this is mouseup event
a=4
this is click event
a=5
this is dblclick event
a=6

從輸出結果中我們可以看到,鼠標點擊事件中各個事件的執行順序是:

單擊(click):  mousedown,mouseup,click;
雙擊(dbclick): mousedown,mouseup,click,mousedown,mouseup,click,dblclick 。

同時,從a的結果和按鈕的背景顏色變化來看:

1. 從背景顏色的最終顏色來看,第一次單擊事件被覆蓋了,並不是被屏蔽或阻止了。 
2. 從a的值變化來看,雙擊事件中的兩次單擊事件代碼都執行了,而且a的值一直在增長。

3. 如何區分單擊和雙擊事件

從以上的分析來看,只要我們能把雙擊事件中的前兩次單擊事件清除掉,那就只剩下雙擊事件了(若想去除重複的mousedown和mouseup事件,可用同樣的方法)。

  利用setTimeout和clearTimeout來實現對事件的清除。

對上面的例子進行如下修改:

<html>
    <head>
        <script type="text/javascript" src="jquery-1.12.1.js"></script>
    </head>
    <body>
        <input type="button" id="testBtn" value="單擊我或者雙擊我">  
        <script language="javascript">  
            var a = 0;
            var timeoutID= null;
            $("#testBtn").on("mousedown",function(){
                console.log("this is mousedown event");
                console.log("a=" + a++);
            });
            $("#testBtn").on("mouseup",function(){
                console.log("this is mouseup event");
                console.log("a=" + a++);
            });
            $("#testBtn").on("click",function(){
                clearTimeout(timeoutID);
                timeoutID= window.setTimeout(function(){
                    console.log("this is click event");
                    if(a==2){
                        $("#testBtn").css("background-color","red");
                    }
                    if(a==5){
                        $("#testBtn").css("background-color","green");
                    }
                    console.log("a=" + a++);
                }, 200);
            });
            $("#testBtn").on("dblclick",function(){
                clearTimeout(timeoutID);
                console.log("this is dblclick event");
                console.log("a=" + a++);
            });
        </script>  
    </body>
</html>

以上代碼在瀏覽器控制檯中的輸出結果是:

this is mousedown event
a=0
this is mouseup event
a=1
this is mousedown event
a=2
this is mouseup event
a=3
this is dblclick event
a=4

關鍵點分析:

  setTimeout事件中的延遲時間(單位爲毫秒)和clearTimeout事件。(欲知該延遲時間的確定可以查看下一篇文章)

歸總:

  爲了區分單擊和雙擊事件,稍微延遲單擊事件中的實際動作(單擊後的實際想做的change),利用setTimeout使其延時,讓程序繼續往下走,然後在程序進入dblclick 事件時,利用clearTimeout來刪除仍在等待中的響應事件(setTimeout設定的延時響應事件,即單擊後的實際響應事件),如此便區分開了單擊和雙擊事件。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章