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 相关文章推荐
JQuery 学习笔记 选择器之四
Jul 23 Javascript
别了 JavaScript中的isXX系列
Aug 01 Javascript
JavaScript中的迭代器和生成器详解
Oct 29 Javascript
浅谈JavaScript中的Math.atan()方法的使用
Jun 14 Javascript
JavaScript面对国际化编程时的一些建议
Jun 24 Javascript
jQuery实现hover合成事件的方法
Aug 06 Javascript
Jquery+Ajax+PHP+MySQL实现分类列表管理(下)
Oct 28 Javascript
jQuery同步提交示例代码
Dec 12 Javascript
JS设置时间无效问题的解决办法
Feb 18 Javascript
webpack打包后直接访问页面图片路径错误的解决方法
Jun 17 Javascript
Node.js学习教程之HTTP/2服务器推送【译】
Oct 31 Javascript
在vue中实现禁止回退上一步,路由不存历史记录
Jul 22 Javascript
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与MySQL开发的8个技巧小结
2010/12/17 PHP
解密ThinkPHP3.1.2版本之模块和操作映射
2014/06/19 PHP
Laravel实现短信注册的示例代码
2018/05/29 PHP
初学JavaScript第二章
2008/09/30 Javascript
json原理分析及实例介绍
2012/11/29 Javascript
javascript学习(二)javascript常见问题总结
2013/01/02 Javascript
图片延迟加载的实现代码(模仿懒惰)
2013/03/29 Javascript
JavaScript中函数(Function)的apply与call理解
2015/07/08 Javascript
浅析BootStrap模态框的使用(经典)
2016/04/29 Javascript
JavaScript实现简单的日历效果
2016/09/25 Javascript
如何正确理解javascript的模块化
2017/03/02 Javascript
详解webpack进阶之插件篇
2017/07/06 Javascript
解析vue data不可以使用箭头函数问题
2018/07/03 Javascript
解决js相同的正则多次调用test()返回的值却不同的问题
2018/10/10 Javascript
vuex的module模块用法示例
2018/11/12 Javascript
JS 自执行函数原理及用法
2019/08/05 Javascript
nuxt踩坑之Vuex状态树的模块方式使用详解
2019/09/06 Javascript
vue实现把接口单独存放在一个文件方式
2020/08/13 Javascript
vue data有值,但是页面{{}} 取不到值的解决
2020/11/09 Javascript
[02:47]3.19DOTA2发布会 国服成长历程回顾
2014/03/25 DOTA
[01:59]DOTA2首部纪录片《Free to play》预告片
2014/03/12 DOTA
[53:38]OG vs LGD 2018国际邀请赛淘汰赛BO3 第三场 8.26
2018/08/30 DOTA
介绍Python的Urllib库的一些高级用法
2015/04/30 Python
python xlsxwriter库生成图表的应用示例
2018/03/16 Python
详解Django之auth模块(用户认证)
2018/04/17 Python
基于python指定包的安装路径方法
2018/10/27 Python
Python进程间通信Queue消息队列用法分析
2019/05/22 Python
python批量将excel内容进行翻译写入功能
2019/10/10 Python
Selenium环境变量配置(火狐浏览器)及验证实现
2020/12/07 Python
Pretty You London官网:英国拖鞋和睡衣品牌
2019/05/08 全球购物
个人教师自我评价范文
2013/12/02 职场文书
亚运会口号
2014/06/20 职场文书
2015年事业单位办公室文员工作总结
2015/04/24 职场文书
2015年小学数学教师工作总结
2015/05/20 职场文书
redis三种高可用方式部署的实现
2021/05/11 Redis
MySQL之PXC集群搭建的方法步骤
2021/05/25 MySQL