index.js 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. /* eslint-disable no-useless-escape */
  2. import Vue from 'vue'
  3. Vue.directive('noMoreClick', {
  4. inserted (el, binding) {
  5. el.addEventListener('click', e => {
  6. el.classList.add('is-disabled')
  7. el.disabled = true
  8. setTimeout(() => {
  9. el.disabled = false
  10. el.classList.remove('is-disabled')
  11. }, 2000)
  12. })
  13. }
  14. })
  15. /*
  16. * 使用方法
  17. * 将以下代码复制到一个js文件中,然后在入口文件main.js中import引入即可;
  18. * 给elementUI的dialog上加上 v-dialogDrag 指令就可以实现弹窗的全屏和拉伸了。
  19. * 给dialog设置 :close-on-click-modal="false" , 禁止点击遮罩层关闭弹出层
  20. * 如果是form表单,不要将提交等按钮放置el-form-item,以免在上下拉伸时被隐藏
  21. */
  22. // v-dialogDrag: 弹窗拖拽+水平方向伸缩
  23. // v-dialogDrag: 弹窗拖拽
  24. Vue.directive('dialogDrag', {
  25. bind (el, binding, vnode, oldVnode) {
  26. const dialogHeaderEl = el.querySelector('.el-dialog__header')
  27. const dragDom = el.querySelector('.el-dialog')
  28. dialogHeaderEl.style.cursor = 'move'
  29. // 获取原有属性 ie dom元素.currentStyle 火狐谷歌 window.getComputedStyle(dom元素, null);
  30. const sty = dragDom.currentStyle || window.getComputedStyle(dragDom, null)
  31. dialogHeaderEl.onmousedown = (e) => {
  32. // 鼠标按下,计算当前元素距离可视区的距离
  33. const disX = e.clientX - dialogHeaderEl.offsetLeft
  34. const disY = e.clientY - dialogHeaderEl.offsetTop
  35. // 获取到的值带px 正则匹配替换
  36. let styL, styT
  37. // 注意在ie中 第一次获取到的值为组件自带50% 移动之后赋值为px
  38. if (sty.left.includes('%')) {
  39. styL = +document.body.clientWidth * (+sty.left.replace(/\%/g, '') / 100)
  40. styT = +document.body.clientHeight * (+sty.top.replace(/\%/g, '') / 100)
  41. } else {
  42. styL = +sty.left.replace(/\px/g, '')
  43. styT = +sty.top.replace(/\px/g, '')
  44. };
  45. document.onmousemove = function (e) {
  46. // 通过事件委托,计算移动的距离
  47. const l = e.clientX - disX
  48. const t = e.clientY - disY
  49. // 移动当前元素
  50. dragDom.style.left = `${l + styL}px`
  51. dragDom.style.top = `${t + styT}px`
  52. // 将此时的位置传出去
  53. // binding.value({x:e.pageX,y:e.pageY})
  54. }
  55. document.onmouseup = function (e) {
  56. document.onmousemove = null
  57. document.onmouseup = null
  58. }
  59. }
  60. }
  61. })
  62. // v-dialogDragWidth: 弹窗宽度拖大 拖小
  63. Vue.directive('dialogDragWidth', {
  64. bind (el, binding, vnode, oldVnode) {
  65. const dragDom = binding.value.$el.querySelector('.el-dialog')
  66. el.onmousedown = (e) => {
  67. // 鼠标按下,计算当前元素距离可视区的距离
  68. const disX = e.clientX - el.offsetLeft
  69. document.onmousemove = function (e) {
  70. e.preventDefault() // 移动时禁用默认事件
  71. // 通过事件委托,计算移动的距离
  72. const l = e.clientX - disX
  73. dragDom.style.width = `${l}px`
  74. }
  75. document.onmouseup = function (e) {
  76. document.onmousemove = null
  77. document.onmouseup = null
  78. }
  79. }
  80. }
  81. })