index.mjs 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  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(
  9. value
  10. ) ? {} : value;
  11. let intervalId;
  12. let delayId;
  13. const handler = () => isFunction(value) ? value() : value.handler();
  14. const clear = () => {
  15. if (delayId) {
  16. clearTimeout(delayId);
  17. delayId = void 0;
  18. }
  19. if (intervalId) {
  20. clearInterval(intervalId);
  21. intervalId = void 0;
  22. }
  23. };
  24. const start = (evt) => {
  25. if (evt.button !== 0)
  26. return;
  27. clear();
  28. handler();
  29. document.addEventListener("mouseup", clear, { once: true });
  30. delayId = setTimeout(() => {
  31. intervalId = setInterval(() => {
  32. handler();
  33. }, interval);
  34. }, delay);
  35. };
  36. el[SCOPE] = { start, clear };
  37. el.addEventListener("mousedown", start);
  38. },
  39. unmounted(el) {
  40. if (!el[SCOPE])
  41. return;
  42. const { start, clear } = el[SCOPE];
  43. if (start) {
  44. el.removeEventListener("mousedown", start);
  45. }
  46. if (clear) {
  47. clear();
  48. document.removeEventListener("mouseup", clear);
  49. }
  50. el[SCOPE] = null;
  51. }
  52. };
  53. export { REPEAT_DELAY, REPEAT_INTERVAL, vRepeatClick };
  54. //# sourceMappingURL=index.mjs.map