Context右键菜单
Context右键菜单(EMLOG 插件)
一款面向 EMLOG 博客系统 的自定义右键菜单插件。插件替换浏览器默认右键菜单,把常用的页面操作与站点导航集中到一个右键菜单中,各菜单项均可在后台一键开关、按需展示。
- 插件作者:LAO.CHEN
- 当前版本:1.0.0
- 插件主页:https://www.emlog.net/plugin/detail/1256
功能特性
- 替换默认右键菜单:页面任意位置右键即可呼出自定义菜单,操作集中、风格统一。
- 16 个可选菜单项:返回顶部、滚到底部、后退、前进、刷新、站点首页、随机文章、深色模式、复制选中内容、链接操作、图片操作等,全部可在后台独立开关。
- 上下文智能菜单:菜单内容随右键位置动态变化——选中文字时出现「复制选中内容」;右键在链接上时出现「查看/复制链接」;右键在图片上时出现「查看/复制图片」。
- 页面类菜单项可自定义跳转:隐私协议、用户协议、全部分类、全部标签四项,支持绑定站内单页或自定义链接;未配置目标时对应菜单项自动隐藏。
- 深色模式一键切换:菜单内可直接切换整站深色/浅色外观,并记住访客选择;菜单外观自动跟随站点深浅状态。
- 保留输入场景原生菜单:在输入框、文本域、可编辑区域中右键时,自动放行系统原生菜单,不影响复制粘贴等编辑操作。
- 主题外观自适应:菜单主题支持
自动 / 浅色 / 深色三档,浅色主题可跟随系统偏好自动切换。 - 轻量无依赖:纯原生 JavaScript 实现,无 jQuery、无第三方库,样式与主题完全隔离,不污染博客页面。
- 绿色安装/卸载:启用时写入默认配置,停用仅清理本插件自身的存储数据,不影响站点其他内容。
环境要求
| 项目 | 要求 |
|---|---|
| 博客平台 | EMLOG Pro / EMLOG 6.x(需支持 Storage、Input、Url::plugin 等 API) |
| 服务端 | PHP 7.0 及以上 |
| 浏览器 | 支持 ES5 与现代 CSS 变量的主流浏览器(Chrome / Firefox / Edge / Safari) |
安装方法
- 下载插件源码,将整个目录命名为
lcbk_contextmenu。 - 把
lcbk_contextmenu目录上传到博客的content/plugins/目录下。 - 登录 EMLOG 后台,进入 插件 页面,找到「Context右键菜单」,点击 启用。
- 启用后点击插件右侧的 设置 进入配置页。
启用插件后,无需修改主题,前台即会自动注入样式与脚本(通过 index_head 挂载点输出)。
后台设置说明
配置入口:后台 → 插件 → Context右键菜单 → 设置(/admin/plugin.php?plugin=lcbk_contextmenu)
基础设置
| 配置项 | 说明 | 默认值 |
|---|---|---|
| 启用前台右键菜单 | 插件总开关,关闭后前台不再输出任何内容 | 开启 |
| 在输入框/文本域/可编辑区域保留系统原生右键菜单 | 开启后在这些区域内右键时显示浏览器原生菜单,不影响文本编辑操作 | 开启 |
| 菜单外观主题 | 自动(跟随站点/系统深浅)、浅色、深色 三选一 |
自动 |
| 主题深色标记方式 | 插件切换 <html> 上的深色标记以让主题换肤,可选 class + data-theme(两者都写)/ 仅 class="dark" / 仅 data-theme="dark" |
class + data-theme |
深色标记方式怎么选? 若你的主题通过监听
html上的class="dark"来切换深色,选「仅 class」;若主题通过data-theme="dark"属性切换,选「仅 data-theme」;不确定时保持默认「两者都写」,兼容性最好。插件只切换标记触发主题换肤,自身外观自动跟随,互不叠加滤镜。
菜单项开关
以下菜单项通过开关独立控制,默认全部开启:
| 菜单项 | 行为 |
|---|---|
| 返回顶部 | 平滑滚动回页面顶部 |
| 滚到底部 | 平滑滚动到页面最底部 |
| 后退 | 浏览器历史后退(无历史时提示) |
| 前进 | 浏览器历史前进 |
| 刷新 | 重新加载当前页面 |
| 站点首页 | 跳转博客首页 |
| 随机文章 | 点击直接随机跳转到一篇日志 |
| 深色模式 | 一键切换整站深浅色并记住访客选择(菜单项文字/图标随状态切换) |
| 复制选中内容 | 仅在页面存在选中文字时出现 |
| 链接操作 | 仅右键在链接上时出现(新标签打开 / 复制链接地址) |
| 图片操作 | 仅右键在图片上时出现(新标签打开 / 复制图片地址) |
站内单页 / 自定义链接菜单项
隐私协议、用户协议、全部分类、全部标签四个菜单项遵循同一套规则:
- 必须同时满足「显示开关已勾选」且「目标链接已填写」,才会出现在前台右键菜单中;两者缺一则该菜单项不展示。
- 目标链接支持两种写法:
- 站内单页编号(纯数字,即 Page 的 ID),如
3; http(s)://开头的站外链接或/开头的站内绝对路径,如https://example.com/privacy。
- 站内单页编号(纯数字,即 Page 的 ID),如
- 「站内单页快捷选择」下拉框会自动列出站内全部单页,选中后自动把对应 ID 填入目标链接输入框。
- 菜单显示名称留空时使用默认文案(隐私协议 / 用户协议 / 全部分类 / 全部标签),填写后使用自定义名称。
- 「全部分类」「全部标签」既可直接跳到某个分类/标签聚合页,也可指向后台的分类管理/标签管理地址(默认关闭,需自行开启并配置目标)。
配置完成后点击「保存设置」即可生效。
前台使用说明
右键(contextmenu)页面任意区域即可呼出菜单,菜单内容会根据右键位置动态调整,菜单在屏幕边缘会自动贴边反转,不会溢出可视区。
关闭菜单的方式:点击菜单外部、滚动页面、改变窗口大小、切换窗口、按下 Esc,或在已展开的菜单上再次右键。
菜单中的操作支持 中键(鼠标滚轮点击)快速触发;普通左键点击项为关闭菜单后执行。
深色模式的记忆逻辑
- 访客在菜单中手动切换过深浅色后,选择会被记入浏览器本地存储(
localStorage),下次访问自动应用。 - 从未手动切换过的访客,菜单与页面完全跟随主题当前状态,插件不做任何干预。
随机文章跳转原理
「随机文章」菜单项调用插件内置入口:
/?plugin=lcbk_contextmenu&action=rand
/plugin/lcbk_contextmenu/rand (静态伪静态路由)
该入口从数据库中随机取一篇日志后直接 302 跳转,同时对响应输出 X-Robots-Tag: noindex,避免被搜索引擎收录中间跳转页。取不到日志时兜底跳回站点首页。该入口无前台展示页面,未知入口访问一律跳回首页。
文件结构
lcbk_contextmenu/
├── lcbk_contextmenu.php # 插件主文件:声明信息、路由、前台 head 输出与配置数据组装
├── lcbk_contextmenu_setting.php # 后台设置页(视图 + 保存逻辑,仅管理员可见)
├── lcbk_contextmenu_callback.php # 插件事件回调:启用写默认配置 / 更新清理废弃键 / 删除清理数据
├── lcbk_contextmenu_show.php # 插件前台入口:随机文章跳转(noindex)
├── config.php # 默认配置、配置读取与保存
├── menu.js # 前台核心脚本:菜单构建、事件绑定、深色切换、复制逻辑
├── style.css # 前台样式:浅色/深色/自动主题变量,与主题样式隔离
└── preview.jpg # 插件预览图(EMLOG 插件列表展示用)
| 文件 | 职责 |
|---|---|
lcbk_contextmenu.php |
插件头信息声明、Url::plugin 内部路由、index_head 挂载点输出、前端 JSON 配置组装 |
lcbk_contextmenu_setting.php |
后台设置页视图渲染与表单保存(校验菜单项开关、主题、深色标记方式及页面类菜单项目标) |
lcbk_contextmenu_callback.php |
EMLOG 生命周期回调:callback_init 写入默认配置、callback_up 清理废弃配置键、callback_rm 绿色卸载 |
lcbk_contextmenu_show.php |
前台展示入口,实现随机文章跳转;兼容 ?plugin= 与伪静态两种访问形式 |
config.php |
提供默认配置结构与 Storage 读写封装,读取时递归合并默认值保证键完整 |
menu.js |
菜单 DOM 构建、上下文识别(选中文字/链接/图片)、边界贴边定位、深色切换与本地记忆、复制与提示 |
style.css |
菜单/分隔线/提示样式,基于 CSS 变量实现浅色、深色与自动跟随三套外观 |
数据存储与卸载说明
- 插件配置通过 EMLOG
Storage组件存储,键名为lcbk_contextmenu。 - 升级插件:
callback_up会自动清理历史遗留的废弃配置键(如早期版本的随机列表模式、深色初始状态),无需手动处理。 - 停用插件:会删除本插件写入的全部配置数据,卸载干净,不残留垃圾数据,也不改动博客其他任何数据。
常见问题(FAQ)
Q:启用后前台没有任何变化?
先确认后台「启用前台右键菜单」已勾选且至少有一个菜单项处于有效状态;其次确认主题模板的 header 中正常执行了 EMLOG 的 index_head 挂载点(部分自定义主题会遗漏该钩子)。页面类菜单项(隐私/用户协议/分类/标签)还需同时满足「勾选显示 + 填写目标链接」才会展示。
Q:菜单为什么在输入框里不出现? 默认开启「在输入框/文本域/可编辑区域保留系统原生右键菜单」,这是有意为之,保证文本编辑场景可用原生复制粘贴。如需在这些区域也使用自定义菜单,在后台关闭该项即可。
Q:切深色模式后网页颜色不变化?
插件的深色模式依赖主题自身的深色换肤机制,仅切换 html 上的 class="dark" / data-theme="dark" 标记。若主题不使用这两种标记换肤,请改用主题自带的深色切换;若主题已使用其中一种,请到后台把「主题深色标记方式」调整为对应选项。
Q:隐私协议菜单项不显示?
检查该项「显示」开关是否勾选、目标链接是否填写。目标链接必须为站内单页编号、http(s):// 外链或 / 开头的站内路径,非法或留空均不会展示该项。
Q:随机文章点击后没有跳转? 确认「随机文章」开关已开启,且站点至少存在一篇已发布日志。该功能使用插件内置跳转页,无需额外配置目标链接。
更新日志
v1.0.0
- 首个正式版本。
- 提供自定义右键菜单,含页面工具、站点导航、深色模式、复制选中内容、链接/图片操作共 11 类快捷项,另含 4 个可绑定站内单页或自定义链接的页面类菜单项。
- 支持菜单浅色 / 深色 / 自动三套主题,深色标记方式可配置。
- 保留输入区域原生右键菜单,随机文章使用 noindex 中间跳转,卸载自动清理数据。
免责声明
本插件为 EMLOG 生态的免费开源插件,按「现状」提供,作者不对使用本插件造成的任何直接或间接损失承担责任。使用前建议先在测试环境验证兼容性,并做好站点备份。