layui扩展组件之----右键菜单

源码:rightmenu.js

layui.define(['element'], function (exports) {let element = layui.element;const $ = layui.jquery;let MOD_NAME = 'rightmenu';let RIGHTMENUMOD = function () {this.v = '1.0.0';this.author = 'raowenjing';};String.prototype.format = function () {if (arguments.length == 0) return this;let param = arguments[0];let s = this;if (typeof(param) == 'object') {for (var key in param) s = s.replace(new RegExp("\\{" + key + "\\}", "g"), param[key]);return s;} else {for (var i = 0; i < arguments.length; i++) s = s.replace(new RegExp("\\{" + i + "\\}", "g"), arguments[i]);return s;}}function createStyle(ulClassName) {let style = '.{name} {position: absolute;width: 110px;z-index: 9999;display: none;background-color: #fff;padding: 2px;color: #333;border: 1px solid #c2c2c2;border-radius: 2px;cursor: pointer;}.{name} li {text-align: center;display: block;height: 30px;line-height: 32px;}.{name} li:hover {background-color: #666;color: #fff;}'.format({name: ulClassName});return style;}/*** 初始化*/RIGHTMENUMOD.prototype.render = function (opt) {createStyle();if (!opt.container) {console.error("[ERROR]使用rightmenu组件需要制定'container'属性!");return;}let defaultNavArr = [];opt = opt || {};opt.triggerDom = opt.triggerDom || "li";opt.boxClassName = opt.boxClassName || "right-click-menu-container";opt.navArr = opt.navArr || defaultNavArr;CreateRightMenu(opt,"");_CustomRightClick(opt);};/*** 创建右键菜单项目* @param rightMenuConfig* @constructor*/function CreateRightMenu(rightMenuConfig,currentData,callback) {if($('.'+rightMenuConfig.boxClassName).length>0) $('.'+rightMenuConfig.boxClassName).remove();$("<style></style>").text(createStyle(rightMenuConfig.boxClassName)).appendTo($("head"));let li = '';$.each(rightMenuConfig.navArr, function (index, conf) {if(!!currentData && typeof conf.showFormat != "undefined"){ // 控制if(typeof conf.showFormat == "function"){var isShow = conf.showFormat(currentData);isShow = !!isShow?true:false;if(isShow){li += '<li data-type="{eventName}"><i class="layui-icon {icon}"></i>{title}</li>'.format({eventName:conf.eventName,icon:conf.icon?conf.icon:"",title:conf.title});}}else{if(!!conf.showFormat){li += '<li data-type="{eventName}"><i class="layui-icon {icon}"></i>{title}</li>'.format({eventName:conf.eventName,icon:conf.icon?conf.icon:"",title:conf.title});}}}else{li += '<li data-type="{eventName}"><i class="layui-icon {icon}"></i>{title}</li>'.format({eventName:conf.eventName,icon:conf.icon?conf.icon:"",title:conf.title});}})let tmpHtml = '<ul class="{className}">{liStr} </ul>'.format({liStr: li, className: rightMenuConfig.boxClassName})$(rightMenuConfig.container).after(tmpHtml);setTimeout(function(){registerMenuClick(rightMenuConfig);if(!!callback && typeof callback == "function") callback();},10)}/*** 绑定右键菜单* @constructor*/function _CustomRightClick(rightMenuConfig) {$(rightMenuConfig.container).off("click");$(rightMenuConfig.container).on("click", rightMenuConfig.triggerDom,function () {$('.'+rightMenuConfig.boxClassName).hide();});$(rightMenuConfig.container).off("contextmenu")$(rightMenuConfig.container).on("contextmenu", rightMenuConfig.triggerDom, function (e) {// 阻止默认的右键菜单e.preventDefault();// 重构菜单CreateRightMenu(rightMenuConfig,$(this).data(),function(){let popupmenu = $("."+rightMenuConfig.boxClassName);let leftValue = ($(document).width() - e.clientX) < popupmenu.width() ? (e.clientX - popupmenu.width()) : e.clientX;let topValue = ($(document).height() - e.clientY) < popupmenu.height() ? (e.clientY - popupmenu.height()) : e.clientY;popupmenu.css({left: leftValue, top: topValue}).show();});// 将该元素的所有数据复制到$.each($(this).data(), function(key, value) {$("."+rightMenuConfig.boxClassName).data(key, value);});return false;});// 点击空白处隐藏弹出菜单$(document).click(function (event) {event.stopPropagation();$("."+rightMenuConfig.boxClassName).hide();});}function registerMenuClick(rightMenuConfig){$('.' + rightMenuConfig.boxClassName + ' li').prop("onclick",null).off("click");/*** 注册tab右键菜单点击事件*/$('.' + rightMenuConfig.boxClassName + ' li').click(function () {rightMenuConfig.registMethod[$(this).attr("data-type")]($(this).parents("."+rightMenuConfig.boxClassName).data());$("."+rightMenuConfig.boxClassName).hide();})}let rightmenuObj = new RIGHTMENUMOD();exports(MOD_NAME, rightmenuObj);
})

使用示例:


<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>标题</title>
</head>
<body><div id="app_folder" lay-filter="folder_filter" class="folder-container"></div><script src="./js/jquery.min.js"></script><script src="./layui/layui.js"></script><script>layui.config({base: './layui/modules/' //静态资源所在路径}).use(['rightmenu','tree'], function(){var tree = layui.tree, rightmenu_ = layui.rightmenuinitFolder();function initFolder(){var data = [{ id: 1, title: "标题标题标题", type: "html" },{ id: 2, title: "标题标题标题", type: "html", children: [ { id: 3, title: "标题", type: "javascript" } ] },]tree.render({elem: '#app_folder' //默认是点击节点可进行收缩,data: data,onlyIconControl: true,click: function(obj){}});setTimeout(function(){// 为dom节点添加数据$("#app_folder .layui-tree-main").each(function(index,item){var parent = $(this).parent().parent();var id = parent.data("id");var dataItem = null;if(parent.hasClass("layui-tree-setHide")){ // 页面dataItem = data.find(function(it){ return it.id==id; })}else{ // 资源for(var i=0,len=data.length;i<len;i++){var currentItem = data[i].children.find(function(it){ return it.id==id; })if(!!currentItem) dataItem = currentItem;}}if(!!dataItem){for (var key in dataItem) {$(this).data(key,dataItem[key]);}}})rightmenu_.render({container: '#app_folder',triggerDom: ".layui-tree-main", // 触发右击事件的dom节点// navArr:对象数组,每个对象包含eventName、title、showFormat属性navArr: [{title: "新建页面", eventName: 'createPage'},{title: "新建资源", eventName: 'createSource'},{title: "修改", eventName: 'edit'},{title: "删除", eventName: 'delete'},{title: "预览", eventName: 'preview', showFormat: function(data){ if(data.source_type=="html"){ return true }else{ return false; } } },{title: "资源路径", eventName: 'sourcePath', showFormat: function(data){ if(data.source_type=="html"){ return true }else{ return false; } } },{title: "下载资源", eventName: 'downloadSource', showFormat: function(data){ if(data.source_type=="image" || data.source_type=="file"){ return true }else{ return false; } } },{title: "清除缓存数据", eventName: 'clearLocalData', showFormat: function(data){ if(data.source_type=="javascript"){ return true }else{ return false; } } }],// 注册自定义事件registMethod: {'clearLocalData': function(data){console.log(data);},'sourcePath': function(data){console.log(data);},'preview': function(data){},'downloadSource': function(data){},'edit': function(data){},'delete': function(data){},'createPage': function(data){},'createSource': function(data){},}})},100);}})</script>
</body>
</html>

效果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/458457.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

检索引擎Elasticsearch

一.为什么要用Elasticsearch 由于我们在运行我们的项目的时候通常都是将数据存到mysql或者sql serve等数据库中&#xff0c;在进行数据搜索时使用sql 语句 like进行模糊匹配查询&#xff0c;其一&#xff1a;虽然可以查到数据&#xff0c;但是它模糊匹配查询速度较慢&#xff0…

世优科技“AI+空间计算”推动消费行业向智能化升级

人工智能的演进正从初期的技术探索阶段&#xff0c;转向技术应用阶段&#xff0c;在此趋势下&#xff0c;融合了多模态大模型、虚拟现实、空间计算等前沿技术的人工智能应用新方向&#xff0c;展现出了巨大的潜力和商业价值。 10月19日&#xff0c;2024北京朝阳国际灯光节全新…

[C++11] 右值引⽤与移动语义

文章目录 左值和右值左值&#xff08;Lvalue&#xff09;右值&#xff08;Rvalue&#xff09;区别 左值引⽤和右值引⽤左值引用&#xff08;Lvalue Reference&#xff09;右值引用&#xff08;Rvalue Reference&#xff09;右值引用的特点 右值引用延长生命周期右值引⽤和移动语…

数据结构——树、二叉树和森林间的转换

前言 介绍 &#x1f343;数据结构专区&#xff1a;数据结构 参考 该部分知识参考于《数据结构&#xff08;C语言版 第2版&#xff09;》129~130页 &#x1f308;每一个清晨&#xff0c;都是世界对你说的最温柔的早安&#xff1a;ૢ(≧▽≦)و✨ 目录 前言 1、基础知识 2…

Matlab 车牌识别技术

1.1设计内容及要求&#xff1a; 课题研究的主要内容是对数码相机拍摄的车牌&#xff0c;进行基于数字图像处理技术的车牌定位技术和车牌字符分割技术的研究与开发&#xff0c;涉及到图像预处理、车牌定位、倾斜校正、字符分割等方面的知识,总流程图如图1-1所示。 图1-1系统总…

《手写Spring渐进式源码实践》实践笔记(第十一章 AOP-基于JDK、Cglib实现对象动态代理)

文章目录 第十一章 基于JDK、Cglib实现对象动态代理背景目标设计实现代码结构类图代理案例解析案例代码运行结果拆解案例 实现步骤 测试事先准备自定义拦截方法测试用例测试结果&#xff1a; 总结 第十一章 基于JDK、Cglib实现对象动态代理 背景 到本章节我们将要从 IOC 的实现…

今日头条APP移动手机端留痕脚本

这两个的脚本目的是什么呢&#xff1f; 很简单&#xff0c;就是批量访问指定用户的首页&#xff0c;在他人访客记录里面留下你的账户信息&#xff0c;可以让对方访问你的头条&#xff0c;概率下会关注你的头条&#xff0c;目的嘛&#xff0c;这个自己细想&#xff01; 第1个是…

网页上的视频怎么下载下来?三种方法

分享三个简单好用的网页视频下载工具&#xff0c;值得使用&#xff01; 1.IDM IDM 是一款可以提高下载速度达5倍的工具&#xff0c;同时具有恢复、调度和组织下载的功能。如果由于网络问题或意外的电源中断&#xff0c;程序将恢复未完成的下载。 IDM 还具有一个完全功能的站点…

张驰咨询:六西格玛培训费用,到底值不值得花?

六西格玛作为一种先进的管理理念和统计方法&#xff0c;已经在全球范围内得到了广泛的应用和认可。它旨在通过减少流程变异&#xff0c;提高产品质量和客户满意度&#xff0c;从而为企业带来持续的改进和盈利增长。随着六西格玛理念的普及&#xff0c;越来越多的人和企业开始寻…

spark on kubernetes运行测试

测试环境 ● kubernetes 1.20.15 ● default命名空间 ● spark 3.1.2 ● kubectl 运行架构 构建镜像 配置JAVA_HOME下载spark二进制包spark-3.1.2-bin-hadoop3.2.tgz并解压修改kubernetes/dockerfiles/spark/Dockerfile文件 ARG java_image_tag11-jre-slimFROM openjdk:${j…

HBuilder X 中Vue.js基础使用2(三)

一、条件渲染 1、条件判断 v-if &#xff1a; 表达式返回真值时才被渲染 v-else &#xff1a;表达式返回为假时不被渲染 2、 分支条件判断 v-else-if &#xff1a;使用v-if , v-else-if 和 v-else 来表示其他的条件分支 3、显示隐藏 v-show v-show true 把节点显示 …

持续深化信创布局,途普科技与统信软件完成产品兼容性互认证

近日&#xff0c;由北京途普科技有限公司&#xff08;以下简称“途普科技”&#xff09;自主研发的TopGraph图数据库及知识图谱构建平台已成功完成统信服务器操作系统V20的兼容性互认证&#xff0c;标志着途普科技在国产自控技术上又迈出了坚实的一步。 在各项严格的测试环节中…

技术成神之路:设计模式(二十一)外观模式

相关文章&#xff1a;技术成神之路&#xff1a;二十三种设计模式(导航页) 介绍 外观模式&#xff08;Facade Pattern&#xff09;是一种结构型设计模式&#xff0c;它为子系统中的一组接口提供一个统一的接口。外观模式定义了一个高层接口&#xff0c;使得子系统更容易使用。 …

XJ02、消费金融|消费金融业务模式中的主要主体

根据所持有牌照类型的不同,消费金融服务供给方主要分为商业银行、汽车金融公司、消费金融公司和小贷公司,不同类型机构定位不同、提供消费金融服务与产品类型也各不相同。此外,互联网金融平台也成为中国消费金融业务最重要的参与方之一,虽其并非持牌金融机构,但借助其流量…

D50【python 接口自动化学习】- python基础之类

day50 init方法 学习日期&#xff1a;20241027 学习目标&#xff1a;类 -- 64 init方法&#xff1a;如何为对象传递参数&#xff1f; 学习笔记&#xff1a; 魔术方法 init方法 class Klass(object):# 定义初始化方法&#xff0c;类实例化时自动进行初始化def __init__(self…

AGI 之 【Dify】 之 Dify 在 Windows 端本地部署调用 Ollama 本地下载的大模型,实现 API 形式进行聊天对话

AGI 之 【Dify】 之 Dify 在 Windows 端本地部署调用 Ollama 本地下载的大模型&#xff0c;实现 API 形式进行聊天对话 目录 AGI 之 【Dify】 之 Dify 在 Windows 端本地部署调用 Ollama 本地下载的大模型&#xff0c;实现 API 形式进行聊天对话 一、简单介绍 二、创建一个聊…

基于SSM+小程序的旅游社交登录管理系统(旅游4)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1、项目介绍 ​ 本旅游社交小程序功能有管理员和用户。管理员有个人中心&#xff0c;用户管理&#xff0c;每日签到管理&#xff0c;景点推荐管理&#xff0c;景点分类管理&#xff0c;防疫查询管理&a…

洞察前沿趋势!2024深圳国际金融科技大赛——西丽湖金融科技大学生挑战赛技术公开课指南

在当前信息技术与“互联网”深度融合的背景下&#xff0c;金融行业的转型升级是热门话题&#xff0c;创新与发展成为金融科技主旋律。随着区块链技术、人工智能技术、5G通信技术、大数据技术等前沿科技的飞速发展&#xff0c;它们与金融领域的深度融合&#xff0c;正引领着新型…

Golang 怎么高效处理ACM模式输入输出

文章目录 问题bufio.NewReader高效的原理 再次提交 问题 最近在练习牛客上单调栈题目时&#xff0c;要求自己处理出入输出&#xff0c;也就是读题库要求的输入&#xff0c;计算最终结果&#xff0c;并打印输出 当我用fmt.Scan处理输入&#xff0c;用fmt.Println处理输出时&am…

R语言笔记(五):Apply函数

文章目录 一、Apply Family二、apply(): rows or columns of a matrix or data frame三、Applying a custom function四、Applying a custom function "on-the-fly"五、Applying a function that takes extra arguments六、Whats the return argument?七、Optimized…