Greasy Fork is available in English.
仅作为参考脚本,我技术有限,但搜不到相关插件就只能自己写了。采用离开页面(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; } }); }