element 右键菜单
右键菜单
这是一个右键菜单的组件
<template>
<div id="dropMenu"
:style="style"
style="display: block;"
v-show="show"
@mousedown.stop <!--阻止冒泡事件-->
@contextmenu.prevent><!--阻止右键的默认事件-->
<slot></slot>
</div>
</template>
<script>
export default {
data() {
return {
triggerShowFn: () => {},
triggerHideFn: () => {},
x: null,
y: null,
style: {},
binded: false
}
},
props: {
target: null,
show: Boolean
},
mounted() {
this.bindEvents()
},
watch: {
show(show) {
if (show) {
this.bindHideEvents()
} else {
this.unbindHideEvents()
}
},
target(target) {
this.bindEvents()
}
},
methods: {
// 初始化事件
bindEvents() {
this.$nextTick(() => {
var that = this
if (!this.target || this.binded) return
this.triggerShowFn = this.contextMenuHandler.bind(this)
this.target.addEventListener('contextmenu', this.triggerShowFn)
//this.binded = true
})
},
// 取消绑定事件
unbindEvents() {
if (!this.target) return
this.target.removeEventListener('contextmenu', this.triggerShowFn)
},
// 绑定隐藏菜单事件
bindHideEvents() {
this.triggerHideFn = this.clickDocumentHandler.bind(this)
document.addEventListener('mousedown', this.triggerHideFn)
document.addEventListener('mousewheel', this.triggerHideFn)
},
// 取消绑定隐藏菜单事件
unbindHideEvents() {
document.removeEventListener('mousedown', this.triggerHideFn)
document.removeEventListener('mousewheel', this.triggerHideFn)
},
// 鼠标按压事件处理器
clickDocumentHandler(e) {
this.$emit('update:show', false) //隐藏
},
// 右键事件事件处理
contextMenuHandler(e) {
e.target.click()//这个是因为我需要获取tree节点的数据,所以我通过点击事件去获取数据
this.x = e.clientX -
this.y = e.clientY -
this.layout()
this.$emit('update:show', true) //显示
e.preventDefault()
e.stopPropagation() this.$emit('targetElement', e.target) //我还要获取右键的DOM元素进行操作
},
// 布局
layout() {
this.style = {
left: this.x + 'px',
top: this.y + 'px'
}
}
}
}
</script>
<style lang="scss">
#dropMenu {
position: absolute;
margin: ;
padding: ;
width: 80px;
height: auto;
border: 1px solid #ccc;
border-radius: 4px;
ul {
list-style: none;
margin: ;
padding: ;
li {
width: %;
text-align: center;
height: 30px;
line-height: 30px;
background: #eee;
margin-bottom: 1px;
cursor: pointer;
}
}
}
</style>
调用组件
<menu-context :target="contextMenuTarget"
:show="isShowDrop"
@update:show="(show) => isShowDrop = show"
@targetElement="getTargetElement">
<ul>
<!--按需展示按钮-->
<li @click="deleteOne"
v-show="isShowDelete">删除</li>
<li @click="add"
v-show="isShowAdd">添加</li>
<li @click="editNode"
v-show="isShowEdit">编辑</li>
<li @click="linkModels"
v-show="isShowLink">关联</li>
<li @click="move"
v-show="isShowMove">转移</li>
</ul>
</menu-context>
引入组件
import menuContext from './components/menuContext.vue'
export default {
components: {
menuContext
},
data() {
return {
//空间树数据
spaceTreeData: [],
//默认树结构的输出格式
defaultProps: {
children: 'children',
label: 'name'
},
isShowDrop: false, //右键菜单的是否显示
contextMenuTarget: null, //右键菜单的DOM对象
thisformdata: {}, //右键菜单的点击的节点对象
targetElement: {}, //右键点击的目标对象
isShowDelete: true, //是否显示菜单中的删除按钮
isShowEdit: true, //是否显示菜单中的 编辑按钮
isShowAdd: true, //是否显示菜单中的 添加按钮
isShowMove: true, //是否显示菜单中的 转移按钮
isShowLink: true //是否显示菜单中的 关联按钮
}
},
初始化
mounted() {
//dom加载完,进行目标dom的设置,直接在data中赋值,会找不到dom
this.contextMenuTarget = document.querySelector('#modelTree')
},
方法
methods: {
getTargetElement(v) {
this.targetElement = v
},
deleteOne() {
var that = this
var nodeIds = [this.thisformdata.nodeId]
this.$confirm('此操作将删除该节点及其子节点, 是否继续?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
center: true
})
.then(() => {
deleteTreeNode(that.spaceTreeId, nodeIds).then(function(res) {
console.log('deleteTreeNode', res)
if (res.success) {
that.$message('删除成功!')
that.refreshSpaceTree()
}
})
})
.catch(() => {})
},
add() {
this.append(this.thisformdata)
this.isShowDrop = false
},
editNode() {
var data = this.thisformdata
var str = "<input type='text' name='label' value='" + data.name + "'>"
var e = window.event
var text = this.targetElement
text.innerHTML = str
this.isShowDrop = false
text.lastChild.onblur = function() {
data.name = text.lastChild.value
text.innerHTML = text.lastChild.value
var that = this
var space = {
nodeId: data.nodeId,
orgnazitionalTreeID: data.orgnazitionalTreeID,
parentNodeId: data.parentNodeId,
name: data.name,
nodeType: data.nodeType
}
//发送请求修改内容=>?有问题明天要修改
modifyTreeNode(data.orgnazitionalTreeID, space).then(function(res) {
console.log('modifyTreeNode', res)
})
}
},
move() {
if (this.thisformdata.nodeType == ) {
this.$refs.modelLinkSpace.Open([this.thisformdata])
}
this.isShowDrop = false
},
linkModels() {
this.linkModel({}, this.thisformdata)
},
handleNodeClick(data) {
console.log('handleNodeClick', data)
// !核心 : 节点数据被获得
this.thisformdata = data
//按需展示不同的按钮
if (data.nodeType == && !data.children) {
this.isShowAdd = true
this.isShowLink = true
this.isShowMove = true
} else if (data.nodeType == ) {
this.isShowAdd = false
this.isShowLink = false
this.isShowMove = true
} else if (data.nodeType == && data.children && data.children[].nodeType == ) {
this.isShowAdd = false
this.isShowLink = true
this.isShowMove = true
} else if (data.nodeType == && data.children && data.children[].nodeType == ) {
this.isShowAdd = true
this.isShowLink = false
this.isShowMove = false
}
},




element 右键菜单的更多相关文章
- vue+element树形结构右键菜单
环境:vue-admin-template vue 2.6.10 element-ui 2.7.0 1.自定义组件,文件位置:src/components/mentContext <temp ...
- 基于electron+vue+element构建项目模板之【自定义标题栏&右键菜单项篇】
1.概述 开发平台OS:windows 开发平台IDE:vs code 本篇章将介绍自定义标题栏和右键菜单项,基于electron现有版本安全性的建议,此次的改造中主进程和渲染进程彼此语境隔离,通过预 ...
- jquery右键菜单
点击这里体验效果 如果要屏蔽页面原来的右键菜单,请设置disable_native_context_menu:true 以下是源代码: <!DOCTYPE html> <html&g ...
- JQuery之ContextMenu(右键菜单)
插件下载地址:http://www.trendskitchens.co.nz/jquery/contextmenu/jquery.contextmenu.r2.js压缩版:http://www.tre ...
- 在WPF中弹出右键菜单时判断鼠标是否选中该项
和上篇在WPF的TreeView中实现右键选定一样,这仍然是一个右键菜单的问题: 这个需求是在一个实现剪贴板的功能的时候遇到的:在弹出右键菜单时,如果菜单弹出位置在ListViewItem中时,我 ...
- WPF datagrid 弹出右键菜单时先选中该项
private void datagrid_PreviewMouseRightButtonDown(object sender, MouseButtonEventArgs e) { ...
- 验证实现element-ui树形控件的自定义图标及右键菜单
许久不用,element-ui已经更新至2.4.1版本.直接进入今天的正题,前提是node.js的环境还有vue及elment-ui都已经安装.由于element-ui的官方文档中介绍比较粗略,试了许 ...
- OpenLayers 3 之 加入地图鼠标右键菜单
加入右键菜单,首先我们要监听鼠标右键点击的操作,我们知道鼠标右键事件名是 contextmenu.当鼠标在 html 元素之上,点击鼠标右键,便会触发 contextmenu 事件,在 context ...
- ASP.NET Boilerplate 学习 AspNet Core2 浏览器缓存使用 c#基础,单线程,跨线程访问和线程带参数 wpf 禁用启用webbroswer右键菜单 EF Core 2.0使用MsSql/MySql实现DB First和Code First ASP.NET Core部署到Windows IIS QRCode.js:使用 JavaScript 生成
ASP.NET Boilerplate 学习 1.在http://www.aspnetboilerplate.com/Templates 网站下载ABP模版 2.解压后打开解决方案,解决方案目录: ...
随机推荐
- Android studio: Android Studio 3.5格式化布局代码时错乱
Android studio 又来搞事情了,更新到3.5版本后,格式化布局文件代码时,布局文件代码竟然会发生变化,意思是不让格式化代码了呗? 垃圾的IDE. 解决办法: “File”-"Se ...
- [原][C++]拒绝智能指针与指针混用,常见智能指针问题
公司一个非专科的程序在开发过程中有些毛躁,但是又想使用些新学的技术 这天他正调试呢,发现有一个BUG怎么也找不到原因. 用的好好的内存怎么就突然被删除了呢,好好的指针,怎么就访问越界了呢 没办法,他只 ...
- linux中proz下载软件安装部署
W系统里有迅雷这个下载工具,L系统里也一样有prozilla下面说一下CENTOS 5 系统里安装prozilla的过程1.首先在下面的链接下载最新稳定版本的prozilla 记得下tar包版本的[u ...
- WebMercator和geographic互相转换
方法1:esri的sdk中包含的方法:esri.geometry.geographicToWebMercator() 方法2:自己转换 //经纬度转Web墨卡托 function lonLat2Web ...
- ES6深入浅出-4 迭代器与生成器-4.总结
yield的值就是外面调用next得到的值 ES6给的新的语法,如果你给任何一个对象添加一个Symbol.interator的key,同时它的值是一个生成器. 下面选中的就是生成器.生成返回的东西是迭 ...
- Glide升级到4.x版本遇到的问题
Failed to find GeneratedAppGlideModule. You should include an annotationProcessor compile dependency ...
- Unity 3D网络游戏实战 pdf
Unity 3D网络游戏实战(全) 目录: 掌握Unity3D基本元素 1.1 简单的游戏 1.1.1在场景中创建一个立方体 1.1.2编写可以使立方体运动的程序 1.1.3测试游戏1.1.4总结1. ...
- 宣化上人:《四种清净明诲》是照妖镜,把所有妖魔鬼怪都给照现原形了(转自学佛网:http://www.xuefo.net/nr/article55/553478.html)
宣公上人 甘露法雨(顶礼宣公上人) 一般的学者说:<楞严经>是假的,不是佛说的,又有什么考证,又有什么地方记载.这都是他怕<楞严经>,没有办法来应付<楞严经>这个道 ...
- C# WebClient 无法设置超时时间的解决办法
http://www.lenashane.com/article/20150624-1021.html
- JS验证正数字,正则的一种正数规则1
JS中有一个验证数字的方法,就是!isNAN.NAN是非数字,!在JS里表示不是的意思,所以这个!isNAN就是判断不是非数字,也就是是数字.验证某个字符串是否是数字格式是:!isNaN(字符串)经过 ...