JS鼠標(biāo)3次點擊事件實現(xiàn)代碼及擴展思路
這幾天看了一下JavaScript高級程序設(shè)計中的Dom事件相關(guān)內(nèi)容,同時看到網(wǎng)上有關(guān)鼠標(biāo)多次點擊事件,鼠標(biāo)事件是簡單、常用的事件之一,于是便針對點擊事件進行一些小的擴展和實現(xiàn),增強對Dom事件的進一步理解。其中的實現(xiàn)和思路是自己總結(jié)的,有什么不對的地方還請大神們交流指正。
1、制作一個通用的事件處理模塊(原生實現(xiàn))
以下實現(xiàn)基于AMD定義模塊方式:
/**
* 瀏覽器兼容事件處理組件
*/
define(function () {
var EventUtil = {
// 添加事件監(jiān)聽
addHandler: function (element, type, handler) {
if (element.addEventListener) {
element.addEventListener(type, handler, false);// DOM2級事件
} else if (element.attachEvent) {
element.attachEvent('on' + type, handler);// DOM2級IE事件
} else {
element['on' + type] = handler;// DOM0級事件
}
},
// 移除事件監(jiān)聽
removeHandler: function (element, type, handler) {
if (element.removeEventListener) {
element.removeEventListener(type, handler, false);
} else if (element.detachEvent) {
element.detachEvent('on' + type, handler);
} else {
element['on' + type] = null;
}
},
// 獲取事件對象
getEvent: function (event) {
return event ? event : window.event;
},
// 獲取事件的目標(biāo)元素
getTarget: function (event) {
return event.target || event.srcElement;
},
// 禁止事件默認(rèn)行為
preventDefault: function (event) {
if (event.preventDefault) {
event.preventDefault();
} else {
event.returnValue = false;
}
},
// 禁止事件冒泡
stopPropagation: function (event) {
if (event.stopPropagation) {
event.stopPropagation();
} else {
event.cancelBubble = true;
}
}
};
return EventUtil;
});
2、鼠標(biāo)3擊事件實現(xiàn)
鼠標(biāo)點擊事件涉及的事件及執(zhí)行觸發(fā)順序:
mousedown:鼠標(biāo)任意鍵按下時觸發(fā)
mouseup:釋放鼠標(biāo)按鈕時觸發(fā)
click:單擊
mousedown
mouseup
dblclick:雙擊
顯然,click是依賴dblclick的,可以考慮根據(jù)這兩個事件實現(xiàn)鼠標(biāo)3次連續(xù)點擊觸發(fā)執(zhí)行,設(shè)計觸發(fā)dblclick后監(jiān)聽click事件,如果在短時間內(nèi)觸發(fā)了click事件,則構(gòu)成鼠標(biāo)連續(xù)點擊3次的效果,具體實現(xiàn)如下源碼:
<div> <button id="button">鼠標(biāo)3擊</button> </div>
js 代碼
require(['eventUtil'], function (EventUtil) {
var button = document.getElementById('button');
click3Event(button, function (event) {
console.log('3 click');
});
// 鼠標(biāo)3擊事件
function click3Event(dom, fn) {
var handler = function (event) {
var event = EventUtil.getEvent(event),
target = EventUtil.getTarget(event);
var handler = function (event) {
var event = EventUtil.getEvent(event),
target = EventUtil.getTarget(event);
EventUtil.removeHandler(target, 'click', handler);
// 執(zhí)行內(nèi)容
fn();
};
EventUtil.addHandler(target, 'click', handler);
// 為防止雙擊后較長時間再次單擊執(zhí)行事件
setTimeout(function () {
EventUtil.removeHandler(target, 'click', handler);
}, 300);
};
EventUtil.addHandler(dom, 'dblclick', handler);
}
3、鼠標(biāo)n擊事件實現(xiàn)
由鼠標(biāo)3擊事件聯(lián)想到,如果實現(xiàn)n次鼠標(biāo)連擊事件觸發(fā)如何實現(xiàn)。想到的思路是:禁用目標(biāo)對象的dblclick事件,只用click事件進行連續(xù)點擊的邏輯判斷和操作,在連續(xù)的短時間內(nèi)滿足點擊n次即可觸發(fā)執(zhí)行,否則重新計算累加次數(shù)。具體的實現(xiàn)代碼如下:
require(['eventUtil'], function (EventUtil) {
var button = document.getElementById('button');
nclickEvent(4, button, function (event, n) {
console.log(n + ' click');
});
function nclickEvent (n, dom, fn) {
// 禁止雙擊事件
EventUtil.removeHandler(dom, 'dblclick', null);
var n = parseInt(n) < 1 ? 1 : parseInt(n),
count = 0,
lastTime = 0;
var handler = function (event) {
var currentTime = new Date().getTime();
count = (currentTime - lastTime < 300) ? count + 1 : 0;
lastTime = new Date().getTime();
if (count >= n - 1) {
fn(event, n);
count = 0;
}
};
EventUtil.addHandler(dom, 'click', handler);
}
});
最后給大家分享一個jquery版的代碼
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<div id="box">234234234234234</div>
<script src="js/jquery.min.js"></script>
<script>
(function(){
var num=0,d=null;
$('#box').click(function(){
if(d){clearTimeout(d)}
d=setTimeout(function(){
num=0
},200);
num++;
if(num>=3){
alert(num+"\n ok")
}
})
})();
</script>
</body>
</html>
到此文章就結(jié)束了,大家可以根據(jù)需要選擇自己想用的代碼。
相關(guān)文章
layer彈窗在鍵盤按回車將反復(fù)刷新的實現(xiàn)方法
今天小編就為大家分享一篇layer彈窗在鍵盤按回車將反復(fù)刷新的實現(xiàn)方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-09-09
簡單了解Javscript中兄弟ifream的方法調(diào)用
這篇文章主要介紹了簡單了解Javscript中兄弟ifream的方法調(diào)用文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,,需要的朋友可以參考下2019-06-06

