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 相关文章推荐
Jqyery中同等与js中windows.onload的应用
May 10 Javascript
json数据与字符串的相互转化示例
Sep 18 Javascript
详细介绍8款超实用JavaScript框架
Oct 25 Javascript
判断客户浏览器是否支持cookie的示例代码
Dec 23 Javascript
jQuery随机密码生成的方法
Mar 09 Javascript
JavaScript数组各种常见用法实例分析
Aug 04 Javascript
jquery京东商城双11焦点图多图广告特效代码分享
Sep 06 Javascript
javascript实现很浪漫的气泡冒出特效
Sep 05 Javascript
浅谈jquery中next与siblings的区别
Oct 27 Javascript
AngularJS定时器的使用与移除操作方法【interval与timeout】
Dec 14 Javascript
详解angularjs 关于ui-router分层使用
Jun 12 Javascript
vue-cli中使用高德地图的方法示例
Mar 28 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
CodeIgniter中使用cookie的三种方式详解
2014/07/18 PHP
php从memcache读取数据再批量写入mysql的方法
2014/12/29 PHP
PHP常见错误提示含义解释(实用!值得收藏)
2016/04/25 PHP
PHP array_shift()用法实例分析
2019/01/07 PHP
JQUBar 基于JQUERY的柱状图插件
2010/11/23 Javascript
JS判断元素为数字的奇异写法分享
2012/08/01 Javascript
javascript采用数组实现tab菜单切换效果
2012/12/12 Javascript
jquery $.each()使用探讨
2013/09/23 Javascript
js禁止回车提交表单的示例代码
2013/12/23 Javascript
关于JavaScript中name的意义冲突示例介绍
2014/05/29 Javascript
JavaScript中模拟实现jsonp
2015/06/19 Javascript
JavaScript实现自动消除按钮功能的方法
2015/08/05 Javascript
简单理解vue中Props属性
2016/10/27 Javascript
Vue.js系列之项目结构说明(2)
2017/01/03 Javascript
js常用DOM方法详解
2017/02/04 Javascript
ES6生成器用法实例分析
2017/04/10 Javascript
jQuery插件ImgAreaSelect实现头像上传预览和裁剪功能实例讲解一
2017/05/26 jQuery
js图片轮播插件的封装
2017/07/21 Javascript
vue-resource调用promise取数据方式详解
2017/07/21 Javascript
微信小程序实现打卡日历功能
2020/09/21 Javascript
详解Jest结合Vue-test-utils使用的初步实践
2019/06/27 Javascript
vue实现井字棋游戏
2020/09/29 Javascript
小程序实现左滑删除的效果的实例代码
2020/10/19 Javascript
python计算最小优先级队列代码分享
2013/12/18 Python
对pandas中apply函数的用法详解
2018/04/10 Python
django 将model转换为字典的方法示例
2018/10/16 Python
Django 用户认证组件使用详解
2019/07/23 Python
python实现感知机模型的示例
2020/09/30 Python
UGG澳洲官网:UGG Australia
2018/04/26 全球购物
JPA的优势都有哪些
2013/07/04 面试题
乡下人家教学反思
2014/02/01 职场文书
陈欧的广告词
2014/03/18 职场文书
人事主管岗位职责
2015/02/04 职场文书
海贼王十大潜力果实,路飞仅排第十,第一可毁世界(震震果实)
2022/03/18 日漫
《艾尔登法环》1.03.3补丁上线 碎星伤害调整
2022/04/06 其他游戏
Java 中的 Lambda List 转 Map 的多种方法详解
2022/07/07 Java/Android