UNPKG

any-grid-layout

Version:

This template should help get you started developing with Vue 3 in Vite. The template uses Vue 3 `<script setup>` SFCs, check out the [script setup docs](https://v3.vuejs.org/api/sfc-script-setup.html#sfc-script-setup) to learn more.

613 lines (564 loc) 33.5 kB
import {merge, parseContainer, parseItem, throttle} from "@/units/grid/other/tool.js"; import {defaultStyle} from "@/units/grid/style/defaultStyle.js"; import TempStore from "@/units/grid/other/TempStore.js"; import Item from "@/units/grid/Item.js"; import Sync from "@/units/grid/other/Sync.js"; const tempStore = TempStore.containerStore export default class EditEvent { /** 用于事件委托触发的函数集 */ static _eventEntrustFunctor = { itemResize: { doResize: throttle((ev) => { const mousedownEvent = tempStore.mousedownEvent const fromItem = tempStore.fromItem // if (ev.target === this.element) return if (fromItem === null || mousedownEvent === null) return // console.log('doResize'); //----------------------------------------// // let offset = { // 偏离鼠标 resize 的像素 // x: fromItem.element.offsetX + fromItem.__temp__.clientWidth, // y: fromItem.element.offsetY + fromItem.__temp__.clientHeight // } // console.log(offset); // console.log(ev.target); if (tempStore.cloneElement === null) { tempStore.cloneElement = fromItem.element.cloneNode(true) tempStore.cloneElement.classList.add('grid-clone-el') if (tempStore.cloneElement) tempStore.fromContainer.element.appendChild(tempStore.cloneElement) fromItem.updateStyle({transition: 'none'}, tempStore.cloneElement) fromItem.updateStyle({opacity: tempStore.fromContainer.style.opacity}) } //-----------------判断Item是左右平移还是上下平移---------------------// const resized = { w: Math.ceil(tempStore.cloneElement.clientWidth / (fromItem.size[0] + fromItem.margin[0])) || 1, h: Math.ceil(tempStore.cloneElement.clientHeight / (fromItem.size[1] + fromItem.margin[1])) || 1, } merge(fromItem.pos, resized) const pos = fromItem.pos //----------------检测改变的大小是否符合用户限制 -------------// if ((resized.w + fromItem.pos.x) > pos.col) fromItem.pos.w = pos.col - pos.x + 1 //item调整大小时在容器右边边界超出时进行限制 if (pos.w < pos.minW) fromItem.pos.w = pos.minW if (pos.w > pos.maxW && pos.maxW !== Infinity) fromItem.pos.w = pos.maxW if (pos.h < pos.minH) fromItem.pos.h = pos.minH if (pos.h > pos.maxH && pos.maxH !== Infinity) fromItem.pos.h = pos.maxH //---------------------resize 增减长宽结束--------------// // console.log(this.minWidth(),this.minHeight(),this.maxWidth(),this.maxHeight()); fromItem.pos.static = true // 使其变成静态不会在调整中被动态改变x,y照成错位,调整后即刻改了回来 // console.log(fromItem.__temp__.clientWidth ,fromItem.__temp__.clientHeight); let width = ev.pageX - mousedownEvent.pageX + fromItem.__temp__.clientWidth let height = ev.pageY - mousedownEvent.pageY + fromItem.__temp__.clientHeight // console.log(ev.target,width,height); if (width > fromItem.maxWidth()) width = fromItem.maxWidth() if (height > fromItem.maxHeight()) height = fromItem.maxHeight() if (width < fromItem.minWidth()) width = fromItem.minWidth() if (height < fromItem.minHeight()) height = fromItem.minHeight() // console.log(width,height); fromItem.updateStyle({ width: width + 'px', height: height + 'px', }, tempStore.cloneElement) if (fromItem.__temp__.resized.w !== resized.w || fromItem.__temp__.resized.h !== resized.h) { // 只有改变Item的大小才进行style重绘 fromItem.__temp__.resized = resized fromItem.updateStyle(fromItem._genLimitSizeStyle()) tempStore.fromContainer.updateLayout() } }, 15), mouseup: (ev) => { const fromItem = tempStore.fromItem if (fromItem === null) return //----------------------------------------// fromItem.__temp__.clientWidth = fromItem.nowWidth() fromItem.__temp__.clientHeight = fromItem.nowHeight() fromItem.pos.static = fromItem.__temp__.static fromItem.updateStyle(fromItem._genItemStyle()) tempStore.isResizing = false tempStore.isLeftMousedown = false tempStore.fromContainer.engine.updateLayout() }, }, check: { resizeOrDrag: (ev) => { const container = parseContainer(ev) if (!container) return if (tempStore.fromItem?.draggable && tempStore.dragOrResize === 'drag') { tempStore.isDragging = true tempStore.isResizing = false return 'drag' } else if (tempStore.fromItem?.resize && tempStore.dragOrResize === 'resize') { tempStore.isResizing = true tempStore.isDragging = false return 'resize' } } }, cursor: { cursor: 'grab', grab: function (ev) { const container = parseContainer(ev) if (!container) return container.updateStyle({cursor: 'grab'}, document.body, true) this.cursor = 'grab' }, grabbing: function (ev) { const container = parseContainer(ev) if (!container) return container.updateStyle({cursor: 'grabbing'}, document.body, true) this.cursor = 'grabbing' }, }, prevent: { default: (ev) => ev.preventDefault(), false: (ev) => false, }, moveOuterContainer: { // 用于跨容器Item通信,转移的各种处理 /**用于嵌套情况两个【相邻】Container的直接过渡 * @param {Container} fromContainer 从那个Container中来 * @param {Container} toContainer 到哪个Container中去 * 在嵌套容器中假设父容器为A,被嵌套容器为B, 如果A到 B 则fromContainer为A,toContainer为B,此时dragItem属于A, * 如果A到 B 此时鼠标不抬起继续从B返回A 则fromContainer为 B,toContainer为A,此时dragItem还是属于A,通过dragItem的归属能确定跨容器时候是否鼠标被抬起 * */ leaveToEnter: function (fromContainer, toContainer) { if (!tempStore.isDragging || !fromContainer || !toContainer) return let fromItem = tempStore.fromItem let moveItem = tempStore.moveItem let dragItem = tempStore.moveItem !== null ? moveItem : fromItem // console.log(fromContainer,toContainer,dragItem); //------------固定顺序-------------// fromItem._mask_(false) // 相邻清除遮罩防止遮挡嵌套容器内的Item操作 tempStore.crossContainerItem = true // 和 mouseenter 同代码同效果 this.mouseleave(null, fromContainer) if (dragItem.container === toContainer) { tempStore.fromContainer = toContainer return } if (toContainer.isNesting) { // 修复快速短距重复拖放情况下概率识别成父容器移动到子容器当Item的情况 if (toContainer.parentItem === dragItem) return } this.mouseenter(null, toContainer) // 如果现在点击嵌套容器空白部分选择的Item会是父容器的Item,按照mouseenter逻辑对应不可能删除当前Item(和前面一样是fromItem)在插入 // 接上:因为这样是会直接附加在父级Container最后面,这倒不如什么都不做直接等待后面逻辑执行换位功能 // fromContainer.updateLayout() // toContainer.updateLayout() }, mouseenter: function (ev, container = null) { // if (ev === null && container === null) return // console.log(container,tempStore.fromItem,tempStore.moveItem); if (!container && ev.target._isGridContainer_) { ev.preventDefault() container = ev.target._gridContainer_ } console.log(container); // if (container && container.isNesting ) { // 如果是个嵌套Item 进来后该嵌套Item设置成不动 // container.parentItem.pos.static = true // } let fromItem = tempStore.fromItem const moveItem = tempStore.moveItem if (!tempStore.isDragging || fromItem === null || !container) return let dragItem = tempStore.moveItem !== null ? moveItem : fromItem tempStore.crossContainerItem = true // 进入Container时 moveItem为null,此时指定告诉这是第一次进入,下一次的Item换位使用移动到鼠标位置Item前而不是两两交换 try { dragItem.pos.el = null // 要将原本pos中的对应文档清除掉换克隆后的 let dragItemElement = fromItem.element dragItem.unmount() // 先成功移除原来容器中Item后再在新容器新添加Item,移除不成功不添加 const newItem = new Item({ ...dragItem.pos, draggable: dragItem.draggable, resize: dragItem.resize, el: dragItemElement, }) container.add(newItem) newItem.mount() dragItem.element.style.backgroundColor = 'red' dragItem.remove() // console.log(container); if (dragItem.container !== container) dragItem.container.engine.updateLayout() // dragItem会跟随进入不同容器,每次离开刷新 tempStore.moveItem = newItem } catch (e) { } }, mouseleave: function (ev, container = null) { // container = container ? container : parseContainer(ev) let fromItem = tempStore.fromItem if (!tempStore.isDragging || fromItem === null || !container) return tempStore.crossContainerItem = true // 和 mouseenter 同代码同效果 if (container && container.isNesting) { // 如果是个嵌套Item 离开该嵌套后该嵌套Item重置到可以进行 //动态交换 === false 不可动态交换 === true // 这里取舍选了不可 // container.parentItem.pos.static = !container.nestedOutExchange } container.engine.updateLayout() }, mouseup: (ev) => { // 容器之间交换Item用 const container = parseContainer(ev) let fromItem = tempStore.fromItem tempStore.moveItem = null if (container && container.isNesting) { container.parentItem.pos.static = false } } }, itemDrag: { mouseup: (ev) => { // 移动经过小于一个容器用,容器内或者容器外鼠标抬起恢复原状 const container = parseContainer(ev) let fromItem = tempStore.fromItem if (!container) return if (container !== tempStore.fromContainer) fromItem = tempStore.moveItem tempStore.isLeftMousedown = false tempStore.isDragging = false fromItem?.updateStyle(defaultStyle.itemDragUp) container.engine.updateLayout() }, mouseenter: throttle((ev) => { // 通过move事件检测是否进入该Item,这里不用DomMouseenterEvent是因为只能触发一次,这里希望触发多次 ev.stopPropagation() const container = parseContainer(ev) if (!container) return let fromItem = tempStore.fromItem const toItem = tempStore.toItem const moveItem = tempStore.moveItem const mousedownEvent = tempStore.mousedownEvent if (!tempStore.isDragging) return if (fromItem === null || toItem === null || mousedownEvent === null) return if (toItem === fromItem) return // 克隆元素经过隔壁元素互换的时候动画过程概率会再fromItem触发经过鼠标造成两次触发该事件 //------计算鼠标的移动速度,太慢不做操作(保留该注释,后面可能会使用属性sensitivity)-----------// let start, startY, startX let now = Date.now(); startX = ev.screenX startY = ev.screenY let dt = now - tempStore.mouseSpeed.timestamp; let distanceX = Math.abs(startX - tempStore.mouseSpeed.endX); let distanceY = Math.abs(startY - tempStore.mouseSpeed.endY); let distance = distanceX > distanceY ? distanceX : distanceY // 选一个移动最多的方向 let speed = Math.round(distance / dt * 1000); // console.log(dt, distance, speed); tempStore.mouseSpeed.endX = startX; tempStore.mouseSpeed.endY = startY; tempStore.mouseSpeed.timestamp = now; if (container.size[0] < 30 || container.size[1] < 30) { if (distance < 5) return } else if (distance < 20 || speed < 50) return else if (distance < ((container.size[0] > container.size[1] ? container.size[1] : container.size[0]) / 4)) return; if (!container.exchangeLock) { if (container.isNesting) { // 如果是个嵌套Item 移动进去被嵌套容器后该嵌套容器所在的父级Item变成静态,知道鼠标抬起释放 container.parentItem.pos.static = container.parentItem !== tempStore.fromItem } Sync.run(() => { if (container.engine.items[toItem.i] === toItem) { container.exchangeLock = true setTimeout(() => { container.exchangeLock = false }, 150) } let dragItem = tempStore.moveItem !== null ? moveItem : fromItem if (dragItem === null) return if (tempStore.crossContainerItem) { // 如果是第一次跨容器操作 container.engine.move(dragItem, toItem.i) tempStore.crossContainerItem = false } else { container.engine.exchange(dragItem, toItem) } container.engine.updateLayout() }) } //------判断Item是左右平移还是上下平移的算法,二分过半判断(初始算法,不如简单版来的实在,留着或许以后有用)------// // console.log('move'); // let left // let top // if (tempStore.fromContainer === toItem.container) { // left = ev.pageX - mousedownEvent.pageX + tempStore.offsetPageX // top = ev.pageY - mousedownEvent.pageY + tempStore.offsetPageY // } else { // left = ev.pageX - container.element.offsetLeft // top = ev.pageY - container.element.offsetTop // } // console.log(left / (container.size[0] + container.margin[0]), top / (container.size[1] + container.margin[1])); // let moveBoundaryX = document.body.clientWidth / (container.size[0] + container.margin[0]) // let moveBoundaryY = document.body.clientHeight / (container.size[1] + container.margin[1]) // 要反应灵敏一点 修改 sensitivity值 // console.log(left,top); // console.log(toItem.pos.x - 1 + (toItem.pos.w / container.sensitivity),moveBoundaryX); // if (dragItem.pos.x > toItem.pos.x && (toItem.pos.x - 1 + (toItem.pos.w - (toItem.pos.w * container.sensitivity)) >= moveBoundaryX)) { // // 左移动,希望 toItem.pos.w / sensitivity等这种偏移大一点,越大越接近右边左移也更快,总体感觉就灵敏 // container.engine.move(dragItem, dragItem.i, toItem.i) // } else if (dragItem.pos.x < toItem.pos.x && (toItem.pos.x - 1 + (toItem.pos.w * container.sensitivity) <= moveBoundaryX)) { // // 右移动 希望XX偏移小一点 (toItem.pos.w - (toItem.pos.w / sensitivity)) 减去是因为和左移相反,扣除左移距离left部分便能和toItem中形成轴对称点 // container.engine.move(dragItem, dragItem.i, toItem.i) // } else if (dragItem.pos.y > toItem.pos.y && (toItem.pos.y - 1 + (toItem.pos.h - (toItem.pos.h * container.sensitivity)) >= moveBoundaryY)) { // // 上移动 希望XX偏移大一点 // container.engine.exchange(dragItem, toItem) // } else if (dragItem.pos.y < toItem.pos.y && (toItem.pos.y - 1 + (toItem.pos.h * container.sensitivity) <= moveBoundaryY)) { // // 下移动 希望XX偏移小一点 // container.engine.exchange(dragItem, toItem) // } //------------------------------------------------------------------------------------// }, 150), mousemove: (ev) => { // 对drag克隆元素的操作 ev.stopPropagation() const container = parseContainer(ev) // if (!container) return const mousedownEvent = tempStore.mousedownEvent const fromItem = tempStore.fromItem const moveItem = tempStore.moveItem const fromContainer = tempStore.fromContainer // if (ev.target === this.element) console.log(ev.target); if (mousedownEvent === null || fromItem === null) return let dragItem = tempStore.moveItem !== null ? moveItem : fromItem if (tempStore.cloneElement === null) { tempStore.cloneElement = dragItem.element.cloneNode(true) tempStore.cloneElement.classList.add('grid-clone-el') document.body.appendChild(tempStore.cloneElement) // 直接添加到body中后面定位省心省力 dragItem.updateStyle({opacity: (container?.style.opacity || '1')}) dragItem.updateStyle({ pointerEvents: 'none', transform: container?.style.transform }, tempStore.cloneElement) } // const left = ev.pageX - mousedownEvent.pageX + tempStore.offsetPageX // const top = ev.pageY - mousedownEvent.pageY + tempStore.offsetPageY // console.log(tempStore.cloneElement.style.transitionProperty,tempStore.cloneElement.style.transitionDuration); const left = ev.pageX - mousedownEvent.offsetX const top = ev.pageY - mousedownEvent.offsetY // console.log(ev.pageY ,mousedownEvent.offsetY); // console.log(left,top); // TODO 这里点击内嵌Item会无限增加高度 dragItem.updateStyle({ left: left + 'px', top: top + 'px', zIndex: '9999', // height: mousedownEvent.target.clientHeight + 'px', // width: mousedownEvent.target.clientWidth + 'px', }, tempStore.cloneElement) } } } static _eventPerformer = { item: { mouseenter: (ev) => { // 主要用于处理跨Container中的Item互换,和其他事件不同的是这里fromItem 和 toItem 可能来自不同容器 ev.stopPropagation() // console.log(ev); const container = parseContainer(ev) const toItem = tempStore.toItem if (!container) return if (ev.target._gridItem_) { // const toContainer = ev.target._gridItem_.container // 可能是自己,也可能是其他容器 tempStore.toItem = parseItem(ev) } if (tempStore.toItem === null) return false if (tempStore.isDragging) EEF.itemDrag.mouseenter(ev) }, }, container: { mousedown: (ev) => { // ev.stopPropagation() // console.log(this.__store__.fromItem ); // timeOutEvent = setTimeout(() => { // 监控长按事件 // clearTimeout(timeOutEvent) // // console.log('长按了'); // }, 0) // if (ev.target === this.element) console.log(ev.target); const container = parseContainer(ev) // if (!container) return const isHandleResize = ev.target.className === 'resizable-handle' if (isHandleResize) { // 用于resize tempStore.dragOrResize = 'resize' for (let i = 0; i < container.engine.items.length; i++) { if (container.engine.items[i]._resizeTabEl === ev.target) { tempStore.fromItem = container.engine.items[i] break } } } else { // 用于drag tempStore.dragOrResize = 'drag' tempStore.fromItem = parseItem(ev) } //----------------------------------------------------------------// tempStore.isLeftMousedown = true tempStore.mousedownEvent = ev // console.log(ev); tempStore.fromContainer = container // console.log(container); if (tempStore.fromItem) { tempStore.fromItem._mask_(true) tempStore.fromItem.__temp__.clientWidth = tempStore.fromItem.nowWidth() tempStore.fromItem.__temp__.clientHeight = tempStore.fromItem.nowHeight() tempStore.offsetPageX = tempStore.fromItem.offsetLeft() tempStore.offsetPageY = tempStore.fromItem.offsetTop() if (EEF.check.resizeOrDrag(ev) === 'drag') { tempStore.fromItem.animation(false) EEF.cursor.grabbing(ev) } clearInterval(timeOutEvent) } //----------------------------------------------------------------// }, mousemove: throttle((ev) => { ev.stopPropagation() // console.log(this.__store__.isLeftMousedown); EEF.check.resizeOrDrag(ev) const container = parseContainer(ev) tempStore.beforeContainer = tempStore.currentContainer tempStore.currentContainer = container || null if (tempStore.isLeftMousedown) { if (tempStore.currentContainer !== null && tempStore.beforeContainer !== null) { // 表示进去了某个Container内 if (tempStore.currentContainer !== tempStore.beforeContainer) { EEF.moveOuterContainer.leaveToEnter(tempStore.beforeContainer, tempStore.currentContainer) } } else { if (tempStore.currentContainer !== null || tempStore.beforeContainer !== null) { if (tempStore.currentContainer === null) { EEF.moveOuterContainer.mouseleave(null, tempStore.beforeContainer) } if (tempStore.beforeContainer === null) { EEF.moveOuterContainer.mouseenter(null, tempStore.currentContainer) } } } // console.log(tempStore.dragOrResize); if (tempStore.isDragging) { if (EEF.cursor.cursor !== 'grabbing') EEF.cursor.grabbing(ev) // 加判断为了禁止css重绘 EEF.itemDrag.mousemove(ev) // 控制drag克隆移动 } else if (tempStore.isResizing) { EEF.itemResize.doResize(ev) } } else { if (EEF.cursor.cursor !== 'grab') EEF.cursor.grab(ev) } }, 10), mouseleave: (ev) => { ev.stopPropagation() const container = parseContainer(ev) if (!container) return if (ev.target === container.element) { } // console.log(ev); if (tempStore.isResizing) EEF.itemResize.mouseup(ev) // if (this.__store__.isDragging) EEF.itemDrag.mouseleave(ev) }, mouseup: (ev) => { const container = parseContainer(ev) if (tempStore.isResizing) EEF.itemResize.mouseup(ev) if (tempStore.isDragging) { EEF.itemDrag.mouseup(ev) EEF.moveOuterContainer.mouseup(ev) } if (EEF.cursor.cursor !== 'grab') EEF.cursor.grab(ev) //----------移除Drag或者Resize创建的克隆备份-------------// const fromItem = tempStore.fromItem const toItem = tempStore.toItem if (tempStore.cloneElement !== null) { // 清除对Item拖动或者调整大小产生的克隆对象 const gridCloneEls = document.getElementsByClassName('grid-clone-el') for (let i = 0; i < gridCloneEls.length; i++) { const gridCloneEl = gridCloneEls[i] // 两个try是二选一,这样用try有问题吗? 有问题吗? 好知道了,没问题就好 -_- try { document.body.removeChild(gridCloneEl) } catch (e) { } try { tempStore.fromContainer.element.removeChild(tempStore.cloneElement) } catch (e) { } } tempStore.cloneElement = null fromItem?.updateStyle({ opacity: '1' }) } // 清除Item限制操作的遮罩层 const maskList = document.getElementsByClassName('item-mask') for (let i = 0; i < maskList.length; i++) { const maskEl = maskList[i] maskEl.parentElement.removeChild(maskEl) } if (container) container.engine.updateLayout() fromItem?.container.engine.updateLayout() //------------------------------// // tempStore.fromItem._mask_(false) if (fromItem?.transition) fromItem?.animation(fromItem.transition) if (tempStore.fromContainer) tempStore?.fromContainer.updateStyle(tempStore?.fromContainer.genContainerStyle()) //------------------------------// clearInterval(timeOutEvent) if (container && container.isNesting) { container.parentItem.pos.static = false } tempStore.fromContainer = null tempStore.cloneElement = null tempStore.fromItem = null tempStore.toItem = null tempStore.moveItem = null tempStore.dragItemTrans = null tempStore.offsetPageX = null tempStore.offsetPageY = null tempStore.isDragging = false tempStore.isResizing = false tempStore.isLeftMousedown = false tempStore.dragOrResize = null tempStore.mousedownEvent = null } }, } static startEventFromItem(item) { item.element.addEventListener('mouseenter', EPF.item.mouseenter) } static removeEventFromItem(item) { item.element.removeEventListener('mouseenter', EPF.item.mouseenter) } /** 事件委托 */ static startEventFromContainer(container) { //-----------------------------事件委托(debug注销这里可选排查问题出因)------------------------------// container.element.addEventListener('mousedown', EPF.container.mousedown) container.element.addEventListener('mousemove', EEF.itemDrag.mouseenter) // container.element.addEventListener('mouseenter', EEF.moveOuterContainer.mouseenter) // container.element.addEventListener('mouseleave', EEF.moveOuterContainer.mouseleave) // container.element.addEventListener('contextmenu', EPF.container.mouseup) container.element.addEventListener('dragstart', EEF.prevent.default) container.element.addEventListener('selectstart', EEF.prevent.default) //--------------------------------------------------------------------------------------------// } static removeEventFromContainer(container) { container.element.removeEventListener('mousedown', EPF.container.mousedown) container.element.removeEventListener('mousemove', EEF.itemDrag.mouseenter) // container.element.removeEventListener('mouseenter', EEF.moveOuterContainer.mouseenter) // container.element.removeEventListener('mouseleave', EEF.moveOuterContainer.mouseleave) // container.element.removeEventListener('contextmenu', EEF.prevent.false) container.element.removeEventListener('dragstart', EEF.prevent.default) container.element.removeEventListener('selectstart', EEF.prevent.default) } static startGlobalEvent() { document.addEventListener('mousemove', EPF.container.mousemove) document.addEventListener('mouseup', EPF.container.mouseup) document.addEventListener('mouseleave', EPF.container.mouseleave) } static removeGlobalEvent() { document.removeEventListener('mousemove', EPF.container.mousemove) document.removeEventListener('mouseup', EPF.container.mouseup) document.removeEventListener('mouseleave', EPF.container.mouseleave) } static startEvent(container = null, item = null, eventRecord = {}) { if (container) EditEvent.startEventFromContainer(container) if (tempStore.editModeItemDragNum === 0 && tempStore.editModeItemResizeNum === 0) { EditEvent.startGlobalEvent() } if (item) { if (item.__temp__.eventRunning === false) EditEvent.startEventFromItem(item) if (eventRecord.draggable) tempStore.editModeItemDragNum++ if (eventRecord.resize) tempStore.editModeItemResizeNum++ } } static removeEvent(container = null, item = null, eventRecord = {}) { if (item) { if (!item.draggable && !item.resize) EditEvent.removeEventFromItem(item) if (!eventRecord.draggable && eventRecord.draggable !== null) { // 也不知道防止什么,反正就是特殊情况 if (tempStore.editModeItemDragNum >= 0) tempStore.editModeItemDragNum-- } if (!eventRecord.resize && eventRecord.resize !== null) { if (tempStore.editModeItemResizeNum >= 0) tempStore.editModeItemResizeNum-- } } if (container) EditEvent.removeEventFromContainer(container) if (tempStore.editModeItemDragNum === 0 && tempStore.editModeItemResizeNum === 0) { EditEvent.removeGlobalEvent() } } } const EEF = EditEvent._eventEntrustFunctor const EPF = EditEvent._eventPerformer let timeOutEvent