如何通过Tampermonkey阻止指定module.js文件加载?
用Tampermonkey拦截指定script标签加载的JS文件
问题说明
需要阻止目标网站通过<script>标签引入的特定module.js文件加载,该标签代码如下:
<script charset="utf-8" id="yui_3_17_2_1_1672056888038_9" src="https://exam.lood.so/lib/javascript.php/1671548766/mod/quiz/module.js" async=""></script>
现有脚本仅能拦截XHR/fetch请求,无法处理这类直接通过script标签发起的资源请求,且不想每次手动用DevTools拦截。
实现脚本
Tampermonkey要拦截这类请求,需在DOM加载前拦截script标签的创建与属性设置,具体脚本如下:
// ==UserScript== // @name 拦截指定module.js加载 // @namespace http://tampermonkey.net/ // @version 0.1 // @description 阻止exam.lood.so的指定module.js加载 // @author You // @match https://exam.lood.so/* // @run-at document-start // @grant none // ==/UserScript== (function() { 'use strict'; // 要拦截的目标URL const targetUrl = "https://exam.lood.so/lib/javascript.php/1671548766/mod/quiz/module.js"; // 重写document.createElement方法,拦截script标签创建 const originalCreateElement = document.createElement; document.createElement = function(tagName) { const element = originalCreateElement.call(this, tagName); if (tagName.toLowerCase() === 'script') { // 拦截setAttribute设置src的情况 const originalSetAttribute = element.setAttribute; element.setAttribute = function(name, value) { if (name.toLowerCase() === 'src' && value === targetUrl) { console.log('已拦截目标脚本加载:', targetUrl); return; // 不设置src,阻止加载 } originalSetAttribute.call(this, name, value); }; // 拦截直接赋值src属性的情况 Object.defineProperty(element, 'src', { set: function(value) { if (value === targetUrl) { console.log('已拦截目标脚本加载:', targetUrl); return; } originalSetAttribute.call(this, 'src', value); }, get: function() { return this.getAttribute('src'); } }); } return element; }; // 清理DOM加载完成后可能已存在的目标脚本 document.addEventListener('DOMContentLoaded', function() { const scripts = document.querySelectorAll('script[src]'); scripts.forEach(script => { if (script.src === targetUrl) { script.remove(); console.log('已移除已加载的目标脚本'); } }); }); })();
关键说明
@run-at document-start:确保脚本在DOM开始构建前运行,能及时拦截脚本标签的创建过程- 双重拦截逻辑:同时处理通过
setAttribute和直接赋值src属性两种设置脚本地址的方式,避免被绕过 - DOMContentLoaded事件处理:清理可能在脚本运行前就已插入DOM的目标脚本
内容的提问来源于stack exchange,提问作者Lechko Faray
相关产品推荐
相关产品推荐

