[前端][自定义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