活力39282
在线时间13640 小时
阅读权限200
管理员
自由的灵魂
- 积分
- 107434
- 主题
- 5630
- 回帖
- 26661
- 注册时间
- 2003-4-10
- 最后登录
- 2026-10-2
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
0、需求背景
论坛存在大量历史遗留的 ed2k:// 格式下载链接(主要为影视资源)。用户在点击这些链接时,现代浏览器会直接拦截非标准协议跳转,显示 about:blank#blocked 空白页,导致用户误以为链接失效或论坛功能异常。需要在保证已安装电驴客户端用户使用体验的前提下,为未安装用户提供明确的引导。
1、前期弯路
最初误判为 Discuz! 程序问题,考虑修改 function_discuzcode.php 中的 URL 解析逻辑。后经排查确认,about:blank#blocked 是现代浏览器(Chrome/Edge/Firefox)对非标准协议的统一拦截行为,与 Discuz! 版本无关。浏览器出于安全考虑,只允许跳转白名单协议(http/https/ftp/mailto 等),ed2k:// 不在其中。
2、技术方案
| 项目 | 选择 | 理由 | | 实现位置 | viewthread.htm 模板 | 仅帖子详情页生效,精准控制性能最优 | | 触发方式 | JavaScript 拦截点击事件 | 不修改原有链接结构,仅增加交互层 | | 交互模式 | 每次询问(不记忆状态) | 避免误操作后无法恢复,尊重用户即时判断 | | 唤起方式 | window.location.href = ed2kUrl | 浏览器原生协议调用,简洁可靠 | | 降级方案 | 剪贴板 API + 手动输入框 | 兼容不支持 navigator.clipboard 的旧浏览器 |
3、核心文件清单
| 文件 | 路径 | 作用 | | viewthread.htm | template/default/forum/ | 添加 ED2K 链接拦截脚本 |
4、功能特性
| 功能 | 说明 | | 链接检测 | 自动识别页面中所有 a[ href^="ed2k://" ] 链接 | | 唤起下载 | 点击确认后直接跳转 ed2k:// 协议,尝试唤起已安装的下载软件 | | 复制链接 | 点击取消时自动复制完整 ED2K 链接到剪贴板 | | 降级兼容 | 剪贴板 API 失败时弹出可手动复制链接的输入框 | | 无状态设计 | 每次点击均弹出询问,不记录任何用户偏好 |
5、关键代码片段(最终版)
- // viewthread.htm 底部,<!--{template common/footer}--> 之前
- <script>
- (function() {
- var ed2kLinks = document.querySelectorAll('a[href^="ed2k://"]');
- if (ed2kLinks.length === 0) return;
-
- for (var i = 0; i < ed2kLinks.length; i++) {
- ed2kLinks[i].addEventListener('click', (function(link) {
- return function(e) {
- e.preventDefault();
- var ed2kUrl = link.href;
-
- var userChoice = confirm(
- 'ED2K 下载链接\n\n' +
- '【已安装 eMule/aMule】点击"确定"立即唤起下载软件\n' +
- '【未安装或点确定无响应】点击"取消"复制链接\n\n' +
- '💡 复制后可在 eMule/迅雷/比特彗星 中新建任务并粘贴下载'
- );
-
- if (userChoice) {
- window.location.href = ed2kUrl;
- } else {
- try {
- navigator.clipboard.writeText(ed2kUrl).then(function() {
- alert('✅ 链接已复制!\n请在下载软件中“粘贴链接”添加任务。');
- }).catch(function() {
- prompt('请手动复制以下链接到下载软件中:', ed2kUrl);
- });
- } catch(e) {
- prompt('请手动复制以下链接到下载软件中:', ed2kUrl);
- }
- }
- };
- })(ed2kLinks[i]));
- }
- })();
- </script>
复制代码
6、解决的问题回顾
| 问题 | 解决方案 | | 点击 ED2K 链接跳转 about:blank#blocked | 拦截点击事件,改为询问框 + 手动跳转或复制链接 | | 已安装用户需额外操作 | 点击“确定”后直接唤起,无额外干扰 | | 未安装用户无任何提示 | 点击“取消”复制链接 + 提示安装 | | 迅雷用户点“确定”无响应 | 提示改为“未安装或点确定无响应”,引导使用复制功能 | | 用户误操作无法恢复 | 不记忆任何状态,每次点击均重新询问 | | 旧浏览器剪贴板兼容 | 降级至 prompt 手动复制对话框 |
7、实施效果对比
| 指标 | 实施前 | 实施后 | | 点击 ED2K 链接 | about:blank#blocked 空白页 | 弹窗询问 → 唤起下载或复制链接 | | 已安装用户操作 | 无法正常使用 | 点“确定”直接唤起 | | 未安装用户体验 | 茫然无措 | 明确知道需要复制链接 | | 用户求助率 | 频繁反馈链接失效 | 预期大幅降低 |
8、后续维护建议
| 事项 | 频率 | 说明 | | 提示文案调整 | 按需 | 直接修改 viewthread.htm 中的 confirm 文字 | | 模板缓存更新 | 每次修改后 | 后台 → 工具 → 更新缓存 → 模板缓存 | | 论坛版本升级 | 升级后需重做 | 升级可能覆盖 viewthread.htm,需备份此修改 |
9、技术沉淀
- 浏览器协议拦截不可绕过:现代浏览器不允许 JavaScript 直接调用非标准协议,只能通过让用户主动点击链接触发系统的协议处理程序。
- confirm 阻塞执行流:在确认框关闭前,页面不会继续执行,可安全地在用户选择后再决定跳转或复制。
- 剪贴板 API 降级方案:navigator.clipboard.writeText 返回 Promise,需 .catch() 处理权限拒绝或非 HTTPS 环境;同时提供 prompt 作为通用降级方案。
- 无状态设计更可靠:对于 ED2K 此类不确定客户端是否安装的协议,“每次都问”比“记住选择”更安全,用户不会因一次误操作而长期受困。
- 提示文案要适配迅雷用户:迅雷虽支持 ED2K,但协议唤起经常失败,提示文案需包含“点确定无响应”这类说明,而非建议用户检查设置。
总结
通过在帖子详情页增加原生 JavaScript 拦截层,将原本浏览器直接拦截的 ed2k:// 链接转换为“确认唤起 / 复制链接”的用户选择交互。方案不依赖任何第三方库,无状态设计避免误操作残留,兼顾已安装客户端的便捷性与未安装用户的引导需求。代码仅修改一个模板文件,维护成本极低。 |
|