// ==UserScript==
// @name 小说网站通用快捷翻页
// @namespace http://tampermonkey.net/
// @version 1.8
// @description 键盘左右键或A/D键模拟点击页面中【上一页|上一章】【下一页|下一章】按钮,双击只点击【上一章】【下一章】按钮;按下键盘上下键或W/S键进行页面内平滑滚动;按下G键加入书签;自动刷新未加载的网页。主要适配偶然中文网及其套娃网站,其他类似布局网站也通用。
// @author coccvo
// @include *
// @match https://www.or77.net/*
// @match https://www.69shuba.pro/*
// @match https://69shuba.cx/*
// @match https://tieba.baidu.com/*
// @icon data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAB60lEQVR42m2SyUtbURTGT0tXbbF/QaGULoJd2C66kLYKom4UBQVnECcQMbpwEUWCA4a4CahIIk5RUYTgTkF04YSKIA44PVDEIULACVEDMUafv/AeiYqPj8c99/6+c88994r61ldamIveXJJXsff2tiAzedcliAEhky6XKz0qvjSviPCF4fL8ND8tBlTdFLTf8oGwq9ue/z56TxqWpApP2HB47M5KiDzrE3XqnXfW6p2zMsDTnGECxYBSDLG6QVGUnJhvXocA+Vad2iSD4YHG5ZWtg9gePOxDbcLCwuJCWfRn1SYPI1/8+2OhPVcqymc6HRd3j3jYx2g0Mink1mjfsOHueOM5Pf9Drso/4uEYDGoiPwEL7dPoh6uTIBhwq6eO3apiaHea8B9KSqSEI7sBD7BQujNb6hoa9cz3E3DLX1/Q9MNUXQ0GLNTXZLGEDOSGVv7I+k/p/y0cGgPth0HAAkSMIUSDarStRJYmHL7AI0sAYPpNezwe4pvtaWgtvd0g0FwCTQsZwMIGU62ZQyupf8nd+l0oN3gnvYKBtsIAhA1ch7O2kncxOdhmzf43WyGqTRfbuq9VPH1NZjDdwCNbs/xCO+3//WNxJA5rNM4/XoACHVFguoHu1idHoLrMoMxFEeYyxECf0Va1B/8EoujxAC7mNZQAAAAASUVORK5CYII=
// @grant none
// @license MIT
// @downloadURL none
// ==/UserScript==
(function() {
'use strict';
// 自动点击刷新
function checkAndReload() {
var refreshDiv = document.querySelector('div[style="font-size:26px; color:#00F; cursor:hand; text-align:center;"][onclick="location.reload();"]');
if (refreshDiv) {
console.log("Refresh div found. Reloading the page...");
location.reload();
} else {
console.log("Refresh div not found.");
}
}
window.addEventListener('load', checkAndReload);
document.addEventListener('visibilitychange', function() {
if (document.visibilityState === 'visible') {
checkAndReload();
}
});
const SCROLL_FRACTION_B = 0.9;// 滚动距离比例 (视口高度的90%)
const SMOOTH_SCROLL_DURATION_ESTIMATE_B = 700; // 平滑滚动估计时间 (毫秒)
let restartAutoScrollTimer_B; // 用于恢复自动滚屏脚本的计时器ID
// --- 检查事件目标是否是输入框 ---
function isTargetInInput_B(event) {
const target = event.target;
return target.tagName === 'INPUT' ||
target.tagName === 'TEXTAREA' ||
target.tagName === 'SELECT' ||
target.isContentEditable;
}
// --- 按键按下处理 ---
document.addEventListener('keydown', function(e) {
const keysToHandle = ['ArrowUp', 'ArrowDown', 'w', 's']; // 处理这些键
// 检查按键和是否在输入框内
if (keysToHandle.includes(e.key) && !isTargetInInput_B(e)) {
e.stopImmediatePropagation(); // 阻止事件传播给自动滚屏脚本的监听器
// 查询自动滚屏脚本的当前状态
let wasScriptARunning = false;
if (typeof window.getAutoScrollState === 'function') {
wasScriptARunning = window.getAutoScrollState();
}
// 如果自动滚屏脚本正在运行, 则暂停它
if (wasScriptARunning && typeof window.turnOffAutoScroll === 'function') {
clearTimeout(restartAutoScrollTimer_B); // 清除可能存在的旧计时器
window.turnOffAutoScroll();
// console.log("暂停了自动滚屏脚本的滚动"); // 可选日志
}
// 计算滚动距离
let distance = (e.key === 'ArrowDown' || e.key === 's')
? window.innerHeight * SCROLL_FRACTION_B
: -window.innerHeight * SCROLL_FRACTION_B;
// 执行平滑滚动
if ('scrollBehavior' in document.documentElement.style) {
window.scrollBy({ top: distance, left: 0, behavior: 'smooth' });
} else {
window.scrollBy(0, distance);
}
e.preventDefault();
// 如果自动滚屏脚本之前在运行, 则设置计时器在其估计滚动时间后恢复它
if (wasScriptARunning && typeof window.startAutoScroll === 'function') {
restartAutoScrollTimer_B = setTimeout(() => {
window.startAutoScroll();
}, SMOOTH_SCROLL_DURATION_ESTIMATE_B);
}
}
}, true); // 在捕获阶段监听
// 函数:检查事件目标是否在输入框内部
function isTargetInInput(event) {
const tagName = event.target.tagName.toLowerCase();
return tagName === 'input' || tagName === 'textarea';
}
// 模拟点击函数
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 simulateBookmarkClick() {
// 查找具有特定文本内容的元素
const bookmarkButton = document.querySelector('span[onclick*="AddShuQian"]');
if (bookmarkButton) {
console.log('Bookmark button found:', bookmarkButton);
bookmarkButton.click();
} else {
console.log('Bookmark button not found.');
}
}
// 双击检测变量
let clickTimer = null;
// 监听键盘事件
document.addEventListener('keydown', function(e) {
// 判断触发事件的元素是否为输入框,如果是则直接返回
if (e.target.tagName === 'INPUT' || e.target.tagName === 'TEXTAREA') {
return;
}
// 左键或 'a' 键(上一页|上一章)
if (e.key === 'ArrowLeft' || e.key === 'a') {
if (clickTimer == null) {
clickTimer = setTimeout(function() {
if (hasLastPageButton()) {
// 如果存在上一页按钮,则点击
simulateClickByText('上一页');
simulateClickByText('<上一页');
} else {
// 如果不存在上一页按钮,则点击上一章
simulateClickByText('上一章');
}
clickTimer = null; // 重置定时器
}, 500); // 500毫秒内无第二次点击则执行单击操作
} else {
// 检测到双击,取消定时器,执行双击操作
clearTimeout(clickTimer);
clickTimer = null;
simulateClickByText('上一章');
}
}
// 右键或 'd' 键(下一页|下一章)
else if (e.key === 'ArrowRight' || e.key === 'd') {
if (clickTimer == null) {
clickTimer = setTimeout(function() {
if (hasNextPageButton()) {
simulateClickByText('下一页');
simulateClickByText('下一页>');
} else {
simulateClickByText('下一章');
}
clickTimer = null;
}, 500);
} else {
clearTimeout(clickTimer);
clickTimer = null;
simulateClickByText('下一章');
}
}
// 'g' 键(收藏书签)
else if (e.key === 'g') {
simulateBookmarkClick();
}
});
})();