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>
效果:
相关文章:
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 () {…...
ue5实现数字滚动增长
方法1 https://www.bilibili.com/video/BV1h14y197D1/?spm_id_from333.999.0.0 b站教程 重写loop节点 方法二 写在eventtick里...
Flink(一)
目录 架构处理有界与无界数据部署应用到任意地方运行任意规模应用利用内存性能 流应用流处理应用的基本组件流状态时间 应用场景事件驱动应用事件驱动应用的优势Flink如何支持事件驱动应用? 典型的事件驱动示例 数据分析应用流式分析应用的优势?Flink 如…...
kaggle 数据集下载
文章目录 kaggle 数据集下载(1) 数据集下载(2) 手机号验证 kaggle 数据集下载 这两天想学习 kaggle 赛事 把深度学习相关的内容自己给过一遍,快忘得差不多了,惭愧。 参考了好多帖子,使用命令行…...
Linux shell编程学习笔记87:blkid命令——获取块设备信息
0 引言 在进行系统安全检测时,我们需要收集块设备的信息,这些可以通过blkid命令来获取。 1 blkid命令的安装 blkid命令是基于libblkid库的命令行工具,可以在大多数Linux发行版中使用。 如果你的Linux系统中没有安装blkid命令,…...
wireshark筛选条件整理
Wireshark筛选条件整理 一、MAC地址过滤二、IP地址过滤三、端口过滤四、协议筛选五、数据分析1、整体2、frame数据帧分析3、 Ethernet II 以太网4、IP协议5、TCP6、HTTP7、ARP8、DLEP动态链接交换协议 六、统计-协议分级(统计包占比) and && 、 …...
基于现代 C++17 的模块化视频质量诊断处理流程设计
文章目录 0. 引言1. 原始设计分析2. 新的设计思路2.1 定义通用的检测接口2.2 使用 std::function 和 std::any 管理检测模块2.3 构建可动态配置的检测管道 3. 示例实现3.1 定义检测接口和模块3.1.1 检测接口3.1.2 信号检测模块3.1.3 冻结检测模块3.1.4 其他检测模块 3.2 构建检…...
高级java每日一道面试题-2024年10月23日-JVM篇-说一下JVM有哪些垃圾回收算法?
如果有遗漏,评论区告诉我进行补充 面试官: 说一下JVM有哪些垃圾回收算法? 我回答: 在 Java 虚拟机 (JVM) 中,垃圾回收 (Garbage Collection, GC) 是一项非常重要的功能,用于自动管理应用程序的内存。JVM 采用多种垃圾回收算法来决定何时以及如何回收…...
高效文本编辑与导航:Vim中的三种基本模式及粘滞位的深度解析
✨✨ 欢迎大家来访Srlua的博文(づ ̄3 ̄)づ╭❤~✨✨ 🌟🌟 欢迎各位亲爱的读者,感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢,在这里我会分享我的知识和经验。&am…...
w005基于Springboot学生心理咨询评估系统
🙊作者简介:拥有多年开发工作经验,分享技术代码帮助学生学习,独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。🌹赠送计算机毕业设计600个选题excel文件,帮助大学选题。赠送开题报告模板ÿ…...
实战-任意文件下载
实战-任意文件下载 1、开局 开局一个弱口令,正常来讲我们一般是弱口令或者sql,或者未授权 那么这次运气比较好,直接弱口令进去了 直接访问看看有没有功能点,正常做测试我们一定要先找功能点 发现一个文件上传点,不…...
PG数据库之视图详解
1. 视图的基本定义 在PostgreSQL(简称pg)数据库中,视图(View)是一种虚拟表,其内容由SQL查询定义。视图并不实际存储数据,而是在每次查询时根据定义的查询语句动态生成结果。视图可以简化复杂的…...
时间序列预测(十五)——有关Python项目框架的实例分析
#1024程序员节|征文# 在之前的学习中,已经对时间序列预测的相关内容有了大致的了解。为了进一步加深理解,并能够将所学知识应用于实际中,我决定找一个完整的Python框架来进行深入学习。经过寻找,我终于找到了一篇非常具…...
ETL、ELT和反向ETL都有什么不同?怎么选择?
数据处理是现代企业中不可或缺的一部分。随着数据量的不断增长,如何高效地处理、转换和加载数据变得尤为重要。本文将介绍三种常见的数据处理方式:ETL、ELT和反向ETL,帮助读者更好地理解和选择适合自己业务需求的方式。 一、ETL 定义&#…...
linux 中文实用型手册 基于RHEL(红帽系)
硬件系统 Updated by wangjing on 2024-10-28 at 02:36:57 in Tongzhou District, Beijing. 硬件信息 机器型号 dmidecode | grep "Product Name"CPU型号 cat /proc/cpuinfo |grep "model name" | uniqWWWCPU详情 lscpuCPU个数 cat /proc/cpuinfo |grep &q…...
Hash表算法
哈希表 理论知识(本文来自于代码随想录摘抄)什么是哈希常见的三种哈希结数组:set:map:其他常用方法或者技巧(自己总结的) 练习题和讲解有效的字母移位词349. 两个数组的交集1. 两数之和454. 四数相加 II15. 三数之和 总…...
MySQL企业常见架构与调优经验分享
文章目录 一、选择 PerconaServer、MariaDB 还是 MYSQL二、常用的 MYSQL 调优策略三、MYSOL 常见的应用架构分享四、MYSOL 经典应用架构 观看学习课程的笔记,分享于此~ 课程:MySQL企业常见架构与调优经验分享 mysql官方优化文档 调优MySQL参数 一、选择 …...
C++引用类型变量
引用变量的主要用途是用作函数的形参。这样函数将使用原始数据,而不是副本。除指针之外,引用也为处理大型结构提供了一种非常方便的途径。 再C中使用&符号标识引用。也就是说C给&符号赋予了另一个含义,将其用来声明引用。 引用的声…...
《C++23 新特性:现代软件开发的变革力量》
在软件开发的快速演进中,C作为一种强大且广泛应用的编程语言,不断推陈出新以适应日益复杂的开发需求。C23 的到来,为现代软件开发带来了诸多新的机遇和挑战。它的新特性不仅影响着开发者的编程习惯,也在代码效率、可维护性以及软件…...
Educational Codeforces Round 88 E. Modular Stability
题目链接 Educational Codeforces Round 88 E. Modular Stability 思路 对于任意的非负整数 x x x,我们要满足 x % a % b x % b % a x \% a \% b x \% b \% a x%a%bx%b%a。因为 a < b a < b a<b,所以只有 b b b为 a a a的倍数时才满足条件…...
Android中SurfaceView与GLSurfaceView 的关系
SurfaceView 与 GLSurfaceView 的关系 在 Android 开发中,SurfaceView 和 GLSurfaceView 是实现自定义渲染效果的关键组件。它们提供了不同的渲染方式,适用于不同的应用场景。我们将通过以下几个方面详细说明 SurfaceView 和 GLSurfaceView 的特点及实现…...
numpy——数学运算
一、标量——矢量 import numpy as npa 3.14 b np.array([[9, 5], [2, 7]])print(a) print(b)# ---------- 四则运算 ---------- print(a b) # np.add print(a - b) # np.subtract print(a * b) # np.multiply print(a / b) # np.divide 二、矢量——矢量 import nump…...
【工具】Charles对360浏览器抓包抓包
Charles 和 switchy sharp 配合,可以对 Chrome 进行抓包也可以配合对360安全浏览器抓包。 本文以Windows 电脑中的配置为例,介绍如何实现抓包。(Mac中操作基本一致) 1.安装Charles 可根据自己的电脑下载对应的版本:…...
【HarmonyOS】判断应用是否已安装
【HarmonyOS】判断应用是否已安装 前言 在鸿蒙中判断应用是否已安全,只是通过包名是无法判断应用安装与否。在鸿蒙里新增了一种判断应用安装的工具方法,即:canOpenLink。 使用该工具函数的前提是,本应用配置了查询标签querySch…...
Qt Designer客户端安装和插件集(pyqt5和pyside2)
GitHub - PyQt5/QtDesignerPlugins: Qt Designer PluginsQt Designer Plugins. Contribute to PyQt5/QtDesignerPlugins development by creating an account on GitHub.https://github.com/PyQt5/QtDesignerPlugins 一、下载客户端 https://github.com/PyQt5/QtDesigner/rel…...
基于边缘计算的智能门禁系统架构设计分析
案例 阅读以下关于 Web 系统架构设计的叙述,回答问题1至问题3。 【说明】 某公司拟开发一套基于边缘计算的智能门禁系统,用于如园区、新零售、工业现场等存在来访被访业务的场景。来访者在来访前,可以通过线上提前预约的方式将自己的个人信息…...
鸿蒙实现相机拍照及相册选择照片
前言: 1.如果你的应用不是存储类型或者相机拍照类型,你就需要用 kit.CameraKit Api 实现相机拍照和相册选择照片功能,如果你不用这个的话,你使用 picker.PhotoViewPicker ,你就需要申请权限,那你提交应用审…...
「C/C++」C++17 之 std::filesystem::recursive_directory_iterator 目录及子目录迭代器
✨博客主页何曾参静谧的博客📌文章专栏「C/C」C/C程序设计📚全部专栏「VS」Visual Studio「C/C」C/C程序设计「UG/NX」BlockUI集合「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「PK」Parasoli…...
智能EDA小白从0开始 —— DAY30 冉谱微RFIC-GPT
在科技日新月异的今天,电子设计自动化(EDA)行业正以前所未有的速度推动着半导体产业的革新与发展,引领着全球电子产业迈向更加智能化、高效化的未来。作为EDA领域的佼佼者,冉谱公司始终站在技术创新的前沿,…...
Android -- 调用系统相册之图片裁剪保存
前言 最近线上反馈,部分vivo手机更换头像时调用系统相册保存图片失败,经本人测试,确实有问题。 经修复后,贴出这块的代码供小伙伴们参考使用。 功能 更换头像选择图片: 调用系统相机拍照,调用系统图片…...
周村网站制作首选公司/互联网营销师证书含金量
1 简介这是我的新系列教程PythonDash快速web应用开发的第一期,我们都清楚学习一个新工具需要一定的动力,那么为什么我要专门为Dash制作一个系列教程呢?图1Dash是一个高效简洁的Python框架,建立在Flask、Poltly.js以及React.js的基…...
my eclipse网站开发/友情链接价格
大家好,我是表哥Harker,表妹我来咯~ 从今天起是 Web前端开发基础入门的正式第一篇,早起的鸟儿有虫吃,开饭咯! 顺便说下整个系列有一篇学习导图方便表妹们查找 第一篇讲什么呢? 山不在高,有仙则灵,楼不在高,地基稳才行哟!我们可以观察房地产公司开发一片住宅区楼房时…...
wordpress微信免签约支付插件/seo教程有什么
1.两台服务器都设置上二进制日志和relay日志:#给服务器命名一个idserver_id140#声明二进制日志的文件为mysql-bin.xxxlog-binmysql-bin#二进制日志的格式:mixed/row/statementbinlog_formatmixed#主主复制时都需要配置relay-logrelay-logmysql-relay2.都…...
wordpress第一张缩略图/处理事件seo软件
我正在使用docker-compose.yaml构建我的应用程序以进行本地开发,使用两个Dockerfiles - 一个用于app(WordPress),另一个用于nginx。由于这是一个使用Jenkins管道构建的特定应用程序,我无法更改Dockerfiles,但我希望能够在本地测试…...
php网站开发说明文档/爱链网中可以进行链接买卖
8个动态数码管时钟显示#include#define uint unsigned int#define uchar unsigned charuchar i,temp,aa,miao,fen,shi,play0;/************************************************定义3个键,K1用于调节分,K2用于调节时,K3用于调节时**********…...
海口专业网站搭建厂/百度识图在线识图
python读取索引1)在Python文件处理中tell() (1) tell() in python file handling ) This method returns the current position of file pointer. 此方法返回文件指针的当前位置。 2)Python文件处理中的seek() (2) seek() in python file handling ) It set the position of f…...