X (推特) 书签滚动位置保持器

修复X(前Twitter)书签页面点击书签后自动滚动到顶部的问题,保持滚动位置

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         X (Twitter) Bookmark Scroll Position Keeper
// @name:zh-CN   X (推特) 书签滚动位置保持器
// @namespace    http://tampermonkey.net/
// @author       Roy WU
// @version      0.4
// @description  Fixes automatic scroll to top after clicking on a bookmarked post in X (formerly Twitter) Bookmarks page
// @description:zh-CN 修复X(前Twitter)书签页面点击书签后自动滚动到顶部的问题,保持滚动位置
// @match        https://x.com/*
// @match        https://twitter.com/*
// @grant        none
// @license      MIT
// ==/UserScript==

(function() {
    'use strict';
    
    let posY = 0;
    let isBookmarksPage = false;
    
    // 检查当前是否在书签页面
    function checkIfBookmarksPage() {
        isBookmarksPage = window.location.pathname.includes('/i/bookmarks');
        console.log('Is bookmarks page:', isBookmarksPage);
    }
    
    // 监听滚动事件
    function handleScroll() {
        if (!isBookmarksPage) return;
        
        const scrollPosition = window.scrollY;
        
        if (window.scrollY === 0) {
            console.log("back to zero!");
            window.scrollTo(0, posY);
        } else {
            posY = scrollPosition;
        }
        
        console.log(scrollPosition);
    }
    
    // 初始化
    function init() {
        checkIfBookmarksPage();
        window.addEventListener('scroll', handleScroll);
    }
    
    // 监听 URL 变化
    function observeUrlChanges() {
        const observer = new MutationObserver(function(mutations) {
            mutations.forEach(function(mutation) {
                if (location.href !== mutation._oldURL) {
                    checkIfBookmarksPage();
                }
            });
        });
        
        observer.observe(document.body, {
            childList: true,
            subtree: true
        });
    }
    
    // 启动监听
    init();
    observeUrlChanges();
    
    // 使用 history API 的监听作为后备方案
    window.addEventListener('popstate', checkIfBookmarksPage);
    window.addEventListener('pushstate', checkIfBookmarksPage);
    window.addEventListener('replacestate', checkIfBookmarksPage);
})();