<template> <!-- 鼠标右键弹出的盒子 --> <!-- 【向下展开动画,坐标平移动画】二者只可得其一 --> <div class="right-box" :style="rightStyle" v-show="rightShow" tabindex="-1" @blur="right_closeMenu2()"> <div class="right-box-2"> <div @click="right_closeMenu(); right_f5()"><i class="el-icon-caret-right"></i>刷新</div> <div @click="right_closeMenu(); right_copy()"><i class="el-icon-caret-right"></i>复制</div> <div @click="right_closeMenu(); right_close()"><i class="el-icon-caret-right"></i>关闭</div> <div @click="right_closeMenu(); right_close_other()"><i class="el-icon-caret-right"></i>关闭其它</div> <div @click="right_closeMenu(); right_close_all()"><i class="el-icon-caret-right"></i>关闭所有</div> <div @click="right_closeMenu(); right_xf()"><i class="el-icon-caret-right"></i>悬浮打开</div> <div @click="right_closeMenu(); right_window_open()"><i class="el-icon-caret-right"></i>新窗口打开</div> <div @click="right_closeMenu2();"><i class="el-icon-caret-right"></i>取消</div> </div> </div> </template> <script> module.exports = { data() { return { rightShow: false, // 右键菜单是否正在显示 rightTab: null, // 右键菜单正在操作的 tab rightStyle: { // 右键菜单的 style 样式 left: '0px', // 坐标x top: '0px', // 坐标y maxHeight: '0px' // 右键菜单的最高高度 (控制是否展开) }, } }, methods: { // 展开右键菜单 right_showMenu: function(tab, event) { this.rightTab = tab; // 绑定操作tab var e = event || window.event; this.rightStyle.left = (e.clientX + 1) + 'px'; // 设置给坐标x this.rightStyle.top = e.clientY + 'px'; // 设置给坐标y this.rightShow = true; // 显示右键菜单 this.$nextTick(function() { var foxHeight = document.querySelector('.right-box-2').offsetHeight; // 应该展开多高 this.rightStyle.maxHeight = foxHeight + 'px'; // 展开 document.querySelector('.right-box').focus(); // 获得焦点,以被捕获失去焦点事件 }); }, // 关闭右键菜单 - 立即关闭 right_closeMenu: function() { this.rightStyle.maxHeight = '0px'; this.rightShow = false; }, // 关闭右键菜单 - 带动画折叠关闭 (失去焦点和点击取消时调用, 为什么不全部调用这个? 因为其它时候调用这个都太卡了) right_closeMenu2: function() { this.rightStyle.maxHeight = '0px'; // this.rightShow = false; }, // 右键 - 刷新 right_f5: function() { this.$root.showTab(this.rightTab); // 先转到 this.$root.f5Tab(this.rightTab); }, // 右键 - 复制 right_copy: function() { this.$root.showTab({name: this.rightTab.name, url: this.$root.getTabUrl(this.rightTab)}); }, // 右键 - 悬浮 right_xf: function() { this.$root.closeTab(this.rightTab); this.$root.xfTab(this.rightTab); }, // 右键 - 新窗口打开 right_window_open: function() { // this.$root.closeTab(this.rightTab); this.$root.newWinTab(this.rightTab); }, // 右键 - 关闭 right_close: function() { if(this.rightTab == this.$root.homeTab){ return this.$message({ dangerouslyUseHTMLString: true, message: '<b>这个不能关闭哦</b>', type: 'warning', showClose: true, }); } this.$root.closeTab(this.rightTab); }, // 右键 - 关闭其它 right_close_other: function() { var root = this.$root; // 先滑到最左边 root.$refs['nav-tab-bar'].scrollX = 0; // 递归删除 var i = 0; var deleteFn = function() { // 如果已经遍历全部 if(i >= root.tabList.length) { return; } // 如果在白名单,i++继续遍历, 如果不是,递归删除 var tab = root.tabList[i]; if(tab == root.homeTab || tab == this.rightTab){ i++; deleteFn(); } else { root.closeTab(tab, function() { deleteFn(); }); } }.bind(this); deleteFn(); }, // 右键 - 关闭所有 right_close_all: function() { var root = this.$root; // 先滑到最左边 root.$refs['nav-tab-bar'].scrollX = 0; // 递归删除 var i = 0; var deleteFn = function() { // 如果已经遍历全部 if(i >= root.tabList.length) { return; } // 如果在白名单,i++继续遍历, 如果不是,递归删除 var tab = root.tabList[i]; if(tab == root.homeTab){ i++; deleteFn(); } else { root.closeTab(tab, function() { deleteFn(); }); } }.bind(this); deleteFn(); }, }, created() { } } </script> <style scoped> /* 右键菜单 样式 */ .right-box { position: fixed; z-index: 2147483647; transition: max-height 0.2s; outline:none; max-height: 0px; overflow: hidden; box-shadow: 1px 1px 2px #000; } .right-box-2{font-size: 0.8em; padding: 0.5em 0; border: 1px #aaa solid; border-radius: 1px; background-color: #FFF;} .right-box-2>div {line-height: 2.2em; padding-left: 0.7em; padding-right: 1.8em; cursor: pointer; white-space: nowrap;} .right-box-2>div:hover {background-color: #ddd;color: #2D8CF0;} .right-box-2>div i{ margin-right: 8px;} </style>