import _ from '../utils'
|
|
export default {
|
bind: function (el, binding, vnode) {
|
const MIN_LIMIT = _.MIN_LIMIT
|
|
el.addEventListener('mousedown', handleMouseDown, { passive: false })
|
|
function handleMouseDown(e) {
|
// console.log('additem', e)
|
e && e.preventDefault()
|
|
let itemInfo = {
|
top: _.getDistanceY(e, el),
|
left: _.getDistanceX(e, el),
|
width: 0,
|
height: 0
|
}
|
let container = _.getOffset(el)
|
|
// Only used once at the beginning of init
|
let setting = {
|
topPer: _.decimalPoint(itemInfo.top / container.height),
|
leftPer: _.decimalPoint(itemInfo.left / container.width),
|
widthPer: 0,
|
heightPer: 0
|
}
|
let preX = _.getPageX(e)
|
let preY = _.getPageY(e)
|
|
vnode.context.addItem(setting)// 这里去添加并发送了add通知,不应该发送通知
|
|
window.addEventListener('mousemove', handleChange, { passive: false })
|
window.addEventListener('mouseup', handleMouseUp, { passive: false })
|
|
function handleChange(e) {
|
e && e.preventDefault()
|
|
let moveX = _.getPageX(e) - preX
|
let moveY = _.getPageY(e) - preY
|
preX = _.getPageX(e)
|
preY = _.getPageY(e)
|
|
// Not consider the direction of movement first, consider only the lower right drag point
|
let minLimit = 0
|
// 添加热区时,判定鼠标释放时,满足(热区大于48*48时)条件时生效
|
let styleInfo = _.dealBR(itemInfo, moveX, moveY, minLimit)
|
|
// Boundary value processing 改变热区大小时边界条件的处理
|
itemInfo = _.dealEdgeValue(itemInfo, styleInfo, container, vnode.context.zones)
|
|
Object.assign(el.lastElementChild.style, {
|
top: `${itemInfo.top}px`,
|
left: `${itemInfo.left}px`,
|
width: `${itemInfo.width}px`,
|
height: `${itemInfo.height}px`
|
})
|
}
|
|
function handleMouseUp() {
|
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),
|
img: "",
|
link: "",
|
type: "",
|
title: ""
|
}
|
|
if (vnode.context.isOverRange()) {
|
vnode.context.overRange() // 判断超出个数限制,给overRange钩子抛回调
|
} else if (container.height < MIN_LIMIT && itemInfo.width > MIN_LIMIT) {
|
vnode.context.changeItem(Object.assign(perInfo, {
|
topPer: 0,
|
heightPer: 1
|
}), true)
|
} else if (container.width < MIN_LIMIT && itemInfo.height > MIN_LIMIT) {
|
vnode.context.changeItem(Object.assign(perInfo, {
|
leftper: 0,
|
widthPer: 1
|
}), true)
|
} else if (itemInfo.width > MIN_LIMIT && itemInfo.height > MIN_LIMIT) {
|
vnode.context.changeItem(perInfo, true)
|
} else {
|
// 当添加区域超出范围或小于最小区域(48*48)时触发,删除当亲绘制的热区并发送erase事件通知
|
vnode.context.eraseItem()
|
}
|
|
window.removeEventListener('mousemove', handleChange)
|
window.removeEventListener('mouseup', handleMouseUp)
|
}
|
}
|
|
el.$destroy = () => el.removeEventListener('mousedown', handleMouseDown)
|
},
|
unbind: function (el) {
|
el.$destroy()
|
}
|
}
|