import _ from '../utils' export default { bind: function (el, binding, vnode) { el.addEventListener('mousedown', handleMouseDown,{ passive: false }) function handleMouseDown (e) { let pointer = e.target.dataset.pointer //元素上绑定的方法名 if (!pointer) { return } e && e.stopPropagation() let zone = el.parentNode let setting = vnode.context.setting let currentIndex = vnode.context.index let container = _.getOffset(zone.parentNode) let itemInfo = { width: _.getOffset(zone).width || 0, height: _.getOffset(zone).height || 0, top: setting.topPer * container.height || 0, left: setting.leftPer * container.width || 0 } let preX = _.getPageX(e) let preY = _.getPageY(e) let flag // Hide the info displayed by hover vnode.context.handlehideZone(true) window.addEventListener('mousemove', handleChange,{ passive: false }) window.addEventListener('mouseup', handleMouseUp,{ passive: false }) function handleChange (e) { e && e.preventDefault() flag = true let moveX = _.getPageX(e) - preX let moveY = _.getPageY(e) - preY preX = _.getPageX(e) preY = _.getPageY(e) // Handling the situation when different dragging points are selected let styleInfo = _[pointer](itemInfo, moveX, moveY)//调用对应的方法 // Boundary value processing itemInfo = _.dealEdgeValue(itemInfo, styleInfo, container, vnode.context.$parent.zones, currentIndex) Object.assign(zone.style, { top: `${itemInfo.top}px`, left: `${itemInfo.left}px`, width: `${itemInfo.width}px`, height: `${itemInfo.height}px` }) } function handleMouseUp () { if (flag) { flag = false let perInfo = { topPer: _.decimalPoint(itemInfo.top / container.height), leftPer: _.decimalPoint(itemInfo.left / container.width), widthPer: _.decimalPoint(itemInfo.width / container.width), heightPer: _.decimalPoint(itemInfo.height / container.height) } vnode.context.changeInfo(perInfo) // 兼容数据无变更情况下导致 computed 不更新,数据仍为 px 时 resize 出现的问题 Object.assign(zone.style, { top: `${itemInfo.top}px`, left: `${itemInfo.left}px`, width: `${itemInfo.width}px`, height: `${itemInfo.height}px` }) } // Show the info vnode.context.handlehideZone(false) window.removeEventListener('mousemove', handleChange) window.removeEventListener('mouseup', handleMouseUp) } } el.$destroy = () => el.removeEventListener('mousedown', handleMouseDown) }, unbind: function (el) { el.$destroy() } }