index.mjs 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. import { isFunction } from '@vue/shared';
  2. const REPEAT_INTERVAL = 100;
  3. const REPEAT_DELAY = 600;
  4. const SCOPE = "_RepeatClick";
  5. const vRepeatClick = {
  6. beforeMount(el, binding) {
  7. const value = binding.value;
  8. const { interval = REPEAT_INTERVAL, delay = REPEAT_DELAY } = isFunction(value) ? {} : value;
  9. let intervalId;
  10. let delayId;
  11. const handler = () => isFunction(value) ? value() : value.handler();
  12. const clear = () => {
  13. if (delayId) {
  14. clearTimeout(delayId);
  15. delayId = void 0;
  16. }
  17. if (intervalId) {
  18. clearInterval(intervalId);
  19. intervalId = void 0;
  20. }
  21. };
  22. const start = (evt) => {
  23. if (evt.button !== 0)
  24. return;
  25. clear();
  26. handler();
  27. document.addEventListener("mouseup", clear, { once: true });
  28. delayId = setTimeout(() => {
  29. intervalId = setInterval(() => {
  30. handler();
  31. }, interval);
  32. }, delay);
  33. };
  34. el[SCOPE] = { start, clear };
  35. el.addEventListener("mousedown", start);
  36. },
  37. unmounted(el) {
  38. if (!el[SCOPE])
  39. return;
  40. const { start, clear } = el[SCOPE];
  41. if (start) {
  42. el.removeEventListener("mousedown", start);
  43. }
  44. if (clear) {
  45. clear();
  46. document.removeEventListener("mouseup", clear);
  47. }
  48. el[SCOPE] = null;
  49. }
  50. };
  51. export { REPEAT_DELAY, REPEAT_INTERVAL, vRepeatClick };
  52. //# sourceMappingURL=index.mjs.map