[前端][自定义DOM事件]不使用setTimeout实现双击事件或n击事件
使用setTimeout实现双击事件
例如,这样:
let div = document.getElementById("div"); doubleClick(div, function (event) { console.log('双击') }) function doubleClick(ele, fn) { // 省略参数合法性的判断 let event = new Event("doubleClick"); // 自定义双击事件(可以使用CustomEvent携带数据) // 双击事件监听 ele.addEventListener("doubleClick", function (event) { fn(event); }); // 双击事件触发 let timeout; let clicked = false; // 是否已经点击过一次 ele.addEventListener("click", function () { if (clicked) { clicked = false; if (timeout) { clearTimeout(timeout); } ele.dispatchEvent(event); // 事件分发 } else { clicked = true; timeout = setTimeout(function () { clicked = false; }, 400); } }); }
使用数组实现双击事件或n击事件
灵感来自于Android系统多击触发彩蛋的源码用前端的方式实现长这样:
let div = document.getElementById("div"); multiClick(div, function (event) { console.log('双击') }, 2) function multiClick(ele, fn, clickNum) { // 省略参数合法性的判断 let event = new Event("multiClick"); // 创建n击事件(可以使用CustomEvent携带数据) let hits = []; // n击事件监听 ele.addEventListener("multiClick", function (event) { fn(event); }); // n击事件触发 ele.addEventListener("click", function () { let now = new Date().getTime(); hits.push(now); if (hits.length > 1) { if (hits[0] + 500 > now) { if (hits.length === clickNum) { hits = []; ele.dispatchEvent(event); // 事件分发 } } else { hits.shift(); } } }); }
相关推荐
sfkong 2020-08-02
89500297 2020-05-05
delmarks 2020-04-09
gjcxywwx 2019-11-04
前端开发Kingcean 2019-10-22
Magicsoftware 2019-10-19
xuewenke 2012-02-05
jiangbo0 2019-09-08
85403263 2019-07-01
codable 2019-07-01
梦秋雨 2019-07-01
87241940 2019-06-30
83251242 2019-06-30
85281643 2019-06-29
whynotgonow 2019-06-29