directive.js 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. import Vue from 'vue';
  2. // 输入的只能是数字
  3. Vue.directive('numericOnly', {
  4. bind(el) {
  5. // 找到 el 下的 input 标签
  6. const input = el.tagName === 'INPUT' ? el : el.querySelector('input');
  7. input.addEventListener('input', (e) => {
  8. // 如果输入的不是数字,则替换为空
  9. e.target.value = e.target.value.replace(/[^\d]/g, '');
  10. });
  11. },
  12. });
  13. /**
  14. * el-dialog 组件拖拽指令
  15. */
  16. Vue.directive('dialogDrag', {
  17. bind(el) {
  18. const dialog = el.querySelector('.el-dialog');
  19. const header = el.querySelector('.el-dialog__header');
  20. if (!dialog || !header) return;
  21. header.style.cursor = 'move';
  22. const resetPosition = () => {
  23. dialog.style.left = '';
  24. dialog.style.top = '';
  25. dialog.style.position = '';
  26. dialog.style.margin = '';
  27. };
  28. // 当对话框隐藏时重置其位置
  29. const observer = new MutationObserver(() => {
  30. const isHidden = window.getComputedStyle(el).display === 'none';
  31. if (isHidden) resetPosition();
  32. });
  33. // 监听 el 的 style 和 class 属性变化,以检测对话框的显示状态
  34. observer.observe(el, {
  35. attributes: true,
  36. attributeFilter: ['style'],
  37. });
  38. el.__dialogDragCleanup__ = () => observer.disconnect();
  39. header.onmousedown = (e) => {
  40. const startX = e.clientX;
  41. const startY = e.clientY;
  42. const rect = dialog.getBoundingClientRect();
  43. const startLeft = rect.left;
  44. const startTop = rect.top;
  45. const onMouseMove = (moveEvent) => {
  46. const dx = moveEvent.clientX - startX;
  47. const dy = moveEvent.clientY - startY;
  48. dialog.style.margin = 0;
  49. dialog.style.left = `${startLeft + dx}px`;
  50. dialog.style.top = `${startTop + dy}px`;
  51. dialog.style.position = 'fixed';
  52. };
  53. const onMouseUp = () => {
  54. document.removeEventListener('mousemove', onMouseMove);
  55. document.removeEventListener('mouseup', onMouseUp);
  56. };
  57. document.addEventListener('mousemove', onMouseMove);
  58. document.addEventListener('mouseup', onMouseUp);
  59. };
  60. },
  61. unbind(el) {
  62. // 清理事件监听器和观察者
  63. if (el.__dialogDragCleanup__) {
  64. el.__dialogDragCleanup__();
  65. delete el.__dialogDragCleanup__;
  66. }
  67. },
  68. });