Greasy Fork is available in English.

记录和恢复帖子位置

在网页中保存和恢复帖子的位置

// ==UserScript==
// @name         记录和恢复帖子位置
// @namespace    http://tampermonkey.net/
// @version      0.1
// @description  在网页中保存和恢复帖子的位置
// @author       静伟
// @match        https://wx.zsxq.com/
// @grant        none
// @license MIT
// ==/UserScript==

(function() {
    'use strict';

    // 在页面添加“保存记录”和“恢复记录”按钮
    var saveBtn = document.createElement('button');
    saveBtn.textContent = '保存记录';
    saveBtn.style.position = 'fixed';
    saveBtn.style.bottom = '50px';
    saveBtn.style.right = '20px';
    document.body.appendChild(saveBtn);

    var restoreBtn = document.createElement('button');
    restoreBtn.textContent = '恢复记录';
    restoreBtn.style.position = 'fixed';
    restoreBtn.style.bottom = '20px';
    restoreBtn.style.right = '20px';
    document.body.appendChild(restoreBtn);

    // 当点击“保存记录”按钮时,保存当前可见的最新帖子的时间和成员名字
    saveBtn.onclick = function () {
        var topics = document.getElementsByClassName('topic-container');
        var lastVisibleDate;
        var lastVisibleMember;
        for (var i = 0; i < topics.length; i++) {
            if (topics[i].getBoundingClientRect().top > window.innerHeight) {
                break;
            }
            var dateElement = topics[i].getElementsByClassName('date')[0];
            var memberElement = topics[i].getElementsByClassName('role member')[0];
            if (dateElement && memberElement) {
                lastVisibleDate = dateElement;
                lastVisibleMember = memberElement;
            }
        }
        if (lastVisibleDate && lastVisibleMember) {
            localStorage.setItem('lastDate', lastVisibleDate.textContent);
            localStorage.setItem('lastMember', lastVisibleMember.textContent);
            alert('记录已保存,帖子时间:' + lastVisibleDate.textContent + ', 发布成员:' + lastVisibleMember.textContent);
        }
    };

    // 当点击“恢复记录”按钮时,滚动页面直到找到保存的帖子
    restoreBtn.onclick = function () {
        var lastDateStr = localStorage.getItem('lastDate');
        var lastMemberStr = localStorage.getItem('lastMember');
        if (lastDateStr && lastMemberStr) {
            var lastDate = new Date(lastDateStr);
            function scrollToLastDate() {
                var topics = document.getElementsByClassName('topic-container');
                for (var i = 0; i < topics.length; i++) {
                    var dateElement = topics[i].getElementsByClassName('date')[0];
                    var memberElement = topics[i].getElementsByClassName('role member')[0];
                    if (dateElement && memberElement) {
                        var currentDate = new Date(dateElement.textContent);
                        var currentMember = memberElement.textContent;
                        if (currentDate.getTime() === lastDate.getTime() && currentMember === lastMemberStr) {
                            // 先执行滚动操作,再显示弹出窗口
                            dateElement.scrollIntoView();
                            setTimeout(function () {
                                alert('已跳转到成员:”' + lastMemberStr + '“在”' + lastDateStr + '“发布的帖子');
                            }, 0);
                            return;
                        } else if (currentDate < lastDate) {
                            alert('找不到' + lastDateStr + '的帖子,发布成员:' + lastMemberStr);
                            return;
                        }
                    }
                }
                window.scrollTo(0, document.body.scrollHeight);
                setTimeout(scrollToLastDate, 1000);
            }

            var menuContainer = document.getElementsByClassName('menu-container')[0];
            var items = menuContainer.getElementsByClassName('item');
            var targetItem;
            for (var i = 0; i < items.length; i++) {
                var item = items[i];
                console.log(item.textContent); // 打印所有的item
                if (item.textContent.includes('风向标')) {
                    targetItem = item;
                    break;
                }
            }

            if (targetItem) {
                targetItem.click();// 模拟点击操作
                // 延迟1秒后开始查找帖子,给页面足够的时间加载和跳转
                setTimeout(scrollToLastDate, 1000);
            }

        }
    };

})();