CTRL+F 搜索中断,请提供替代方法

各位好,我遇到了和大家一样的烦人问题:在 Discourse 中使用 CTRL+F 搜索时,当前屏幕外的内容会因为“懒加载/从内存卸载”系统而消失。即使有 64GB 内存,你也无法在浏览器中搜索整个主题。据我了解,这更多的是一种反抓取功能,而不是节省内存的功能。以下是我找到的有效(且更安全)的替代方法:

  1. 使用打印视图:在主题 URL 末尾添加 /print,例如 https://forum.example.com/t/topic-name/12345/print。这会一次性加载主题中的所有帖子,并可与浏览器搜索 (CTRL+F) 配合使用。布局是简化的,但非常适合全文搜索。

  2. 滚动直到所有内容加载:持续滚动,直到懒加载系统在 DOM 中渲染出所有帖子。然后 CTRL+F 就能找到所有内容。对于长帖子串来说可能很繁琐,但无需额外工具即可工作。

  3. 使用 Discourse API:每个主题都有一个 JSON 端点,例如 https://forum.example.com/t/{topic_id}.json。你可以从 post_stream.posts 数组中提取所有帖子,在文本编辑器中打开,然后舒适地进行搜索。安全、官方,并且无论懒加载如何都能工作。

  4. 用户脚本/Greasemonkey 方法:你可以使用这个适用于 Chrome/Firefox 的简单用户脚本来自动化全页面帖子加载。它会自动点击“加载更多帖子”,直到主题完全渲染:

// ==UserScript==
// @name         Discourse Load All Posts
// @namespace    http://tampermonkey.net/
// @version      1.0
// @description  Auto-click "load more posts" to fully render topic for search
// @match        https://*/*
// @grant        none
// ==/UserScript==
(function() {
    'use strict';
    function loadAll() {
        const button = document.querySelector('.load-more[data-more-url]');
        if (button) {
            button.click();
            setTimeout(loadAll, 500); // 等待后重试
        }
    }
    window.addEventListener('load', () => {
        setTimeout(loadAll, 1000); // 页面加载后延迟一秒开始
    });
})();

完成后,CTRL+F 就可以搜索帖子中的所有内容了。

导出/外部搜索:使用打印视图或 API JSON 将帖子导出为 PDF、HTML 或纯文本。在 VSCode 或 Notepad++ 等编辑器中打开以进行全文搜索。

:warning: 不要尝试服务器黑客攻击:渗透数据库或在服务器端抓取内容是违法的且不必要的。使用 API/打印视图/用户脚本——它们都是安全的并能可靠地工作。

总结:最简单的方法是使用 /print 视图。更灵活的方法是使用 API JSON 或用户脚本。一旦所有帖子都加载到 DOM 中,CTRL+F 就能工作。希望 Discourse 团队能看到这一点,并考虑将来提供一个“完整搜索”选项——对于进行研究或深度阅读主题的任何人来说,这是一个严重的 UX 问题 :sweat_smile: