Greasy Fork is available in English.

暴力阻止牛阅网的自动跳转首页(打开F12控制台时)

仅作为参考脚本,我技术有限,但搜不到相关插件就只能自己写了。采用离开页面(unload)之前弹窗提醒的方式阻止跳转。

// ==UserScript==
// @name         暴力阻止牛阅网的自动跳转首页(打开F12控制台时)
// @version      0.1.0
// @description  仅作为参考脚本,我技术有限,但搜不到相关插件就只能自己写了。采用离开页面(unload)之前弹窗提醒的方式阻止跳转。
// @author       SineObama
// @match        https://www.niuyueshu.com/*
// @run-at       document-start
// @license      MIT
// @namespace https://greasyfork.org/users/1238190
// ==/UserScript==

'use strict';

// 全局上下文
var ctx = {
    // 是否启用阻止跳转(状态)
    myBlockJump: true
};

doBlockJump();

function doBlockJump() {

    // 这种方式会同时阻止所有离开页面的操作,包括用户自己关闭网页的操作,所以后面做了一些优化。
    window.addEventListener('beforeunload', function (event) {
        if (ctx.myBlockJump) {
            console.log('prevent window unload', event);
            event.preventDefault();
        }
    });

    // 如果是用户点击操作,则允许页面跳转
    window.addEventListener('click', releaseJump, true);

    var reBlockNum;

    function releaseJump(e) {
        if (!ctx.myBlockJump) {
            return;
        }

        // 不管点击的是什么,实际可能有很多情况,
        // 通过暂时关闭阻止功能来允许页面跳转
        ctx.myBlockJump = false;
        clearTimeout(reBlockNum);
        reBlockNum = setTimeout(function () {
            ctx.myBlockJump = true;
        }, 500);
    }

    optMyBlock();
}

// 针对各种场景优化拦截方法
function optMyBlock() {
    // 允许在浏览器中关闭后台网页,避免弹窗
    document.addEventListener('visibilitychange', function () {
        if (document.visibilityState === 'hidden') {
            console.debug('用户离开了当前窗口');
            ctx.myBlockJump = false;
        } else if (document.visibilityState === 'visible') {
            console.debug('用户回到了当前窗口');
            ctx.myBlockJump = true;
        }
    });

    // 鼠标离开网页范围后,可能是准备点击网页页签的关闭按钮,也可能使用其他快捷键关闭,允许这种操作,
    // 但同时做个延迟,有可能是打开F12的瞬间鼠标离开了,此时仍然保持一下阻止跳转
    var mouseleaveUnblockNum;
    document.addEventListener('mouseleave', function () {
        clearTimeout(mouseleaveUnblockNum);
        mouseleaveUnblockNum = setTimeout(function () {
            console.debug('鼠标离开了当前窗口');
            ctx.myBlockJump = false;
        }, 200);
    });
    document.addEventListener('mouseover', function (event) {
        if (event.target === document.body.parentElement) {
            clearTimeout(mouseleaveUnblockNum);
            console.debug('鼠标回到了当前窗口');
            ctx.myBlockJump = true;
        }
    });

    // 在页面中按下Ctrl很可能是使用快捷键,可能想关闭网页,此时不阻止跳转
    document.addEventListener('keydown', function (event) {
        if (event.ctrlKey && ctx.myBlockJump) {
            console.debug("Ctrl键被按下!");
            ctx.myBlockJump = false;
        }
    });
    document.addEventListener('keyup', function (event) {
        if (!event.ctrlKey && !ctx.myBlockJump) {
            console.debug("Ctrl键松开!");
            ctx.myBlockJump = true;
        }
    });
}