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 相关文章推荐
33个优秀的 jQuery 图片展示插件分享
Mar 14 Javascript
javascript中call和apply的用法示例分析
Apr 02 Javascript
JS+CSS实现简单滑动门(滑动菜单)效果
Sep 19 Javascript
关于两个jQuery(js)特效冲突的bug的解决办法
Sep 04 Javascript
js和jquery中获取非行间样式
May 05 jQuery
vue子父组件通信的实现代码
Jul 09 Javascript
AngularJS点击添加样式、点击变色设置的实例代码
Jul 27 Javascript
基于js中document.cookie全面解析
Sep 14 Javascript
JavaScript 保护变量不被随意修改的实现代码
Sep 27 Javascript
微信小程序基于slider组件动态修改标签透明度的方法示例
Dec 04 Javascript
小程序根据手机机型设置自定义底部导航距离
Jun 04 Javascript
关于angular引入ng-zorro的问题浅析
Sep 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中的MVC模式运用技巧
2007/05/03 PHP
PHP根据传来的16进制颜色代码自动改变背景颜色
2014/06/13 PHP
PHP静态成员变量和非静态成员变量详解
2017/02/14 PHP
PHP 图片处理
2020/09/16 PHP
基于jquery的bankInput银行卡账号格式化
2012/08/22 Javascript
改变状态栏文字的js代码
2014/06/13 Javascript
原生javaScript实现图片延时加载的方法
2014/12/22 Javascript
纯JavaScript实现的兼容各浏览器的添加和移除事件封装
2015/03/28 Javascript
JavaScript如何动态创建table表格
2020/08/02 Javascript
jQuery Easyui 下拉树组件combotree
2016/12/16 Javascript
js实现抽奖效果
2017/03/27 Javascript
AngularJS select加载数据选中默认值的方法
2018/02/28 Javascript
微信小程序实现语音识别转文字功能及遇到的坑
2019/08/02 Javascript
VUE项目中加载已保存的笔记实例方法
2019/09/14 Javascript
javascript设计模式 ? 状态模式原理与用法实例分析
2020/04/22 Javascript
vue 使用 vue-pdf 实现pdf在线预览的示例代码
2020/04/26 Javascript
详解Vue 数据更新了但页面没有更新的 7 种情况汇总及延伸总结
2020/05/28 Javascript
javaScript代码飘红报错看不懂?读完这篇文章再试试
2020/08/19 Javascript
[57:22]完美世界DOTA2联赛PWL S2 FTD vs PXG 第二场 11.27
2020/12/01 DOTA
通过Python爬虫代理IP快速增加博客阅读量
2016/12/14 Python
用Python实现随机森林算法的示例
2017/08/24 Python
CentOS7.3编译安装Python3.6.2的方法
2018/01/22 Python
用tensorflow构建线性回归模型的示例代码
2018/03/05 Python
解决pyttsx3无法封装的问题
2018/12/24 Python
详解PyQt5信号与槽的几种高级玩法
2020/03/24 Python
美国婴儿和儿童家具网上商店:ABaby.com
2018/07/02 全球购物
彪马香港官方网上商店:PUMA香港
2020/12/06 全球购物
个人简历自我鉴定
2013/10/11 职场文书
经典婚礼主持开场白
2014/03/13 职场文书
财务工作失职检讨书
2014/11/21 职场文书
调解书格式范本
2015/05/20 职场文书
判断Python中的Nonetype类型
2021/05/25 Python
ajax请求前端跨域问题原因及解决方案
2021/10/16 Javascript
php双向队列实例讲解
2021/11/17 PHP
使用python绘制横竖条形图
2022/04/21 Python
Python使用pandas导入csv文件内容的示例代码
2022/12/24 Python