您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
给搜同网站的帖子标题添加已读标识
// ==UserScript== // @name Soutong Forum Read Marker // @namespace https://felixchristian.dev/userscripts/soutong-read-marker // @version 1.0.5 // @description 给搜同网站的帖子标题添加已读标识 // @author FelixChristian // @license MIT // @match https://soutong.men/forum.php?mod=forumdisplay&fid=* // @match https://soutong.men/forum.php?mod=viewthread&tid=* // @grant GM_getValue // @grant GM_setValue // ==/UserScript== (function () { 'use strict'; const STORAGE_KEY = 'visitedTids'; let visitedTids = GM_getValue(STORAGE_KEY, {}); const url = new URL(location.href); const mod = url.searchParams.get('mod'); if (mod === 'viewthread') { const tid = url.searchParams.get('tid'); if (tid) { visitedTids[tid] = Date.now(); GM_setValue(STORAGE_KEY, visitedTids); } return; } if (mod === 'forumdisplay') { const tryMark = () => { const threadLinks = document.querySelectorAll('a.xst'); if (threadLinks.length === 0) { setTimeout(tryMark, 500); return; } threadLinks.forEach(link => { const href = link.getAttribute('href'); let tid; try { const fullUrl = new URL(href, location.origin); tid = fullUrl.searchParams.get('tid'); } catch (e) { return; } if (tid && visitedTids[tid] && !link.dataset.markedVisited) { const tag = document.createElement('span'); tag.textContent = '[已读] '; tag.style.color = 'red'; tag.style.fontWeight = 'bold'; tag.style.marginRight = '4px'; link.insertBefore(tag, link.firstChild); // ✅ 标记放左边 link.dataset.markedVisited = 'true'; } }); }; window.addEventListener('load', tryMark); const observer = new MutationObserver(tryMark); observer.observe(document.body, { childList: true, subtree: true }); } })();