Robust scroll blocking with multiple fallbacks
目前為
// ==UserScript==
// @name Deepseek No Auto-Scroll (Stable)
// @description Robust scroll blocking with multiple fallbacks
// @match *://*.deepseek.com/*
// @version 0.0.1.20250316190240
// @namespace https://greasyfork.org/users/1435046
// ==/UserScript==
(function() {
'use strict';
const SCROLL_SELECTORS = [
'[class*="overflow-auto"]', // Class contains "overflow-auto"
'[class*="scroll-container"]', // Class contains "scroll-container"
'main > div > div', // Structural fallback
'div[style*="overflow"]' // Inline style overflow
];
let activeContainer = null;
const blockScroll = (container) => {
if(container.__scrollBlocked) return;
// Nuclear option: Remove all scroll behaviors
container.style.overflow = 'hidden !important';
container.style.overscrollBehavior = 'none !important';
// Block all scroll methods
const scrollMethods = ['scrollTo', 'scrollBy', 'scrollIntoView'];
scrollMethods.forEach(method => {
container[method] = () => {};
});
// Prevent wheel/touch events
container.addEventListener('wheel', e => e.stopPropagation(), true);
container.addEventListener('touchmove', e => e.stopPropagation(), true);
container.__scrollBlocked = true;
};
const findScrollContainer = () => {
return SCROLL_SELECTORS.reduce((found, selector) => {
return found || document.querySelector(selector);
}, null);
};
const initScrollBlock = () => {
const newContainer = findScrollContainer();
if(newContainer && newContainer !== activeContainer) {
activeContainer = newContainer;
blockScroll(newContainer);
}
};
// Run every 500ms + on mutations
setInterval(initScrollBlock, 500);
new MutationObserver(initScrollBlock).observe(document.body, {
childList: true,
subtree: true,
attributes: true
});
})();