// ==UserScript== // @name 平滑滚动翻页 // @namespace http://tampermonkey.net/ // @version 1.6 // @description 使用w和s键进行平滑滚动翻页。键盘左右键或A/D键模拟点击页面中【上一页|上一章】【下一页|下一章】按钮,双击只点击【上一章】【下一章】按 // @author coccvo // @include * // @exclude https://www.bilibili.com/* // @grant none // @icon data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAVdJREFUWEftlj1Ow0AQhd9YWKKmy3b8FPSpiKUojXMaKOAg0HAZCEUktB0HoMDu4twBkwxaLEvG7C7GzMoowvV437dvfnYIA3/k00+TgiX4Flo5df4BfuVABEx5yxuOSPtSFSQFRvxOq0cjPD9bTXwQ4gBN8frmPghRAJv4dxCCAPRCtH325Zs5OgX4pBkjCNBvKuwmAAMZgFvjSQQ6Z/Cxyx9xB8p4FC+X9NYUnM14Ly7XpQ1CFMAmXou6IMQACJTd69GnCm/fOE3WGcBHQbqAgasHrW58vTBPiksGrncTAEC+0MpZ7ebWaVLkAA6DOGAO9RXhePwUH+yr13aKxIqwPtgG4RI3/4gDVCCUE/hjEDFw0bY9WAr6vAaBHOiOIgjwB55j70IyXU1483U/FHSgst26kjnEg3XBoEtpXX6DruXdeyDYIOqOIF6E3aWryN4APxXqE/8OqY/0IehdmXQAAAAASUVORK5CYII= // @license MIT // @downloadURL none // ==/UserScript== (function() { 'use strict'; let initialized = false; let clickTimer = null; // 模拟点击函数 function simulateClickByText(textContent) { const links = document.querySelectorAll('a'); for (let i = 0; i < links.length; i++) { if (links[i].textContent.trim() === textContent) { links[i].click(); return true; } } return false; } // 检测页面按钮 function hasNextPageButton() { return simulateClickByText('下一页') || simulateClickByText('下一页>'); } function hasLastPageButton() { return simulateClickByText('上一页') || simulateClickByText('上一页>'); } function initialize() { if (initialized) return; initialized = true; let viewportHeight = window.innerHeight; let scrollDistance = viewportHeight * 0.9; // 监听按键事件 document.addEventListener('keydown', function(event) { // 检查事件是否发生在输入框内部 const tag = event.target.tagName.toLowerCase(); if (tag === 'input' || tag === 'textarea') return; switch(event.key.toLowerCase()) { case 'w': case 'arrowup': event.preventDefault(); window.scrollBy({ top: -scrollDistance, left: 0, behavior: 'smooth' }); break; case 's': case 'arrowdown': event.preventDefault(); window.scrollBy({ top: scrollDistance, left: 0, behavior: 'smooth' }); break; case 'arrowleft': case 'a': handlePageNavigation('prev'); break; case 'arrowright': case 'd': handlePageNavigation('next'); break; } }); } // 处理页面导航 function handlePageNavigation(direction) { if (clickTimer == null) { clickTimer = setTimeout(() => { const isPrev = direction === 'prev'; if (isPrev ? hasLastPageButton() : hasNextPageButton()) { if (isPrev) { simulateClickByText('上一页') || simulateClickByText('<上一页'); } else { simulateClickByText('下一页') || simulateClickByText('下一页>'); } } else { simulateClickByText(isPrev ? '上一章' : '下一章'); } clickTimer = null; }, 300); } else { clearTimeout(clickTimer); clickTimer = null; simulateClickByText(direction === 'prev' ? '上一章' : '下一章'); } } // 页面加载完毕后执行 window.addEventListener('load', function() { initialize(); }); // 窗口获取焦点时初始化(仅第一次) window.addEventListener('focus', function() { initialize(); }); })();