1、前情回顾
紧接着前几天的帖子:想问一下L站看帖的正确姿势,很多大佬给予了很多宝贵的答复,再次感谢![]()
贴中提到的问题:对于浏览帖子过程总是会出现已经看过的帖子在别人回复后又被顶上来
经过一番折腾,终于是解决了这个问题,在这里分享一下我个人目前看帖的芝士。
2、献上芝士
先说下,我目前的看帖姿势:Do Scripts + 贴末油猴脚本
https://linux.do/t/topic/968380
2.1、Do scripts味芝士
Do Script提供了很多非常好的功能,我平时最常用的就是这四个:
当然还有很多很好的功能,我也只是刚用几天的新手,欢迎大家在贴中分享。
2.2、油猴味芝士
那我提供的油猴脚本有什么作用?请看下图
这是开启隐藏之后的效果:
可以看到非常amazing啊,已阅的帖子不见了,一下子突然清爽了很多,当然这里也继承了下方大佬脚本的最新创建功能,可以按照帖子创建时间排序。
3、脚本
另外还有一些:
私货
电脑端可以用中键打开新标签页浏览,这样不用老是刷新
如果对某个帖子比较感兴趣,可以直接收藏,说不定什么时候就有优质回答
贴中提到的问题 借鉴 大佬脚本 使用codex进行适当更改后得以解决
注意脚本并没有经过优化,完全由Codex编写,可能有卡顿延迟现象!!!
当然如果有大佬优化一下更好啦~~~
电脑端脚本
// ==UserScript==
// @name Linux.do按帖子创建时间排序
// @namespace http://tampermonkey.net/
// @version 1.2
// @description 在 Linux.do 网页上修改链接和增加新链接
// @author 马克思
// @match https://linux.do/*
// @grant none
// @icon data:image/png;base64,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
// ==/UserScript==
(function() {
'use strict';
var HIDE_SEEN_STORAGE_KEY = 'linuxdo_hide_seen_topics';
function isHideSeenEnabled() {
try {
return localStorage.getItem(HIDE_SEEN_STORAGE_KEY) === 'true';
} catch (error) {
return false;
}
}
function setHideSeenEnabled(enabled) {
try {
if (enabled) {
localStorage.setItem(HIDE_SEEN_STORAGE_KEY, 'true');
} else {
localStorage.removeItem(HIDE_SEEN_STORAGE_KEY);
}
} catch (error) {
// 忽略localStorage异常
}
}
var hideSeenToggleRefs = {
breadcrumb: null,
container: null,
checkbox: null
};
function clearHideSeenToggleRefs() {
hideSeenToggleRefs.breadcrumb = null;
hideSeenToggleRefs.container = null;
hideSeenToggleRefs.checkbox = null;
}
var navigationRefs = {
bar: null,
latestReplyItem: null,
latestCreatedItem: null
};
function refreshNavigationRefs(navBar) {
navigationRefs.bar = navBar || null;
navigationRefs.latestReplyItem = null;
navigationRefs.latestCreatedItem = null;
if (!navBar) {
return navigationRefs;
}
navigationRefs.latestCreatedItem = navBar.querySelector('li.nav-item_latest_created');
var navItems = navBar.querySelectorAll('li');
Array.prototype.forEach.call(navItems, function(item) {
if (navigationRefs.latestReplyItem) {
return;
}
var anchor = item.querySelector('a');
if (anchor && anchor.textContent.trim() === "最新回复") {
navigationRefs.latestReplyItem = item;
}
});
return navigationRefs;
}
function ensureNavigationRefs() {
var navBar = document.querySelector('ul#navigation-bar');
if (!navBar) {
return refreshNavigationRefs(null);
}
if (navigationRefs.bar !== navBar ||
(navigationRefs.latestReplyItem && !navBar.contains(navigationRefs.latestReplyItem)) ||
(navigationRefs.latestCreatedItem && !navBar.contains(navigationRefs.latestCreatedItem))) {
return refreshNavigationRefs(navBar);
}
if (!navigationRefs.latestReplyItem || !navigationRefs.latestCreatedItem) {
return refreshNavigationRefs(navBar);
}
return navigationRefs;
}
function ensureHideSeenStyles() {
if (document.getElementById('userscript-hide-seen-style')) {
return;
}
var style = document.createElement('style');
style.id = 'userscript-hide-seen-style';
style.textContent = 'tr.topic-list-item.hide-seen-hidden { display: none !important; }';
document.head.appendChild(style);
}
function isTopicRowUnread(row) {
if (!row || row.nodeType !== 1) {
return false;
}
if (row.classList.contains('unseen-topic')) {
return true;
}
var notificationBadges = row.querySelectorAll('.topic-post-badges a.badge.badge-notification');
var hasNumericBadge = false;
var hasNewTopicBadge = false;
Array.prototype.forEach.call(notificationBadges, function(badge) {
if (!hasNewTopicBadge && badge.classList.contains('new-topic')) {
hasNewTopicBadge = true;
return;
}
if (!hasNumericBadge) {
var badgeText = (badge.textContent || '').trim();
if (badgeText && /^\d+$/.test(badgeText)) {
hasNumericBadge = true;
}
}
});
if (hasNewTopicBadge) {
return true;
}
if (hasNumericBadge) {
return false;
}
if (row.classList.contains('visited') || row.classList.contains('read')) {
return false;
}
return true;
}
function applyTopicVisibility() {
ensureHideSeenStyles();
var hideSeen = isHideSeenEnabled();
var topicRows = document.querySelectorAll('tr.topic-list-item');
var hasVisibleRow = false;
var fallbackRow = null;
topicRows.forEach(function(row) {
var isUnread = isTopicRowUnread(row);
if (hideSeen && !isUnread) {
row.classList.add('hide-seen-hidden');
fallbackRow = row;
} else {
row.classList.remove('hide-seen-hidden');
hasVisibleRow = true;
}
});
if (hideSeen && !hasVisibleRow && fallbackRow) {
fallbackRow.classList.remove('hide-seen-hidden');
}
}
var visibilityUpdateTimer = null;
function scheduleApplyTopicVisibility(delay) {
if (visibilityUpdateTimer !== null) {
clearTimeout(visibilityUpdateTimer);
}
visibilityUpdateTimer = setTimeout(function() {
visibilityUpdateTimer = null;
applyTopicVisibility();
}, typeof delay === 'number' ? delay : 0);
}
function ensureHideSeenToggle() {
var breadcrumb = document.querySelector('ol.category-breadcrumb');
if (!breadcrumb) {
clearHideSeenToggleRefs();
return;
}
var legacyNavItem = document.querySelector('ul#navigation-bar li.nav-item_hide_seen');
if (legacyNavItem && legacyNavItem.parentNode) {
legacyNavItem.parentNode.removeChild(legacyNavItem);
}
var hideSeenEnabled = isHideSeenEnabled();
if (hideSeenToggleRefs.container && breadcrumb.contains(hideSeenToggleRefs.container)) {
if (hideSeenToggleRefs.checkbox) {
hideSeenToggleRefs.checkbox.checked = hideSeenEnabled;
}
hideSeenToggleRefs.breadcrumb = breadcrumb;
return;
}
clearHideSeenToggleRefs();
var existingItem = breadcrumb.querySelector('li.breadcrumb-hide-seen-toggle');
if (existingItem) {
var existingCheckbox = existingItem.querySelector('input[type="checkbox"]');
if (existingCheckbox) {
existingCheckbox.checked = hideSeenEnabled;
}
hideSeenToggleRefs.breadcrumb = breadcrumb;
hideSeenToggleRefs.container = existingItem;
hideSeenToggleRefs.checkbox = existingCheckbox;
return;
}
var hideSeenItem = document.createElement('li');
hideSeenItem.className = 'breadcrumb-hide-seen-toggle';
hideSeenItem.style.display = 'inline-flex';
hideSeenItem.style.alignItems = 'center';
hideSeenItem.style.gap = '4px';
hideSeenItem.style.marginLeft = '8px';
var label = document.createElement('label');
label.style.cursor = 'pointer';
label.style.display = 'inline-flex';
label.style.alignItems = 'center';
label.style.gap = '4px';
label.title = '隐藏已看过的帖子';
var checkbox = document.createElement('input');
checkbox.type = 'checkbox';
checkbox.checked = hideSeenEnabled;
var textSpan = document.createElement('span');
textSpan.textContent = '隐藏已阅';
label.appendChild(checkbox);
label.appendChild(textSpan);
hideSeenItem.appendChild(label);
var tagDetails = breadcrumb.querySelector('details.tag-drop');
var insertionTarget = tagDetails ? tagDetails.parentElement : null;
if (insertionTarget && insertionTarget.parentNode === breadcrumb) {
insertionTarget.insertAdjacentElement('afterend', hideSeenItem);
} else {
breadcrumb.appendChild(hideSeenItem);
}
hideSeenToggleRefs.breadcrumb = breadcrumb;
hideSeenToggleRefs.container = hideSeenItem;
hideSeenToggleRefs.checkbox = checkbox;
checkbox.addEventListener('change', function() {
setHideSeenEnabled(checkbox.checked);
applyTopicVisibility();
});
}
function updateActiveStates() {
var currentPath = window.location.pathname + window.location.search;
var refs = ensureNavigationRefs();
var navigationBar = refs.bar;
if (!navigationBar) {
return;
}
var latestReplyItem = refs.latestReplyItem;
var latestCreatedItem = refs.latestCreatedItem;
function setNavItemActive(navItem, isActive) {
if (!navItem) {
return;
}
navItem.classList.toggle('active', isActive);
var navAnchor = navItem.querySelector('a');
if (navAnchor) {
navAnchor.classList.toggle('active', isActive);
}
}
var navigationItems = navigationBar.querySelectorAll('li');
for (var i = 0; i < navigationItems.length; i++) {
var item = navigationItems[i];
var anchor = item.querySelector('a');
if (anchor && anchor.textContent.trim() === "最新回复") {
latestReplyItem = item;
break;
}
}
if (!latestCreatedItem) {
latestCreatedItem = navigationBar.querySelector('li.nav-item_latest_created');
}
// 检查是否有其他导航项已经是active状态(排除我们自己添加的两个项)
var hasOtherActiveItem = false;
for (var j = 0; j < navigationItems.length; j++) {
var navItem = navigationItems[j];
if (navItem !== latestReplyItem && navItem !== latestCreatedItem) {
if (navItem.classList.contains('active')) {
hasOtherActiveItem = true;
break;
}
}
}
// 如果有其他项是active状态,不要改变现有状态
if (hasOtherActiveItem) {
// 移除我们两个项的active状态
setNavItemActive(latestReplyItem, false);
setNavItemActive(latestCreatedItem, false);
navigationRefs.latestReplyItem = latestReplyItem;
navigationRefs.latestCreatedItem = latestCreatedItem;
navigationRefs.bar = navigationBar;
return;
}
// 没有其他active项时,根据路径设置我们的项
// 先移除两个项的active状态
setNavItemActive(latestReplyItem, false);
setNavItemActive(latestCreatedItem, false);
navigationRefs.latestReplyItem = latestReplyItem;
navigationRefs.latestCreatedItem = latestCreatedItem;
navigationRefs.bar = navigationBar;
// 根据路径设置相应的active状态
if (currentPath.includes('/latest?order=created')) {
// 选中"最新创建"
setNavItemActive(latestCreatedItem, true);
} else {
// 默认选中"最新回复"
setNavItemActive(latestReplyItem, true);
}
}
function modifyNavigationBar() {
var navigationBar = document.querySelector('ul#navigation-bar');
if (!navigationBar) return;
var navigationItems = navigationBar.querySelectorAll('li');
navigationItems.forEach(function(item) {
var anchor = item.querySelector('a');
if (anchor && anchor.textContent.trim() === "最新") {
// 修改原有的"最新"为"最新回复"
anchor.textContent = "最新回复";
// 检查是否已经存在"最新创建"项,避免重复添加
if (!navigationBar.querySelector('li.nav-item_latest_created')) {
var newestCreatedElement = document.createElement('li');
newestCreatedElement.title = "新发的帖子";
newestCreatedElement.id = "ember999";
newestCreatedElement.className = "latest_created ember-view nav-item_latest_created";
newestCreatedElement.innerHTML = '<a href="' + anchor.getAttribute('href') + '?order=created" pcked="1">最新创建</a>';
item.insertAdjacentElement('afterend', newestCreatedElement);
}
}
});
refreshNavigationRefs(navigationBar);
ensureHideSeenToggle();
// 短暂延迟后更新active状态,确保页面其他导航状态已经设置完毕
setTimeout(function() {
updateActiveStates();
ensureHideSeenToggle();
scheduleApplyTopicVisibility();
}, 50);
}
function observeDocumentChanges() {
var observer = new MutationObserver(function(mutations) {
var needNavUpdate = false;
var needVisibilityUpdate = false;
var needBreadcrumbUpdate = false;
mutations.forEach(function(mutation) {
if (mutation.type === 'attributes') {
if (mutation.target && mutation.target.nodeType === 1) {
if (!needVisibilityUpdate && mutation.target.classList) {
if (mutation.target.classList.contains('topic-list-item') ||
mutation.target.classList.contains('topic-list') ||
mutation.target.classList.contains('topic-list-body')) {
needVisibilityUpdate = true;
}
}
if (!needBreadcrumbUpdate && mutation.target.classList) {
if (mutation.target.matches && mutation.target.matches('ol.category-breadcrumb')) {
needBreadcrumbUpdate = true;
}
}
}
return;
}
if (mutation.type === 'childList') {
if (mutation.target && mutation.target.id === 'navigation-bar') {
needNavUpdate = true;
}
if (!needBreadcrumbUpdate && mutation.target && mutation.target.nodeType === 1) {
var targetElement = mutation.target;
if ((targetElement.matches && targetElement.matches('ol.category-breadcrumb')) ||
(targetElement.closest && targetElement.closest('ol.category-breadcrumb'))) {
needBreadcrumbUpdate = true;
}
}
Array.prototype.forEach.call(mutation.addedNodes, function(node) {
if (node.nodeType === 1 && node.classList && node.classList.contains('topic-list-item')) {
needVisibilityUpdate = true;
}
if (!needBreadcrumbUpdate && node.nodeType === 1) {
var element = node;
if ((element.matches && element.matches('ol.category-breadcrumb')) ||
(element.querySelector && element.querySelector('ol.category-breadcrumb'))) {
needBreadcrumbUpdate = true;
}
}
});
Array.prototype.forEach.call(mutation.removedNodes, function(node) {
if (node.nodeType === 1 && node.classList && node.classList.contains('topic-list-item')) {
needVisibilityUpdate = true;
}
if (!needBreadcrumbUpdate && node.nodeType === 1) {
var removedElement = node;
if ((removedElement.matches && removedElement.matches('ol.category-breadcrumb')) ||
(removedElement.querySelector && removedElement.querySelector('ol.category-breadcrumb'))) {
needBreadcrumbUpdate = true;
}
}
});
if (!needVisibilityUpdate && mutation.target && mutation.target.classList) {
if (mutation.target.classList.contains('topic-list') || mutation.target.classList.contains('topic-list-body')) {
needVisibilityUpdate = true;
}
}
if (!needVisibilityUpdate && mutation.target && mutation.target.id === 'topic-list') {
needVisibilityUpdate = true;
}
}
});
if (needNavUpdate) {
modifyNavigationBar();
}
if (needBreadcrumbUpdate) {
ensureHideSeenToggle();
}
if (needVisibilityUpdate) {
scheduleApplyTopicVisibility();
}
});
observer.observe(document.documentElement, {
childList: true,
attributes: true,
attributeFilter: ['class'],
subtree: true
});
}
function observeURLChanges() {
var currentURL = window.location.href;
var delayedRouteUpdateTimer = null;
function triggerRouteUpdates() {
updateActiveStates();
ensureHideSeenToggle();
scheduleApplyTopicVisibility();
if (delayedRouteUpdateTimer !== null) {
clearTimeout(delayedRouteUpdateTimer);
}
delayedRouteUpdateTimer = setTimeout(function() {
delayedRouteUpdateTimer = null;
updateActiveStates();
ensureHideSeenToggle();
scheduleApplyTopicVisibility();
}, 150);
}
var urlObserver = new MutationObserver(function() {
if (window.location.href !== currentURL) {
currentURL = window.location.href;
triggerRouteUpdates();
}
});
urlObserver.observe(document.documentElement, { childList: true, subtree: true });
// 监听popstate事件(浏览器前进后退)
window.addEventListener('popstate', function() {
triggerRouteUpdates();
});
// 监听pushstate和replacestate(SPA路由变化)
var originalPushState = history.pushState;
var originalReplaceState = history.replaceState;
history.pushState = function() {
originalPushState.apply(history, arguments);
triggerRouteUpdates();
};
history.replaceState = function() {
originalReplaceState.apply(history, arguments);
triggerRouteUpdates();
};
}
function waitForLoad(callback) {
if (document.readyState === 'complete') {
callback();
return;
}
var observer = new MutationObserver(function(mutations) {
if (document.readyState === 'complete') {
observer.disconnect();
callback();
}
});
observer.observe(document.documentElement, { childList: true, subtree: true });
}
waitForLoad(function() {
modifyNavigationBar();
observeDocumentChanges();
observeURLChanges();
window.addEventListener('focus', function() {
scheduleApplyTopicVisibility(120);
});
document.addEventListener('visibilitychange', function() {
if (document.visibilityState === 'visible') {
scheduleApplyTopicVisibility(120);
}
});
window.addEventListener('pageshow', function(event) {
if (event.persisted || document.visibilityState === 'visible') {
scheduleApplyTopicVisibility(120);
}
});
applyTopicVisibility();
});
})();
下面是适配移动端的油猴脚本:
什么,你说安卓不能用油猴,可以去看看我之前的帖子…
移动端脚本
// ==UserScript==
// @name Linux.do安卓端扩展
// @namespace http://tampermonkey.net/
// @version 1.4
// @description 安卓端 Linux.do 增加“最新创建”视图、隐藏已阅话题,强制新标签页打开并立刻标记隐藏
// @author Jood安卓版
// @match https://linux.do/*
// @grant none
// @icon data:image/png;base64,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
// ==/UserScript==
(function() {
'use strict';
var HIDE_SEEN_STORAGE_KEY = 'linuxdo_hide_seen_topics';
var HIDE_CLASS_NAME = 'hide-seen-hidden';
var STYLE_ELEMENT_ID = 'userscript-hide-seen-style';
var visibilityUpdateTimer = null;
var delayedUIUpdateTimer = null;
var hideSeenToggleRefs = {
breadcrumb: {
root: null,
container: null,
checkbox: null
},
controls: {
root: null,
container: null,
checkbox: null
}
};
function clearBreadcrumbToggleRefs() {
hideSeenToggleRefs.breadcrumb.root = null;
hideSeenToggleRefs.breadcrumb.container = null;
hideSeenToggleRefs.breadcrumb.checkbox = null;
}
function clearControlsToggleRefs() {
hideSeenToggleRefs.controls.root = null;
hideSeenToggleRefs.controls.container = null;
hideSeenToggleRefs.controls.checkbox = null;
}
function isHideSeenEnabled() {
try {
return localStorage.getItem(HIDE_SEEN_STORAGE_KEY) === 'true';
} catch (error) {
return false;
}
}
function setHideSeenEnabled(enabled) {
try {
if (enabled) {
localStorage.setItem(HIDE_SEEN_STORAGE_KEY, 'true');
} else {
localStorage.removeItem(HIDE_SEEN_STORAGE_KEY);
}
} catch (error) {
// ignore storage errors
}
}
function ensureHideSeenStyles() {
if (document.getElementById(STYLE_ELEMENT_ID)) {
return;
}
var style = document.createElement('style');
style.id = STYLE_ELEMENT_ID;
style.textContent = '.topic-list-body tr.' + HIDE_CLASS_NAME + ' { display: none !important; }';
document.head.appendChild(style);
}
function getTopicItems() {
return Array.prototype.slice.call(document.querySelectorAll('.topic-list-body tr'));
}
function isTopicItemUnread(item) {
if (!item || item.nodeType !== 1) {
return false;
}
if (item.classList.contains('unseen-topic')) {
return true;
}
var notificationBadges = item.querySelectorAll('.topic-post-badges a.badge.badge-notification, .badge-notification');
var hasNumericBadge = false;
var hasNewTopicBadge = false;
Array.prototype.forEach.call(notificationBadges, function(badge) {
if (!badge) {
return;
}
var badgeClassList = badge.classList || null;
if (!hasNewTopicBadge && badgeClassList && badgeClassList.contains('new-topic')) {
hasNewTopicBadge = true;
return;
}
if (!hasNumericBadge) {
var badgeText = (badge.textContent || '').trim();
if (!badgeText) {
badgeText = badge.getAttribute('data-badge') || badge.getAttribute('data-count') || '';
}
if (badgeText && /^\d+$/.test(badgeText)) {
hasNumericBadge = true;
}
}
});
if (hasNewTopicBadge) {
return true;
}
if (hasNumericBadge) {
return false;
}
if (item.classList.contains('visited') || item.classList.contains('read')) {
return false;
}
return true;
}
function applyTopicVisibility() {
ensureHideSeenStyles();
var hideSeen = isHideSeenEnabled();
var topicItems = getTopicItems();
var hasVisibleItem = false;
var fallbackItem = null;
topicItems.forEach(function(item) {
var isUnread = isTopicItemUnread(item);
if (hideSeen && !isUnread) {
item.classList.add(HIDE_CLASS_NAME);
fallbackItem = item;
} else {
item.classList.remove(HIDE_CLASS_NAME);
hasVisibleItem = true;
}
});
if (hideSeen && !hasVisibleItem && fallbackItem) {
fallbackItem.classList.remove(HIDE_CLASS_NAME);
}
}
function scheduleApplyTopicVisibility(delay) {
if (visibilityUpdateTimer !== null) {
clearTimeout(visibilityUpdateTimer);
}
visibilityUpdateTimer = setTimeout(function() {
visibilityUpdateTimer = null;
applyTopicVisibility();
}, typeof delay === 'number' ? delay : 0);
}
function ensureHideSeenToggle() {
ensureHideSeenToggleInBreadcrumb();
ensureHideSeenToggleInControls();
}
function triggerUIUpdates(runNavigation) {
if (typeof runNavigation !== 'boolean') {
runNavigation = true;
}
if (runNavigation) {
enhanceNavigation();
}
ensureHideSeenToggle();
scheduleApplyTopicVisibility();
if (delayedUIUpdateTimer !== null) {
clearTimeout(delayedUIUpdateTimer);
}
delayedUIUpdateTimer = setTimeout(function() {
delayedUIUpdateTimer = null;
if (runNavigation) {
enhanceNavigation();
}
ensureHideSeenToggle();
scheduleApplyTopicVisibility();
}, 150);
}
function ensureHideSeenToggleInBreadcrumb() {
var breadcrumb = document.querySelector('ol.category-breadcrumb');
if (!breadcrumb) {
clearBreadcrumbToggleRefs();
return;
}
var refs = hideSeenToggleRefs.breadcrumb;
if (refs.container && !refs.container.isConnected) {
clearBreadcrumbToggleRefs();
refs = hideSeenToggleRefs.breadcrumb;
}
var hideSeenEnabled = isHideSeenEnabled();
if (refs.container && breadcrumb.contains(refs.container)) {
if (refs.checkbox) {
refs.checkbox.checked = hideSeenEnabled;
}
refs.root = breadcrumb;
return;
}
var existing = breadcrumb.querySelector('li.breadcrumb-hide-seen-toggle');
if (existing) {
var existingCheckbox = existing.querySelector('input[type="checkbox"]');
if (existingCheckbox) {
existingCheckbox.checked = hideSeenEnabled;
}
refs.root = breadcrumb;
refs.container = existing;
refs.checkbox = existingCheckbox;
return;
}
var hideSeenItem = document.createElement('li');
hideSeenItem.className = 'breadcrumb-hide-seen-toggle';
hideSeenItem.style.display = 'inline-flex';
hideSeenItem.style.alignItems = 'center';
hideSeenItem.style.gap = '4px';
hideSeenItem.style.marginLeft = '8px';
var label = document.createElement('label');
label.style.cursor = 'pointer';
label.style.display = 'inline-flex';
label.style.alignItems = 'center';
label.style.gap = '4px';
label.title = '隐藏已看过的帖子';
var checkbox = document.createElement('input');
checkbox.type = 'checkbox';
checkbox.checked = hideSeenEnabled;
var textSpan = document.createElement('span');
textSpan.textContent = '隐藏已阅';
label.appendChild(checkbox);
label.appendChild(textSpan);
hideSeenItem.appendChild(label);
var tagDetails = breadcrumb.querySelector('details.tag-drop');
var insertionTarget = tagDetails ? tagDetails.parentElement : null;
if (insertionTarget && insertionTarget.parentNode === breadcrumb) {
insertionTarget.insertAdjacentElement('afterend', hideSeenItem);
} else {
breadcrumb.appendChild(hideSeenItem);
}
refs.root = breadcrumb;
refs.container = hideSeenItem;
refs.checkbox = checkbox;
checkbox.addEventListener('change', function() {
setHideSeenEnabled(checkbox.checked);
scheduleApplyTopicVisibility();
});
}
function ensureHideSeenToggleInControls() {
var controls = document.querySelector('.navigation-controls');
if (!controls) {
clearControlsToggleRefs();
return;
}
var refs = hideSeenToggleRefs.controls;
if (refs.container && !refs.container.isConnected) {
clearControlsToggleRefs();
refs = hideSeenToggleRefs.controls;
}
var createButton = controls.querySelector('#create-topic');
var hideSeenEnabled = isHideSeenEnabled();
if (refs.container && controls.contains(refs.container)) {
if (refs.checkbox) {
refs.checkbox.checked = hideSeenEnabled;
}
if (createButton && createButton.parentNode && refs.container.nextSibling !== createButton) {
createButton.parentNode.insertBefore(refs.container, createButton);
} else if (!createButton && refs.container.parentNode !== controls) {
controls.appendChild(refs.container);
}
refs.root = controls;
return;
}
var existing = controls.querySelector('.hide-seen-toggle-control');
if (existing) {
var existingCheckbox = existing.querySelector('input[type="checkbox"]');
if (existingCheckbox) {
existingCheckbox.checked = hideSeenEnabled;
}
if (createButton && createButton.parentNode && existing.nextSibling !== createButton) {
createButton.parentNode.insertBefore(existing, createButton);
} else if (!createButton && existing.parentNode !== controls) {
controls.appendChild(existing);
}
refs.root = controls;
refs.container = existing;
refs.checkbox = existingCheckbox;
return;
}
var container = document.createElement('label');
container.className = 'hide-seen-toggle-control';
container.style.display = 'inline-flex';
container.style.alignItems = 'center';
container.style.gap = '6px';
container.style.marginRight = '8px';
container.style.cursor = 'pointer';
container.style.padding = '4px 10px';
container.style.borderRadius = '16px';
container.style.border = '1px solid rgba(0, 0, 0, 0.1)';
container.style.background = 'var(--primary-very-low, rgba(0,0,0,0.03))';
var checkbox = document.createElement('input');
checkbox.type = 'checkbox';
checkbox.checked = hideSeenEnabled;
var textSpan = document.createElement('span');
textSpan.textContent = '隐藏已阅';
textSpan.style.fontSize = '14px';
container.appendChild(checkbox);
container.appendChild(textSpan);
if (createButton && createButton.parentNode) {
createButton.parentNode.insertBefore(container, createButton);
} else {
controls.appendChild(container);
}
refs.root = controls;
refs.container = container;
refs.checkbox = checkbox;
checkbox.addEventListener('change', function() {
setHideSeenEnabled(checkbox.checked);
scheduleApplyTopicVisibility();
});
}
function normalizeHref(href) {
if (!href) {
return '';
}
try {
var link = document.createElement('a');
link.href = href;
return link.pathname + link.search;
} catch (error) {
return href;
}
}
function currentPath() {
return window.location.pathname + window.location.search;
}
function isLatestPath(path) {
if (!path) {
return false;
}
if (!path.startsWith('/latest')) {
return false;
}
return !/[\?&]order=created\b/.test(path);
}
function isLatestCreatedPath(path) {
if (!path) {
return false;
}
if (!path.startsWith('/latest')) {
return false;
}
return /[\?&]order=created\b/.test(path);
}
function isLatestHref(href) {
return isLatestPath(normalizeHref(href));
}
function isLatestCreatedHref(href) {
return isLatestCreatedPath(normalizeHref(href));
}
function setActiveState(item, active) {
if (!item) {
return;
}
if (active) {
item.classList.add('active');
} else {
item.classList.remove('active');
}
var anchor = item.querySelector('a');
if (!anchor) {
return;
}
if (active) {
anchor.classList.add('active');
anchor.setAttribute('aria-current', 'page');
} else {
anchor.classList.remove('active');
anchor.removeAttribute('aria-current');
}
}
function locateNavigationLists() {
var lists = [];
var modalLists = document.querySelectorAll('.dropdown-menu');
Array.prototype.forEach.call(modalLists, function(list) {
lists.push(list);
});
return lists;
}
function computeCreatedHref(originalHref) {
var href = originalHref || '/latest';
if (/[\?&]order=created\b/.test(href)) {
return href;
}
return href + (href.indexOf('?') === -1 ? '?' : '&') + 'order=created';
}
function ensureLatestCreatedOption(listElement) {
if (!listElement) {
return;
}
var latestItem = listElement.querySelector('li.nav-item_latest');
if (!latestItem) {
return;
}
var existingCreated = listElement.querySelector('li.nav-item_latest_created');
var latestAnchor = latestItem.querySelector('a');
if (!latestAnchor) {
return;
}
var latestHref = latestAnchor.getAttribute('href') || '';
var createdHref = computeCreatedHref(latestHref);
var originalText = latestAnchor.textContent || '';
var trimmed = originalText.trim();
var replaced = trimmed.replace('最新', '最新创建');
if (replaced === trimmed) {
replaced = '最新创建';
}
if (existingCreated) {
var createdAnchor = existingCreated.querySelector('a');
if (createdAnchor) {
createdAnchor.setAttribute('href', createdHref);
createdAnchor.textContent = replaced;
}
return;
}
var clone = latestItem.cloneNode(true);
clone.classList.remove('nav-item_latest');
clone.classList.remove('latest');
clone.classList.remove('active');
clone.classList.add('latest_created');
clone.classList.add('nav-item_latest_created');
clone.title = '最近创建的话题';
if (clone.id) {
clone.id = clone.id + '_created';
} else {
clone.id = 'latest-created-item';
}
var cloneAnchor = clone.querySelector('a');
if (cloneAnchor) {
cloneAnchor.classList.remove('active');
cloneAnchor.removeAttribute('aria-current');
cloneAnchor.setAttribute('href', createdHref);
cloneAnchor.textContent = replaced;
}
latestItem.insertAdjacentElement('afterend', clone);
}
function updateTriggerButtonLabel() {
var triggerButton = document.querySelector('.linuxdoscripts-setting') || document.querySelector('button[data-identifier="list-control-toggle-link"]');
if (!triggerButton) {
return;
}
var textSpan = triggerButton.querySelector('.list-control-toggle-link__text, .name, span');
if (!textSpan) {
textSpan = triggerButton;
}
var path = currentPath();
var newText = '';
if (isLatestCreatedPath(path)) {
newText = '最新创建';
} else if (isLatestPath(path)) {
newText = '最新';
}
if (newText) {
if (textSpan.childNodes.length > 0) {
Array.prototype.forEach.call(textSpan.childNodes, function(node) {
if (node.nodeType === 3 && node.textContent.trim().indexOf('最新') !== -1) {
node.textContent = newText;
}
});
if(textSpan.textContent.indexOf('最新') === -1 && textSpan.textContent.trim() !== newText){
textSpan.textContent = newText;
}
} else {
textSpan.textContent = newText;
}
}
}
function updateActiveStates() {
var path = currentPath();
var lists = locateNavigationLists();
lists.forEach(function(listElement) {
var latestItem = null;
var createdItem = null;
var items = listElement.querySelectorAll('li');
Array.prototype.forEach.call(items, function(item) {
var anchor = item.querySelector('a');
if (!anchor) {
return;
}
var href = anchor.getAttribute('href') || '';
if (isLatestCreatedHref(href)) {
createdItem = item;
} else if (isLatestHref(href)) {
latestItem = item;
}
});
if (!latestItem && !createdItem) {
return;
}
if (isLatestCreatedPath(path)) {
setActiveState(latestItem, false);
setActiveState(createdItem, true);
} else if (isLatestPath(path)) {
setActiveState(createdItem, false);
setActiveState(latestItem, true);
} else {
setActiveState(createdItem, false);
setActiveState(latestItem, false);
}
});
updateTriggerButtonLabel();
}
function enhanceNavigation() {
var lists = locateNavigationLists();
lists.forEach(function(listElement) {
ensureLatestCreatedOption(listElement);
});
updateActiveStates();
}
function nodeContainsSelector(node, selector) {
if (!node || node.nodeType !== 1) {
return false;
}
if (node.matches && node.matches(selector)) {
return true;
}
if (node.querySelector) {
return !!node.querySelector(selector);
}
return false;
}
function observeDocumentChanges() {
var observer = new MutationObserver(function(mutations) {
var navChanged = false;
var breadcrumbChanged = false;
var topicsChanged = false;
mutations.forEach(function(mutation) {
if (mutation.type === 'childList') {
Array.prototype.forEach.call(mutation.addedNodes, function(node) {
if (!navChanged && nodeContainsSelector(node, '.dropdown-menu')) {
navChanged = true;
}
if (!navChanged && nodeContainsSelector(node, '.navigation-controls')) {
navChanged = true;
}
if (!breadcrumbChanged && nodeContainsSelector(node, 'ol.category-breadcrumb')) {
breadcrumbChanged = true;
}
if (!topicsChanged && nodeContainsSelector(node, '.topic-list-body tr')) {
topicsChanged = true;
}
});
Array.prototype.forEach.call(mutation.removedNodes, function(node) {
if (!navChanged && nodeContainsSelector(node, '.dropdown-menu')) {
navChanged = true;
}
if (!navChanged && nodeContainsSelector(node, '.navigation-controls')) {
navChanged = true;
}
if (!breadcrumbChanged && nodeContainsSelector(node, 'ol.category-breadcrumb')) {
breadcrumbChanged = true;
}
if (!topicsChanged && nodeContainsSelector(node, '.topic-list-body tr')) {
topicsChanged = true;
}
});
}
if (!navChanged && mutation.target && mutation.target.nodeType === 1) {
if (mutation.target.matches && mutation.target.matches('.dropdown-menu')) {
navChanged = true;
}
if (mutation.target.matches && mutation.target.matches('.navigation-controls')) {
navChanged = true;
}
}
if (!breadcrumbChanged && mutation.target && mutation.target.nodeType === 1) {
if (mutation.target.matches && mutation.target.matches('ol.category-breadcrumb')) {
breadcrumbChanged = true;
}
}
if (!topicsChanged && mutation.target && mutation.target.nodeType === 1) {
if (mutation.target.matches && mutation.target.matches('.topic-list-body, .topic-list-body tr')) {
topicsChanged = true;
}
}
});
if (navChanged) {
triggerUIUpdates(true);
}
if (breadcrumbChanged && !navChanged) {
triggerUIUpdates(false);
}
if (topicsChanged) {
scheduleApplyTopicVisibility();
}
});
observer.observe(document.documentElement, { childList: true, subtree: true });
}
function observeURLChanges() {
var lastURL = window.location.href;
var urlObserver = new MutationObserver(function() {
if (window.location.href !== lastURL) {
lastURL = window.location.href;
triggerUIUpdates(true);
}
});
urlObserver.observe(document.documentElement, { childList: true, subtree: true });
window.addEventListener('popstate', function() {
triggerUIUpdates(true);
});
var originalPushState = history.pushState;
history.pushState = function() {
originalPushState.apply(history, arguments);
triggerUIUpdates(true);
};
var originalReplaceState = history.replaceState;
history.replaceState = function() {
originalReplaceState.apply(history, arguments);
triggerUIUpdates(true);
};
}
// 拦截点击事件,强制让帖子在新标签页打开,并在当前页将其标记为已阅
function enableNewTabForTopics() {
document.addEventListener('click', function(e) {
var row = e.target.closest('.topic-list-body tr');
if (!row) return;
var clickedAnchor = e.target.closest('a');
var targetHref = null;
// 找出帖子链接
if (clickedAnchor && clickedAnchor.href) {
var url = new URL(clickedAnchor.href, window.location.origin);
if (url.pathname.startsWith('/t/')) {
targetHref = clickedAnchor.href;
} else {
return; // 如果点的是头像或标签等非帖子链接,则放弃拦截
}
} else {
var mainLink = row.querySelector('a.title') || row.querySelector('a.raw-link') || row.querySelector('a');
if (mainLink && mainLink.href) {
var fallbackUrl = new URL(mainLink.href, window.location.origin);
if (fallbackUrl.pathname.startsWith('/t/')) {
targetHref = mainLink.href;
}
}
}
// 如果成功抓到了帖子链接
if (targetHref) {
e.preventDefault();
e.stopPropagation();
// 重点:在 DOM 里强行给这一行加上 'visited' 和 'read' 的状态,并剥除 'unseen-topic'
row.classList.add('visited');
row.classList.add('read');
row.classList.remove('unseen-topic');
// 触发隐藏判定:只要你开着“隐藏已阅”,这行帖子就会原地消失
scheduleApplyTopicVisibility();
// 弹出新页面
window.open(targetHref, '_blank');
}
}, true);
}
function waitForLoad(callback) {
if (document.readyState === 'complete' || document.readyState === 'interactive') {
callback();
return;
}
document.addEventListener('DOMContentLoaded', function onReady() {
document.removeEventListener('DOMContentLoaded', onReady);
callback();
});
}
waitForLoad(function() {
triggerUIUpdates(true);
applyTopicVisibility();
observeDocumentChanges();
observeURLChanges();
enableNewTabForTopics();
window.addEventListener('focus', function() {
scheduleApplyTopicVisibility(120);
});
document.addEventListener('visibilitychange', function() {
if (document.visibilityState === 'visible') {
scheduleApplyTopicVisibility(120);
}
});
window.addEventListener('pageshow', function(event) {
if (event.persisted || document.visibilityState === 'visible') {
scheduleApplyTopicVisibility(120);
}
});
});
})();
v1.4 更新一下移动端脚本,现在默认打开新的页面,不会造成反复刷新卡顿


