javascript自定义右键菜单插件


Posted in Javascript onDecember 16, 2019

本文实例为大家分享了javascript自定义右键菜单插件的具体代码,供大家参考,具体内容如下

1.使用方式

js文件引入<script src="RightMenu.js"></script>

初始化:

let rightMenu = new RightMenu({
   targetId:'menu',//需要改变右键菜单的元素id
   menuItems: items//菜单项数据,json数组
   })

2.menuItems参数

items = [
 {
 id: 'aa',//菜单id
 text: 'ccc',//菜单文字,可以是html元素
 show: true, //菜单是否显示
 active: false,//菜单是否可用
 style: 'item-unactive'
 }
]

3.方法

setItems(menuItems) 设置菜单。动态设置菜单

hide() 隐藏菜单

on(eventType, event) 事件监听

4.事件

itemClick 菜单项点击,回调函数参数为菜单项的所有属性

例:

rightMenu.on('itemClick',(param) => {
 console.log(param)
 if(param.active === false){
 return
 }
 alert(JSON.stringify(param))
 // rightMenu.hide()
})

createBefore 菜单内容生成前调用,可以实现动态菜单设置

例:

rightMenu.on('createBefore',(param) => {
 rightMenu.setItems(items1)
})

注:暂不支持级联功能

代码:

class RightMenu{
 constructor(param){
 this.targetId = param.targetId
 this.ele = document.querySelector('#' + this.targetId)
 console.assert(this.ele != null, '未找到id=' + this.targetId + '的元素')
 this.menu = null
 this.menuItems = param.menuItems
 this._menuItems = {}
 this.itemDefaultClass = 'item-default'
 this.event = {
 itemClick: null,
 createBefore: null
 }
 this.flag = true
 this.init()
 }
 
 init(){
 let that = this
 that.createMenu()
 this.ele.oncontextmenu = function(ee) {
 let e = ee || window.event;
 //鼠标点的坐标
 let oX = e.clientX;
 let oY = e.clientY;
 //菜单出现后的位置
 that.menu.style.display = "block";
 that.menu.style.left = oX + "px";
 that.menu.style.top = oY + "px";
 that.createMenu()
 //阻止浏览器默认事件
 return false;//一般点击右键会出现浏览器默认的右键菜单,写了这句代码就可以阻止该默认事件。
 }
 document.oncontextmenu = function(ee){
 let e = ee || window.event;
 if(e.target.id !== that.targetId && e.target.dataset.type != 'item'){
 that.menu.style.display = "none"
 }
 }
 document.onclick = function(ee) {
 let e = ee || window.event;
 that.menu.style.display = "none"
 }
 that.menu.onclick = function(ee) {
 let e = ee || window.event;
 if(e.target.dataset.type == 'item'){
 if(that.event.itemClick instanceof Function){
  that.event.itemClick(that._menuItems[e.target.id])
 }
 }
 e.cancelBubble = true;
 }
 this.menu.onmouseover = function(ee){
 that.flag = true
 }
 this.menu.onmouseleave = function(ee){
 that.flag = false
 }
 }
 createMenu(){
 if(this.menu == null){
 this.menu = document.createElement('div')
 this.menu.className = 'menu-default'
 document.body.appendChild(this.menu)
 }
 
 let mark = true
 if(this.event.createBefore instanceof Function){
 mark = this.event.createBefore()
 }
 if(mark){
 this.creatItem()
 }
 }
 _bindOncontextmenu(obj){
 obj.oncontextmenu = function(ee){
 ee.target.click()
 return false
 }
 }
 creatItem(){
 if(this.menuItems.length == 0){
 return
 }
 let fragement = document.createDocumentFragment()
 let temp = null
 let tempItem = null
 for (let i = 0, len = this.menuItems.length; i < len; i++){
 tempItem = this.menuItems[i]
 if(tempItem.show === false){
 continue
 }
 temp = document.createElement('div')
 temp.id = tempItem.id
 temp.innerHTML = tempItem.text
 temp.className = tempItem.style || 'item-default'
 temp.dataset.type = 'item'
 
 this._menuItems[tempItem.id] = tempItem
 fragement.appendChild(temp)
 this._bindOncontextmenu(temp)
 }
 this.menu.innerHTML = ''
 this.menu.appendChild(fragement)
 }
 
 on(type,event){
 this.event[type] = event
 }
 
 hide(){
 this.menu.style.display = 'none'
 }
 
 setItems(items){
 this.menuItems = items
 this.creatItem()
 }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
解析javascript 实用函数的使用详解
May 10 Javascript
javascript获取函数名称、函数参数、对象属性名称的代码实例
Apr 12 Javascript
jQuery中change事件用法实例
Dec 26 Javascript
JavaScript中的console.trace()函数介绍
Dec 29 Javascript
实例剖析AngularJS框架中数据的双向绑定运用
Mar 04 Javascript
JavaScript实现的超简单计算器功能示例
Dec 23 Javascript
详解layui中的树形关于取值传值问题
Jan 16 Javascript
jquery引入外部CDN 加载失败则引入本地jq库
May 23 jQuery
VUE2.0 ElementUI2.0表格el-table自适应高度的实现方法
Nov 28 Javascript
如何优雅的在一台vps(云主机)上面部署vue+mongodb+express项目
Jan 20 Javascript
JS使用setInterval计时器实现挑战10秒
Nov 08 Javascript
vue中三级导航的菜单权限控制
Mar 31 Vue.js
js中的面向对象之对象常见创建方法详解
Dec 16 #Javascript
js实现数字滚动特效
Dec 16 #Javascript
NUXT SSR初级入门笔记(小结)
Dec 16 #Javascript
js实现内置计时器
Dec 16 #Javascript
js实现秒表计时器
Dec 16 #Javascript
在vue中使用axios实现post方式获取二进制流下载文件(实例代码)
Dec 16 #Javascript
js实现计时器秒表功能
Dec 16 #Javascript
You might like
PHP数组循环操作详细介绍 附实例代码
2013/02/03 PHP
PHP指定截取字符串中的中英文或数字字符的实例分享
2016/03/18 PHP
YII框架中使用memcache的方法详解
2017/08/02 PHP
PHP商品秒杀问题解决方案实例详解【mysql与redis】
2019/07/22 PHP
css把超出的部分显示为省略号的方法兼容火狐
2008/07/23 Javascript
基于jQuery的遍历同id元素 并响应事件的代码
2012/06/14 Javascript
基于jquery创建的一个图片、视频缓冲的效果样式插件
2012/08/28 Javascript
jQuery结合CSS制作动态的下拉菜单
2015/10/27 Javascript
快速掌握Node.js模块封装及使用
2016/03/21 Javascript
jQuery动态添加
2016/04/07 Javascript
AngularJS使用带属性值的ng-app指令实现自定义模块自动加载的方法
2017/01/04 Javascript
jQuery滚动监听实现商城楼梯式导航效果
2017/03/06 Javascript
Cookies 和 Session的详解及区别
2017/04/21 Javascript
解决在vue项目中webpack打包后字体不生效的问题
2018/09/01 Javascript
vue鼠标悬停事件实例详解
2019/04/01 Javascript
D3.js(v3)+react 实现带坐标与比例尺的散点图 (V3版本)
2019/05/09 Javascript
小程序登录/注册页面设计的实现代码
2019/05/24 Javascript
JavaScript实现身份证验证代码实例
2019/08/26 Javascript
在vue中使用Echarts利用watch做动态数据渲染操作
2020/07/20 Javascript
浅析Python的web.py框架中url的设定方法
2016/07/11 Python
Python时间获取及转换知识汇总
2017/01/11 Python
Python基于多线程实现抓取数据存入数据库的方法
2018/06/22 Python
详解django中使用定时任务的方法
2018/09/27 Python
python判断输入日期为第几天的实例
2018/11/13 Python
Python缓存技术实现过程详解
2019/09/25 Python
Pycharm中Python环境配置常见问题解析
2020/01/16 Python
让IE支持HTML5的方法
2012/12/11 HTML / CSS
深入浅析HTML5中的article和section的区别
2018/05/15 HTML / CSS
Nice Kicks网上商店:ShopNiceKicks.com
2018/12/25 全球购物
如何实现一个自定义类的序列化
2012/05/22 面试题
简短的公司员工自我评价分享
2013/11/13 职场文书
小学美术教学反思
2014/02/01 职场文书
水电站项目建议书
2014/05/12 职场文书
群众路线查摆问题整改措施思想汇报
2014/10/10 职场文书
工作表扬信范文
2015/01/17 职场文书
严以用权学习心得体会
2016/01/12 职场文书