ioto-multi-tap
Version:
一个用于处理短时间内连续触发调用的 JavaScript 工具类
1 lines • 4.25 kB
Source Map (JSON)
{"version":3,"file":"multi-tap.mjs","sources":["../src/multi-tap.js"],"sourcesContent":["/**\n * MultiTap 类用于在短时间间隔内连续调用时,根据调用次数执行不同的处理函数。\n *\n * @example\n * // 创建一个 MultiTap 实例,设置三个处理函数\n * const multiTap = new MultiTap([\n * // handler1: 单次调用,必须提供\n * (count) => console.log(`单击:${count} 次`),\n * // handler2: 400ms 内连续调用 2 次,必须提供\n * (count) => console.log(`双击:${count} 次`),\n * // handler3: 400ms 内连续调用 3 次,可选(后续 handler 均为可选)\n * (count) => console.log(`三击:${count} 次`)\n * ]);\n *\n * // 监听键盘事件:每次按空格键都会调用 trigger 方法\n * document.addEventListener(\"keydown\", (event) => {\n * // 这里以空格键为例,也可以根据需要修改为其他键\n * if (event.code === \"Space\") {\n * multiTap.trigger();\n * }\n * });\n *\n * // 提示信息:\n * console.log(\"请在 400ms 内连续按空格键进行测试!\");\n */\nclass MultiTap {\n /**\n * 构造函数\n *\n * @param {Function[]} handlers - 一个函数数组,对应连续调用次数的处理函数:\n * handlers[0] 用于 1 次调用,\n * handlers[1] 用于 2 次调用,\n * handlers[2] 用于 3 次调用(可选),依次类推。\n * 至少需要提供前两个处理函数。\n * @param {number} [interval=400] - 多次调用之间允许的间隔(毫秒),默认为 400ms。\n *\n * @throws {Error} 当 handlers 不是数组或数量少于 2 时抛出错误。\n */\n constructor(handlers, interval = 400) {\n if (!Array.isArray(handlers) || handlers.length < 2) {\n throw new Error(\"必须提供至少两个处理函数(handler)。\");\n }\n this.handlers = handlers;\n this.interval = interval;\n this.count = 0;\n this.timer = null;\n }\n \n /**\n * 触发调用记录。每次外部事件(例如按键)到来时,请调用此方法,\n * 系统会在间隔期内统计调用次数,超过间隔后执行对应的处理函数。\n *\n * 执行逻辑:\n * 1. 每次调用 trigger() 时,将内部计数器加 1。\n * 2. 如果之前已经启动了等待计时器则清除计时器,开始一个新的 400ms 倒计时。\n * 3. 当 400ms 过去没有新的调用时,依据计数器值选择对应的处理函数执行:\n * - 如果 handlers 中存在与计数器相应的处理函数,则执行之;\n * - 否则,使用 handlers 数组中的最后一个处理函数作为默认(也适用于超过已设定的次数)。\n * 4. 执行完成后,重置计数器和计时器。\n */\n trigger(data) {\n this.count++;\n if (this.timer) {\n clearTimeout(this.timer);\n }\n this.timer = setTimeout(() => {\n const index = this.count - 1; // 数组索引从0开始\n // 如果没有对应的 handler,则使用最后一个 handler 做为默认行为\n const handler = this.handlers[index] || this.handlers[this.handlers.length - 1];\n handler(data, this.count);\n // 重置计数器和定时器\n this.count = 0;\n this.timer = null;\n }, this.interval);\n }\n }\n\n // 导出 MultiTap 类\n module.exports = { MultiTap };\n "],"names":["MultiTap","handlers","interval","data","index"],"mappings":"AAyBA,MAAMA,EAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaX,YAAYC,GAAUC,IAAW,KAAK;AACpC,QAAI,CAAC,MAAM,QAAQD,CAAQ,KAAKA,EAAS,SAAS;AAChD,YAAM,IAAI,MAAM,wBAAwB;AAE1C,SAAK,WAAWA,GAChB,KAAK,WAAWC,GAChB,KAAK,QAAQ,GACb,KAAK,QAAQ;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcD,QAAQC,GAAM;AACZ,SAAK,SACD,KAAK,SACP,aAAa,KAAK,KAAK,GAEzB,KAAK,QAAQ,WAAW,MAAM;AAC5B,YAAMC,IAAQ,KAAK,QAAQ;AAG3B,OADgB,KAAK,SAASA,CAAK,KAAK,KAAK,SAAS,KAAK,SAAS,SAAS,CAAC,GACtED,GAAM,KAAK,KAAK,GAExB,KAAK,QAAQ,GACb,KAAK,QAAQ;AAAA,IACrB,GAAS,KAAK,QAAQ;AAAA,EACjB;AACF;AAGD,OAAO,UAAU,EAAE,UAAAH,EAAU;"}