// ==UserScript== // @name 安徽大学继续教育学习平台 - 解除标签限制 // @namespace http://tampermonkey.net/ // @version 2.0 // @description 解除安徽大学继续教育学习平台只能打开一个标签的限制 // @author You // @match https://ahuzj.cfyedu.com/* // @grant none // ==/UserScript== (function() { 'use strict'; // 1. 阻止页面关闭/离开事件(阻止 beforeunload 触发) window.addEventListener('beforeunload', function(e) { // 阻止默认行为,让页面可以正常关闭而不触发限制 // 不设置 returnValue 就不会弹出确认对话框 }, true); // 2. 覆盖 window.open 方法,允许在新标签页打开 const originalOpen = window.open; window.open = function(url, name, features) { // 强制在新窗口/标签页打开 return originalOpen.call(window, url, '_blank', features); }; // 3. 移除可能存在的 visibilitychange 事件监听(检测页面可见性) // 有些网站会检测页面是否可见来限制多标签 document.addEventListener('visibilitychange', function(e) { // 阻止默认行为 e.stopImmediatePropagation(); }, true); // 4. 移除所有已注册的 beforeunload 事件监听 // 通过替换 EventTarget 的 addEventListener 方法来过滤 const originalAddEventListener = EventTarget.prototype.addEventListener; EventTarget.prototype.addEventListener = function(type, listener, options) { // 过滤掉 beforeunload 事件(阻止网站注册自己的处理函数) if (type === 'beforeunload') { console.log('已阻止注册 beforeunload 事件:', listener); return; } // 过滤掉 visibilitychange 事件 if (type === 'visibilitychange') { console.log('已阻止注册 visibilitychange 事件:', listener); return; } // 其他事件正常注册 return originalAddEventListener.call(this, type, listener, options); }; // 5. 定期检查并移除动态添加的限制事件 setInterval(function() { // 移除所有 window 上的 beforeunload 监听器 // 由于我们无法直接获取所有监听器,这里通过替换处理函数来实现 window.onbeforeunload = null; // 移除 document 上的 visibilitychange 监听器 document.onvisibilitychange = null; }, 1000); // 每秒检查一次 console.log('✅ 已解除标签限制,现在可以同时打开多个标签页'); })();