小说网站通用快捷翻页

键盘左右键或A/D键模拟点击页面中【上一页|上一章】【下一页|下一章】按钮,双击只点击【上一章】【下一章】按钮;按下键盘上下键或W/S键进行页面内平滑滚动;按下G键加入书签;自动刷新未加载的网页。主要适配偶然中文网及其套娃网站,其他类似布局网站也通用。

目前為 2025-04-05 提交的版本,檢視 最新版本

// ==UserScript==
// @name         小说网站通用快捷翻页
// @namespace    http://tampermonkey.net/
// @version      1.7
// @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
// ==/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_A_RAF === 'function') {
                wasScriptARunning = window.getAutoScrollState_A_RAF();
            }

            // 如果自动滚屏脚本正在运行, 则暂停它
            if (wasScriptARunning && typeof window.turnOffAutoScroll_A_RAF === 'function') {
                clearTimeout(restartAutoScrollTimer_B); // 清除可能存在的旧计时器
                window.turnOffAutoScroll_A_RAF();
                // 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_A_RAF === 'function') {
                restartAutoScrollTimer_B = setTimeout(() => {
                    window.startAutoScroll_A_RAF();
                }, SMOOTH_SCROLL_DURATION_ESTIMATE_B);
            }
        }
    }, true); // 在捕获阶段监听

    // 函数:检查事件目标是否在输入框内部
    function isTargetInInput(event) {
    const tagName = event.target.tagName.toLowerCase();
    return tagName === 'input' || tagName === 'textarea';
    }

    // 模拟点击函数
    function simulateClickByText(textContent) {
        // 查找所有<a>标签
        const links = document.querySelectorAll('a');
        // 遍历每个<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() {
        // 查找具有特定文本内容的<span>元素
        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();
        }
    }); 
})();