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 全选效果实现代码
Mar 23 Javascript
jquery 学习之二 属性(html()与html(val))
Nov 25 Javascript
不同的jQuery API来处理不同的浏览器事件
Dec 09 Javascript
简单的Jquery全选功能
Nov 07 Javascript
node.js中的socket.io入门实例
Apr 26 Javascript
jQuery获取页面元素绝对与相对位置的方法
Jun 10 Javascript
实例讲解避免javascript冲突的方法
Jan 03 Javascript
JS中常用的正则表达式
Sep 29 Javascript
基于js实现二级下拉联动
Dec 17 Javascript
jQuery查找dom的几种方法效率详解
May 17 jQuery
详解webpack打包vue项目之后生成的dist文件该怎么启动运行
Sep 06 Javascript
javascript实现倒计时关闭广告
Feb 09 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生成静态页面详解
2006/12/05 PHP
Zend studio文件注释模板设置方法
2013/09/29 PHP
Laravel框架定时任务2种实现方式示例
2018/12/08 PHP
JQuery.ajax传递中文参数的解决方法 推荐
2011/03/28 Javascript
jquery中dom操作和事件的实例学习-表单验证
2011/11/30 Javascript
公共js在页面底部加载的注意事项介绍
2013/07/18 Javascript
js显示文本框提示文字的方法
2015/05/07 Javascript
第七篇Bootstrap表单布局实例代码详解(三种表单布局)
2016/06/21 Javascript
JS 终止执行的实现方法
2016/11/24 Javascript
Vue 创建组件的两种方法小结(必看)
2018/02/23 Javascript
Vue项目history模式下微信分享爬坑总结
2019/03/29 Javascript
在微信小程序中使用图表的方法示例
2019/04/25 Javascript
Vue事件修饰符native、self示例详解
2019/07/09 Javascript
微信小程序进入广告实现代码实例
2019/09/19 Javascript
layer.prompt使文本框为空的情况下也能点击确定的方法
2019/09/24 Javascript
vue使用axios实现excel文件下载的功能
2020/07/16 Javascript
vue实现表格合并功能
2020/12/01 Vue.js
[03:42]2014DOTA2西雅图国际邀请赛7月9日TOPPLAY
2014/07/09 DOTA
详解Python函数作用域的LEGB顺序
2016/05/14 Python
python 日期排序的实例代码
2019/07/11 Python
Python笔记之代理模式
2019/11/20 Python
Python如何基于rsa模块实现非对称加密与解密
2020/01/03 Python
opencv python如何实现图像二值化
2020/02/03 Python
使用HTML5捕捉音频与视频信息概述及实例
2018/08/22 HTML / CSS
HTML5 Canvas阴影使用方法实例演示
2013/08/02 HTML / CSS
澳大利亚首个在线预订旅游网站:Wotif
2017/07/19 全球购物
美国汽车零部件和配件网站:CarParts
2019/03/13 全球购物
标记环网Toke Ring IEEE802.5
2014/05/26 面试题
实习单位推荐信范文
2013/11/27 职场文书
暑期社会实践感言
2014/02/25 职场文书
入党综合考察材料
2014/06/02 职场文书
科长个人四风问题整改措施思想汇报
2014/10/13 职场文书
小学生成绩单评语
2014/12/31 职场文书
golang中字符串MD5生成方式总结
2021/07/04 Golang
Python学习之异常中的finally使用详解
2022/03/16 Python
Nginx的gzip相关介绍
2022/05/11 Servers