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代码分享
Mar 25 Javascript
js选择并转移导航菜单示例代码
Aug 19 Javascript
jQuery超精致图片轮播幻灯片特效代码分享
Sep 10 Javascript
Jquery on方法绑定事件后执行多次的解决方法
Jun 02 Javascript
基于Bootstrap的后台管理面板 Bootstrap Metro Dashboard
Jun 17 Javascript
js判断空对象的实例(超简单)
Jul 26 Javascript
使用JS中的Replace()方法遇到的问题小结
Oct 20 Javascript
JS+CSS实现网页加载中的动画效果
Oct 27 Javascript
让网站自动生成章节目录索引的多个js代码
Jan 07 Javascript
解决vuecli3.0热更新失效的问题
Sep 19 Javascript
在Vue中创建可重用的 Transition的方法
Jun 02 Javascript
JQuery Ajax如何实现注册检测用户名
Sep 25 jQuery
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执行速度全攻略
2006/10/09 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十)
2014/06/24 PHP
PHP给文字内容中的关键字进行套红处理
2016/04/12 PHP
CentOS 7.2 下编译安装PHP7.0.10+MySQL5.7.14+Nginx1.10.1的方法详解(mini版本)
2016/09/01 PHP
extjs DataReader、JsonReader、XmlReader的构造方法
2009/11/07 Javascript
XMLHTTPRequest的属性和方法简介
2010/11/23 Javascript
js整数字符串转换为金额类型数据(示例代码)
2013/12/26 Javascript
我的Node.js学习之路(一)
2014/07/06 Javascript
Javascript 数组排序详解
2014/10/22 Javascript
JavaScript中利用Array和Object实现Map的方法
2015/07/27 Javascript
jQuery网页右侧广告跟随滚动代码分享
2020/04/20 Javascript
浅析JavaScript访问对象属性和方法及区别
2015/11/16 Javascript
JavaScript实现简单Tip提示框效果
2016/04/20 Javascript
Bootstrap开发实战之第一次接触Bootstrap
2016/06/02 Javascript
微信小程序项目实践之验证码倒计时功能
2018/07/18 Javascript
跟老齐学Python之模块的加载
2014/10/24 Python
python使用any判断一个对象是否为空的方法
2014/11/19 Python
python3制作捧腹网段子页爬虫
2017/02/12 Python
详解python单元测试框架unittest
2018/07/02 Python
Python判断对象是否相等及eq函数的讲解
2019/02/25 Python
python+selenium实现自动化百度搜索关键词
2019/06/03 Python
python读取指定字节长度的文本方法
2019/08/27 Python
python实现电子词典
2020/03/03 Python
在jupyter notebook中调用.ipynb文件方式
2020/04/14 Python
python+appium+yaml移动端自动化测试框架实现详解
2020/11/24 Python
PyCharm常用配置和常用插件(小结)
2021/02/06 Python
HTML5 Canvas阴影使用方法实例演示
2013/08/02 HTML / CSS
英文版银行求职信
2013/10/09 职场文书
儿科护士实习自我鉴定
2013/10/17 职场文书
护士实习生自我鉴定范文
2013/12/10 职场文书
经典的毕业生自荐信范文
2014/04/14 职场文书
2015年幼儿教师个人工作总结
2015/05/20 职场文书
2015年小学语文工作总结
2015/05/25 职场文书
幼儿园卫生保健制度
2015/08/05 职场文书
教学反思怎么写
2016/02/24 职场文书
JVM钩子函数的使用场景详解
2021/08/23 Java/Android