From 8845e27acdbbd9778b29148844a44498a56c05ea Mon Sep 17 00:00:00 2001 From: linfso Date: Mon, 7 Jul 2025 10:07:52 +0800 Subject: [PATCH] md --- src/components/XdTable/index.vue | 146 ++++++++++-------- .../emis/emisCustomerUser/moneyUserList.vue | 4 +- 2 files changed, 85 insertions(+), 65 deletions(-) diff --git a/src/components/XdTable/index.vue b/src/components/XdTable/index.vue index c5571a00..f143d27c 100644 --- a/src/components/XdTable/index.vue +++ b/src/components/XdTable/index.vue @@ -95,9 +95,9 @@ -
+
- + @@ -270,15 +270,18 @@ export default { // 鼠标按下事件 tbBodyDiv.onmousedown = function (ev) { - console.log('===tbBodyDiv.onmousedown===>') var evt = window.event || arguments[0]; var flag = true; + // 鼠标右键菜单,并且记录当前位置 if(evt.button == 2){ flag=false; - if(vnode.context.multipleSelection&&vnode.context.multipleSelection.length>0) + if( + vnode.context.multipleSelection + &&vnode.context.multipleSelection.length>0 + && vnode.context.mouseInScope + ) { - // 记住当前单元格位置 vnode.context.currentOdiv=oDiv; vnode.context.currentCell=evt.target; @@ -286,20 +289,21 @@ export default { const currentCellInfo=getCellPosition(evt.target); vnode.context.currentCellInfo=currentCellInfo; - // 显示右键菜单 - showContextMenu(evt); + // 绑定右键菜单 + bindRightContextMenu(evt); } return; } + // 清除已有选择 let selNodes=document.querySelectorAll(".seled"); if(selNodes!=null&&selNodes.length>0){ for (var i = 0; i < selNodes.length; i++) { selNodes[i].classList.remove("seled") } } - + vnode.context.contextVisible=false; // 增加图层 var xdTableObj = document.getElementById(vnode.context.tableId); @@ -333,41 +337,47 @@ export default { vnode.context.clearEventBubble(evt); // //打开开关 vnode.context.mouseflag = true; + const tbBodyDivRect = tbBodyDiv.getBoundingClientRect(); // //鼠标拖动时画框 document.onmousemove = function (ev) { - - const tbBodyDivRect = tbBodyDiv.getBoundingClientRect(); - console.log("===document.onmousemove==>",ev,tbBodyDivRect); - evt = window.event || arguments[0]; _x = (evt.x || evt.clientX); _y = (evt.y || evt.clientY); - //为了确定是点击事件还是移动事件 - if(_x(tbBodyDivRect.x+tbBodyDivRect.width) + || _y(tbBodyDivRect.y+tbBodyDivRect.height) + ){ + vnode.context.isTableFocused=false; + vnode.context.mouseInScope=false; + // cancelRightContextMenu(); + return; + } + // if(!tbBodyDiv.contains(document.activeElement)){ + // vnode.context.isTableFocused=false; + // vnode.context.mouseInScope=false; + // return; + // } + vnode.context.isTableFocused=true; + vnode.context.mouseInScope=true; if(Math.abs(_x - startX)<5 && Math.abs(_y - startY)<5){ // setMouseCellSelect(evt.target); // setMouseRowSelect(evt.target); return; } - if(flag){ + // + if(flag&&vnode.context.mouseflag){ vnode.context.multipleSelection=[]; // console.log("===fileNodes.length==>",fileNodes.length); // 只选取范围内的数据 for (var i = 0; i < fileNodes.length; i++) { - // console.log("===fileNodes==>",i); if (fileNodes[i].className.indexOf("el-table__cell") != -1) { fileNodes[i].classList.remove("seled"); + // console.log("===selList.length==>",selList.length); selList.push(fileNodes[i]); } } @@ -455,28 +465,14 @@ export default { vnode.context.clearEventBubble(evt); }; - function showContextMenu(event){ + function bindRightContextMenu(evt){ var xdTableObj = document.getElementById(vnode.context.tableId); - xdTableObj.addEventListener("contextmenu", function(event) { - - vnode.context.clearEventBubble(event) - - var menu = xdTableObj.querySelector("#contextMenu"); - // console.log("====>xdTableObj====>",xdTableObj); - // console.log("====>menu====>",menu); - - let tbPosRect=getTablePosition(xdTableObj); - menu.style.left = (event.clientX-tbPosRect.left+5) + "px"; - menu.style.top = (event.clientY-tbPosRect.top-35) + "px"; - menu.style.display = "block"; - menu.style.zIndex = 3000; - vnode.context.contextVisible=true; - event.preventDefault(); - }); - + xdTableObj.addEventListener("contextmenu", vnode.context.handleOnContextMenu); } - function cancelContextMenu() { - document.oncontextmenu = new Function("event.returnValue=true"); + function cancelRightContextMenu() { + var xdTableObj = document.getElementById(vnode.context.tableId); + xdTableObj.removeEventListener('contextmenu',vnode.context.handleOnContextMenu) + // document.oncontextmenu = new Function("event.returnValue=true"); } // 获取el-table元素的位置信息 function getTablePosition(tbDom) { @@ -515,10 +511,13 @@ export default { } else{ cell.className = cell.className + " seled"; + vnode.context.mouseInScope=true; } const cellInfo=getCellPosition(cell); vnode.context.multipleSelection=[]; vnode.context.multipleSelection.push(cellInfo); + + // 行样式设置 // const refTableObj=vnode.context.getInstance(); @@ -611,6 +610,8 @@ export default { //指令中确定的时候是鼠标按下事件 mouseflag: false, + // 鼠标位置在表格区域内 + mouseInScope: false, //选中的数组 multipleSelection: [], multipleRowSelection:[], @@ -676,17 +677,19 @@ export default { }, }, mounted() { - // console.log("===>xdtabe mounted==111->"); if(this.saveStorageName&&this.saveStorageName!=undefined&&this.saveStorageName!=''){ this.isNeedDbSaveTpl=true; }else{ this.fullUrl=window.location.origin + window.location.pathname + window.location.search + window.location.hash; this.pageId=this.MD5(this.fullUrl); this.saveStorageName=this.pageId; - // // console.log("===> this.fullUrl==>", this.fullUrl,this.saveStorageName) this.isNeedDbSaveTpl=false; } + // 监听全局焦点变化事件 + // document.addEventListener('focusin', this.handleGlobalFocusIn); + // document.addEventListener('focusout', this.handleGlobalFocusOut); + this.initKeyDownEvent(); // 初始化默认模版到本地 this.initDefaultTplList(); @@ -694,9 +697,6 @@ export default { this.updateTable() this.tableDom=this.getTableDom(); - // 监听 ctrl+c键盘事件 - let that=this; - }, beforeDestroy () { document.removeEventListener('keydown', this.handleGlobalKeydown) @@ -709,25 +709,52 @@ export default { return Math.random().toString(36).substring(3,10); }, + // 处理全局焦点进入事件 + handleGlobalFocusIn(event) { + // var tableEl = document.getElementById(this.tableId); + // const hasFocus = tableEl.contains(event.target); + // console.log("===>hasFocus===>",hasFocus,tableEl,event.target); + // 表格获得焦点 + // if (hasFocus && !this.isTableFocused) { + // this.tableHasFocus = true; + // this.$message({ + // message: '表格已获得焦点', + // type: 'success', + // duration: 1500 + // }); + // } + }, + + handleXdTableBlur(){ + this.isTableFocused=false; + console.log("===>handleXdTableBlur===>",this.isTableFocused); + }, + // 全局键盘事件处理 handleGlobalKeydown(event) { - // console.log("===>handleGlobalKeydown===>",event) - // 检查是否按下了Ctrl+C组合键 + event = event||window.event; if ((event.ctrlKey || event.metaKey) && event.key === 'c') { // 如果焦点在表格内,处理复制操作 if (this.isTableFocused) { event.preventDefault(); this.handleCopySelect(); - // e = e||window.event; - // if(e.ctrlKey&&e.code=="KeyC"){ - // that.handleCopySelect(e); - // return false; - // } } } }, - + handleOnContextMenu(event){ + // vnode.context.clearEventBubble(event) + var xdTableObj = document.getElementById(this.tableId); + this.clearEventBubble(event) + var menu = xdTableObj.querySelector("#contextMenu"); + let tbPosRect=this.getTablePosition(xdTableObj); + menu.style.left = (event.clientX-tbPosRect.left+5) + "px"; + menu.style.top = (event.clientY-tbPosRect.top-35) + "px"; + menu.style.display = "block"; + menu.style.zIndex = 3000; + this.contextVisible=true; + event.preventDefault(); + }, clearSelection(){ this.$nextTick(()=>{ this.$refs.table.$refs.elTable.clearSelection(); @@ -735,11 +762,9 @@ export default { }, initKeyDownEvent(){ - // console.log('===initKeyDownEvent===>') document.addEventListener('keydown', this.handleGlobalKeydown ); }, removeKeyDownEvent(){ - // console.log('===removeKeyDownEvent===>') document.removeEventListener('keydown', this.handleGlobalKeydown ); }, @@ -939,12 +964,7 @@ export default { }); selStr=this.trimTabChar(selStr,'\t',''); // 去除两端空格 - this.currentSelectStr=selStr; - this.isTableFocused=true; - - }else{ - this.isTableFocused=false; } // this.$emit('handleSelect',this.multipleSelection) @@ -1270,8 +1290,6 @@ export default { } } list=list2; - // console.log("===>list=1111=>",list); - this.storageList = list }, // 根据缓存的数组进行渲染表格 diff --git a/src/views/emis/emisCustomerUser/moneyUserList.vue b/src/views/emis/emisCustomerUser/moneyUserList.vue index f9ce4c43..7e86c029 100644 --- a/src/views/emis/emisCustomerUser/moneyUserList.vue +++ b/src/views/emis/emisCustomerUser/moneyUserList.vue @@ -240,11 +240,13 @@ import EmisUserSimplePicker2 from '@/views/emis/EmisBaseTools/EmisUserSimplePick import EmpNamePicker1 from '@/views/emis/EmisBaseTools/EmpNamePicker.vue'; import EmpNamePicker2 from '@/views/emis/EmisBaseTools/EmpNamePicker.vue'; +import XdTable3 from '@/components/XdTable/index3.vue'; + export default { name: "MoneyUserList", components: {AirTable, EmpNamePicker1,EmpNamePicker2,elDateSimplePicker,moneyUserForm ,CountryPicker, EmisSiteSimplePicker,ProvincePicker,CityPicker, - EmisUserSimplePicker0,EmisUserSimplePicker1,EmisUserSimplePicker2 + EmisUserSimplePicker0,EmisUserSimplePicker1,EmisUserSimplePicker2,XdTable3 }, dicts: [ ],