JS鼠標(biāo)3次點(diǎn)擊事件實(shí)現(xiàn)代碼及擴(kuò)展思路
這幾天看了一下JavaScript高級(jí)程序設(shè)計(jì)中的Dom事件相關(guān)內(nèi)容,同時(shí)看到網(wǎng)上有關(guān)鼠標(biāo)多次點(diǎn)擊事件,鼠標(biāo)事件是簡(jiǎn)單、常用的事件之一,于是便針對(duì)點(diǎn)擊事件進(jìn)行一些小的擴(kuò)展和實(shí)現(xiàn),增強(qiáng)對(duì)Dom事件的進(jìn)一步理解。其中的實(shí)現(xiàn)和思路是自己總結(jié)的,有什么不對(duì)的地方還請(qǐng)大神們交流指正。
1、制作一個(gè)通用的事件處理模塊(原生實(shí)現(xiàn))
以下實(shí)現(xiàn)基于AMD定義模塊方式:
/** * 瀏覽器兼容事件處理組件 */ define(function () { var EventUtil = { // 添加事件監(jiān)聽 addHandler: function (element, type, handler) { if (element.addEventListener) { element.addEventListener(type, handler, false);// DOM2級(jí)事件 } else if (element.attachEvent) { element.attachEvent('on' + type, handler);// DOM2級(jí)IE事件 } else { element['on' + type] = handler;// DOM0級(jí)事件 } }, // 移除事件監(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; } }, // 獲取事件對(duì)象 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擊事件實(shí)現(xiàn)
鼠標(biāo)點(diǎn)擊事件涉及的事件及執(zhí)行觸發(fā)順序:
mousedown:鼠標(biāo)任意鍵按下時(shí)觸發(fā)
mouseup:釋放鼠標(biāo)按鈕時(shí)觸發(fā)
click:?jiǎn)螕?/p>
mousedown
mouseup
dblclick:雙擊
顯然,click是依賴dblclick的,可以考慮根據(jù)這兩個(gè)事件實(shí)現(xiàn)鼠標(biāo)3次連續(xù)點(diǎn)擊觸發(fā)執(zhí)行,設(shè)計(jì)觸發(fā)dblclick后監(jiān)聽click事件,如果在短時(shí)間內(nèi)觸發(fā)了click事件,則構(gòu)成鼠標(biāo)連續(xù)點(diǎn)擊3次的效果,具體實(shí)現(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ǎng)時(shí)間再次單擊執(zhí)行事件 setTimeout(function () { EventUtil.removeHandler(target, 'click', handler); }, 300); }; EventUtil.addHandler(dom, 'dblclick', handler); }
3、鼠標(biāo)n擊事件實(shí)現(xiàn)
由鼠標(biāo)3擊事件聯(lián)想到,如果實(shí)現(xiàn)n次鼠標(biāo)連擊事件觸發(fā)如何實(shí)現(xiàn)。想到的思路是:禁用目標(biāo)對(duì)象的dblclick事件,只用click事件進(jìn)行連續(xù)點(diǎn)擊的邏輯判斷和操作,在連續(xù)的短時(shí)間內(nèi)滿足點(diǎn)擊n次即可觸發(fā)執(zhí)行,否則重新計(jì)算累加次數(shù)。具體的實(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); } });
最后給大家分享一個(gè)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ù)需要選擇自己想用的代碼。
- javascript觸發(fā)模擬鼠標(biāo)點(diǎn)擊事件
- 利用chrome瀏覽器進(jìn)行js調(diào)試并找出元素綁定的點(diǎn)擊事件詳解
- 解決Js先觸發(fā)失去焦點(diǎn)事件再執(zhí)行點(diǎn)擊事件的問(wèn)題
- JavaScript實(shí)現(xiàn)父子dom同時(shí)綁定兩個(gè)點(diǎn)擊事件,一個(gè)用捕獲,一個(gè)用冒泡時(shí)執(zhí)行順序的方法
- vuejs響應(yīng)用戶事件(如點(diǎn)擊事件)
- JavaScript給每一個(gè)li節(jié)點(diǎn)綁定點(diǎn)擊事件的實(shí)現(xiàn)方法
- js中class的點(diǎn)擊事件沒有效果的解決方法
- JS通用方法觸發(fā)點(diǎn)擊事件代碼實(shí)例
相關(guān)文章
整理CocosCreator常用知識(shí)點(diǎn)
這篇文章主要介紹了整理CocosCreator常用知識(shí)點(diǎn),這些知識(shí)點(diǎn),平時(shí)幾乎都能用到,希望同學(xué)們看完后,可以自己去試一下,加深印象2021-04-04JS動(dòng)態(tài)計(jì)算移動(dòng)端rem的解決方案
移動(dòng)設(shè)備分辨率五花八門雖然我們可以通過(guò)CSS3的media query來(lái)實(shí)現(xiàn)適配,但是這種做法并不能適配所有設(shè)備,這篇文章主要介紹了js動(dòng)態(tài)計(jì)算移動(dòng)端rem的解決方案,非常不錯(cuò),感興趣的朋友一起看看吧2016-10-10js實(shí)現(xiàn)圖片上傳即時(shí)顯示效果
這篇文章主要為大家詳細(xì)介紹了js實(shí)現(xiàn)圖片上傳即時(shí)顯示效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-09-09JS如何實(shí)現(xiàn)手機(jī)端輸入驗(yàn)證碼效果
這篇文章主要介紹了JS如何實(shí)現(xiàn)手機(jī)端輸入驗(yàn)證碼效果,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-05-05js實(shí)現(xiàn)仿百度汽車頻道選擇汽車圖片展示實(shí)例
這篇文章主要介紹了js實(shí)現(xiàn)仿百度汽車頻道選擇汽車圖片展示,實(shí)例分析了javascript鼠標(biāo)事件操作css樣式的技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-05-05layer彈窗在鍵盤按回車將反復(fù)刷新的實(shí)現(xiàn)方法
今天小編就為大家分享一篇layer彈窗在鍵盤按回車將反復(fù)刷新的實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-09-09簡(jiǎn)單了解Javscript中兄弟ifream的方法調(diào)用
這篇文章主要介紹了簡(jiǎn)單了解Javscript中兄弟ifream的方法調(diào)用文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,,需要的朋友可以參考下2019-06-06JavaScript手寫一個(gè)前端存儲(chǔ)工具庫(kù)
在項(xiàng)目開發(fā)的過(guò)程中,為了減少提高性能,減少請(qǐng)求,開發(fā)者往往需要將一些不易改變的數(shù)據(jù)放入本地緩存中。本文就來(lái)用JavaScript手寫一個(gè)前端存儲(chǔ)工具庫(kù),希望對(duì)大家有所幫助2023-02-02