找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 25|回复: 0

[维护日志] [2026-05-10] [功能] [ED2K链接优化] - 帖子详情页ED2K链接点击交互优化

[复制链接]
  • 打卡等级:本地老炮

9337

威望

7448

金钱

1万

贡献

管理员

自由的灵魂

积分
107434
主题
5630
回帖
26661
注册时间
2003-4-10
最后登录
2026-10-2
发表于 2026-5-10 01:20:06 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
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.htmtemplate/default/forum/添加 ED2K 链接拦截脚本


4、功能特性

功能说明
链接检测自动识别页面中所有 a[ href^="ed2k://" ] 链接
唤起下载点击确认后直接跳转 ed2k:// 协议,尝试唤起已安装的下载软件
复制链接点击取消时自动复制完整 ED2K 链接到剪贴板
降级兼容剪贴板 API 失败时弹出可手动复制链接的输入框
无状态设计每次点击均弹出询问,不记录任何用户偏好


5、关键代码片段(最终版)

  1. // viewthread.htm 底部,<!--{template common/footer}--> 之前
  2. <script>
  3. (function() {
  4.     var ed2kLinks = document.querySelectorAll('a[href^="ed2k://"]');
  5.     if (ed2kLinks.length === 0) return;
  6.    
  7.     for (var i = 0; i < ed2kLinks.length; i++) {
  8.         ed2kLinks[i].addEventListener('click', (function(link) {
  9.             return function(e) {
  10.                 e.preventDefault();
  11.                 var ed2kUrl = link.href;
  12.                
  13.                 var userChoice = confirm(
  14.                     'ED2K 下载链接\n\n' +
  15.                     '【已安装 eMule/aMule】点击"确定"立即唤起下载软件\n' +
  16.                     '【未安装或点确定无响应】点击"取消"复制链接\n\n' +
  17.                     '💡 复制后可在 eMule/迅雷/比特彗星 中新建任务并粘贴下载'
  18.                 );
  19.                
  20.                 if (userChoice) {
  21.                     window.location.href = ed2kUrl;
  22.                 } else {
  23.                     try {
  24.                         navigator.clipboard.writeText(ed2kUrl).then(function() {
  25.                             alert('✅ 链接已复制!\n请在下载软件中“粘贴链接”添加任务。');
  26.                         }).catch(function() {
  27.                             prompt('请手动复制以下链接到下载软件中:', ed2kUrl);
  28.                         });
  29.                     } catch(e) {
  30.                         prompt('请手动复制以下链接到下载软件中:', ed2kUrl);
  31.                     }
  32.                 }
  33.             };
  34.         })(ed2kLinks[i]));
  35.     }
  36. })();
  37. </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:// 链接转换为“确认唤起 / 复制链接”的用户选择交互。方案不依赖任何第三方库,无状态设计避免误操作残留,兼顾已安装客户端的便捷性与未安装用户的引导需求。代码仅修改一个模板文件,维护成本极低。
不懂就搜!点此搜点拨论坛。如果本坛没有,请尝试点此问AI,或跟帖提问。
发帖前注意看置顶帖。
不定期借助AI对点拨论坛陈年老帖进行挖坟回复,打扰勿怪!
发现掉链,请直接回帖报告。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|点拨论坛 |网站地图

GMT+8, 2026-10-2 04:59 , Processed in 0.037763 second(s), 5 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表