|
|
安装 Tampermonkey 浏览器扩展:
点击下方链接,Tampermonkey 会自动弹出安装提示:
🚀 点击安装 linuxdo-tag-filter.user.js
然后访问 Linux.do 开始使用 🎉
- 查看 linuxdo-tag-filter.user.js 脚本源码
- 复制 全部代码
- 打开 Tampermonkey → 创建新脚本
- 粘贴 并保存 (Ctrl+S)
- 访问 Linux.do 开始使用 🎉
脚本默认过滤 "抽奖" 标签,开箱即用。
点击浏览器工具栏的 Tampermonkey 图标 打开菜单:
┌─────────────────────────────────┐
│ ✅ 启用标签过滤 │ # 总开关
│ ➕ 添加黑名单标签 │ # 添加新标签
│ 🗑️ 清空黑名单 │ # 清空所有
│ ❌ 抽奖 │ # 点击删除
│ 📊 查看过滤统计 │ # 查看数据
│ ✅ 自动加载更多 │ # 智能预加载 ⭐
│ 调试模式 │ # 开发者模式
└─────────────────────────────────┘
添加黑名单标签
- 点击 "➕ 添加黑名单标签"
- 输入标签名(如
广告、水贴) - 确认,页面自动刷新 ✓
查看过滤统计
点击 "📊 查看过滤统计" 查看详细数据:
📊 过滤统计信息
══════════════════════════════
📄 总 Topics 数:150
🚫 已过滤数量:25
✅ 显示数量:125
📈 过滤率:16.7%
──────────────────────────────
🏷️ 各标签过滤统计:
• 抽奖: 20 个 (13.3%)
• 广告: 5 个 (3.3%)
──────────────────────────────
⚙️ 状态:✅ 已启用
🔍 调试:关闭
临时禁用过滤
- 点击 "✅ 启用标签过滤" 禁用
- 页面刷新,显示所有内容
- 再次点击恢复过滤
{
"enabled": true,
"blacklist": ["抽奖"],
"debug": false,
"autoLoad": true
}在浏览器控制台 (F12) 中执行:
// 查看当前配置
console.log(GM_getValue('ld_tag_filter_config_v1'));
// 批量导入黑名单
const config = {
enabled: true,
blacklist: ["抽奖", "广告", "水贴", "转发"],
debug: false,
autoLoad: true
};
GM_setValue('ld_tag_filter_config_v1', JSON.stringify(config));
location.reload();为什么有些 topics 没被过滤?
原因:标签名称不匹配
解决方法:
- 按 F12 打开控制台
- 启用 "调试模式"
- 刷新页面,查看日志中的实际标签名
- 确保黑名单中的标签完全一致(包括大小写)
示例:
- ❌
抽獎(繁体) ≠抽奖(简体) - ✅
抽奖=抽奖
配置会丢失吗?
不会。配置保存在浏览器本地存储中,除非:
- 手动清除浏览器数据
- 卸载浏览器扩展
如何重置配置?
控制台执行:
GM_deleteValue('ld_tag_filter_config_v1');
location.reload();脚本会影响性能吗?
不会!v4.x 经过精心优化:
- ✅ 代码精简高效(686 行)
- ✅ 智能去重,避免重复处理
- ✅ 即时过滤,零延迟
- ✅ 高效统计,实时更新
- ✅ 智能清理,避免内存泄漏
自动加载是如何工作的?
脚本使用三重策略确保无缝浏览:
- 提前触发 - 距离底部 800px 时预加载
- 智能补充 - 可见内容少于 15 个时自动加载
- DOM 监听 - 检测新内容后继续加载
原理:直接调用 Discourse 内部 API (model.list.loadMore())
点击帖子后返回,自动加载还有效吗?
有效!v4.1.0 已修复此问题。
工作原理:
- 脚本监听 URL 变化(SPA 路由切换)
- 检测到返回列表页时,自动重新初始化自动加载
- 清理旧的监听器,避免内存泄漏
支持场景:
- ✅ 浏览器前进/后退
- ✅ 点击论坛内链接
- ✅ 从帖子详情返回
- ✅ 不同列表页切换
提示:开启调试模式可查看详细的路由切换日志
如何开启调试模式?
- 点击菜单中的 "调试模式"
- 打开控制台 (F12)
- 查看详细日志,前缀为
[标签过滤器]
调试日志示例:
[标签过滤器] v4.1.0 初始化中...
[标签过滤器] ✓ CSS 样式已注入
[标签过滤器] ✓ 初始过滤完成:已过滤 5/30 个 topics
[标签过滤器] ✓ Discourse 已加载(第 3 次检测)
[标签过滤器] ✓ 自动加载已启动(API调用 + 提前800px触发)
[标签过滤器] URL 变化: https://linux.do/t/12345 → https://linux.do/latest
[标签过滤器] ✓ 检测到返回列表页,重新初始化自动加载
Bug 修复
- 🐛 修复自动加载失效问题 - 点击进入帖子后返回主页面,自动加载功能不再失效
- 🔄 SPA 路由监听 - 监听
pushState、replaceState和popstate事件 - ♻️ 智能重新初始化 - 返回列表页时自动重新初始化自动加载功能
- 🧹 资源清理 - 离开列表页时清理监听器,避免内存泄漏
技术改进
- ✅ 监听 URL 变化(
history.pushState/replaceState/popstate) - ✅ 检测列表页路径(
/latest、/top、/hot、主页) - ✅ 清理旧的 IntersectionObserver 和 MutationObserver
- ✅ 延迟重新初始化,等待 DOM 更新完成
适用场景
- ✅ 浏览器前进/后退按钮
- ✅ 点击论坛内部链接
- ✅ 从帖子详情返回列表
- ✅ 在不同列表页间切换
重大优化
- 🗑️ 代码精简 33.5% (893 → 594 行)
- ⚡ 性能提升,启动更快
- 🧹 删除冗余代码和开发调试功能
- 📦 更易维护的代码结构
删除内容
- ❌ 诊断函数 (-146 行)
- ❌ 属性监听器 (-34 行)
- ❌ CSS 验证逻辑 (-14 行)
- ❌ 重复函数和过度日志 (-100+ 行)
优化改进
- ✅ 提取常量
TOPIC_SELECTORS - ✅ 简化重试机制
- ✅ 精简日志输出
- ✅ 优化代码逻辑
功能完整性
- ✅ 所有核心功能保留
- ✅ 自动加载更加稳定
- ✅ 过滤机制更高效
查看历史版本
- 🔧 修复
unsafeWindow访问问题 - 🎯 使用页面真实 window 对象
- ✅ 解决 Discourse 不可用错误
- 🚀 主动调用 Discourse API
- 📡 直接调用
model.list.loadMore() - 🎯 提前 800px 触发加载
- 🔄 新增自动加载更多功能
- 🎯 智能滚动监听
- 🎉 初始版本发布
- 🚫 黑名单过滤
- 🎛️ 菜单管理
┌─────────────────────────────────────┐
│ 页面加载 (1s 延迟) │
└─────────────────┬───────────────────┘
│
┌────────▼────────┐
│ 轮询检测 Discourse │
│ (每 0.5s) │
└────────┬────────┘
│
┌────────▼────────┐
│ 初始化自动加载 │
└────────┬────────┘
│
┌─────────────┼─────────────┐
│ │ │
┌───▼───┐ ┌───▼───┐ ┌───▼───┐
│ 过滤器 │ │ 滚动监听 │ │ DOM监听 │
│ 立即过滤 │ │ 800px │ │ 智能补充 │
└────────┘ └────────┘ └───┬───┘
│
┌───────▼───────┐
│ SPA 路由监听 │
│ URL 变化检测 │
└───────┬───────┘
│
┌────────────┴────────────┐
│ │
┌─────▼──────┐ ┌───────▼──────┐
│ 返回列表页 │ │ 进入帖子页 │
│ 重新初始化 │ │ 清理监听器 │
└────────────┘ └──────────────┘
核心技术
MutationObserver- 监听 DOM 变化IntersectionObserver- 滚动位置监听unsafeWindow- 访问页面对象- Discourse Internal API - 直接调用加载
History API- 监听 SPA 路由变化(v4.1.0+)pushState/replaceState- 主动路由切换popstate- 浏览器前进/后退
欢迎贡献!如果你有任何想法或发现了 bug:
MIT License - 自由使用、修改和分发
如果这个脚本帮到了你,请给个 ⭐ Star!