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 URL编码和解码使用说明
Apr 12 Javascript
原生js做的手风琴效果的导航菜单
Nov 08 Javascript
jQuery+css实现百度百科的页面导航效果
Dec 16 Javascript
JS简单实现城市二级联动选择插件的方法
Aug 19 Javascript
JavaScript实现相册弹窗功能(zepto.js)
Jun 21 Javascript
jQuery简单注册和禁用全局事件的方法
Jul 25 Javascript
Javascript的动态增加类的实现方法
Oct 20 Javascript
three.js中文文档学习之如何本地运行详解
Nov 20 Javascript
jQuery实现输入框的放大和缩小功能示例
Jul 21 jQuery
vue+vant实现商品列表批量倒计时功能
Jan 13 Javascript
html-webpack-plugin修改页面的title的方法
Jun 18 Javascript
解决removeEventListener 无法清除监听的问题
Oct 30 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 编写的 25个游戏脚本
2009/05/11 PHP
PHP获取用户的浏览器与操作系统信息的代码
2012/09/04 PHP
基于PHP+Ajax实现表单验证的详解
2013/06/25 PHP
10款实用的PHP开源工具
2015/10/23 PHP
IOS 开发之NSDictionary转换成JSON字符串
2017/08/14 PHP
发布BlueShow v1.0 图片浏览器(类似lightbox)blueshow.js 打包下载
2007/07/21 Javascript
document.documentElement &amp;&amp; document.documentElement.scrollTop
2007/12/01 Javascript
在html页面中包含共享页面的方法
2008/10/24 Javascript
JavaScript Event学习第三章 早期的事件处理程序
2010/02/07 Javascript
JavaScript OOP面向对象介绍
2010/12/02 Javascript
extjs 04_grid 单击事件新发现
2012/11/27 Javascript
javascript通过navigator.userAgent识别各种浏览器
2013/10/25 Javascript
浅析return false的正确使用
2013/11/04 Javascript
javascript 实现map集合
2015/04/03 Javascript
Bootstrap每天必学之媒体对象
2015/11/30 Javascript
input file样式修改以及图片预览删除功能详细概括(推荐)
2017/08/17 Javascript
axios使用拦截器统一处理所有的http请求的方法
2018/11/02 Javascript
详解vue路由篇(动态路由、路由嵌套)
2019/01/27 Javascript
JavaScript之数组扁平化详解
2019/06/03 Javascript
JS前端知识点 运算符优先级,URL编码与解码,String,Math,arguments操作整理总结
2019/06/27 Javascript
基于javascript实现放大镜特效
2020/12/03 Javascript
[59:30]VG vs LGD 2019国际邀请赛淘汰赛 胜者组 BO3 第二场 8.22
2019/09/05 DOTA
Python中isnumeric()方法的使用简介
2015/05/19 Python
Python引用模块和查找模块路径
2016/03/17 Python
python使用xlsxwriter实现有向无环图到Excel的转换
2018/12/12 Python
在numpy矩阵中令小于0的元素改为0的实例
2019/01/26 Python
浅谈python 中的 type(), dtype(), astype()的区别
2020/04/09 Python
Spark处理数据排序问题如何避免OOM
2020/05/21 Python
Python第三方库安装缓慢的解决方法
2021/02/06 Python
公司周年庆活动方案
2014/08/25 职场文书
房屋买卖协议书范本
2014/09/27 职场文书
先进学校事迹材料
2014/12/30 职场文书
婚宴父亲致辞
2015/07/27 职场文书
物业保洁员管理制度
2015/08/05 职场文书
Spring Boot 底层原理基础深度解析
2022/04/03 Java/Android
MySQL索引 高效获取数据的数据结构
2022/05/02 MySQL