如何删除head中所有script标签,即便其处于异步执行状态?
删除head中所有script标签(含异步执行中的)
普通自定义JS搞不定的核心原因是:这类脚本往往在你的代码运行前就已经开始加载甚至执行了。下面是几种可行的解决办法:
1. 开发者工具实时拦截删除
打开浏览器F12开发者工具:
- 暂停脚本执行再删除:先切到Sources面板,点击暂停按钮(⏸️),或者勾选「Pause on exceptions」,让页面脚本暂停运行。然后切到Elements面板,展开
<head>选中所有<script>标签删除,或者在控制台执行:
操作完再恢复脚本执行,就能阻止剩余代码运行。document.head.querySelectorAll('script').forEach(s => s.remove()) - 实时监听DOM变化:如果不想暂停,也可以在控制台提前执行监听脚本,一旦head里出现script就立刻删除:
new MutationObserver(muts => { muts.forEach(mut => { mut.addedNodes.forEach(n => { if(n.tagName === 'SCRIPT' && n.parentElement === document.head) n.remove() }) }) }).observe(document.head || document.documentElement, {childList: true})
2. 用浏览器扩展从根源拦截
直接在请求层面阻止script加载,比删除标签更彻底:
- 广告拦截扩展:比如uBlock Origin,添加自定义过滤规则:
这条规则会阻止该网站所有script资源的请求,自然不会有script标签插入head。*$script,domain=你的目标网站域名 - 油猴脚本提前监听:用Tampermonkey编写
run-at: document-start的脚本,在文档刚启动时就监听head的DOM变化,第一时间删除插入的script:
这个脚本的执行时机远早于页面自带的脚本,能覆盖所有异步插入的script。// ==UserScript== // @name 清除Head所有Script // @match *://目标网站域名/* // @run-at document-start // ==/UserScript== (() => { const observer = new MutationObserver(mutations => { mutations.forEach(m => { m.addedNodes.forEach(node => { if (node.tagName === 'SCRIPT' && node.parentElement === document.head) { node.remove(); } }); }); }); observer.observe(document.head || document.documentElement, { childList: true }); })();
3. 本地拦截(极端场景)
如果目标脚本来自第三方域名,可以修改本地hosts文件,将该第三方域名指向127.0.0.1,让浏览器无法下载脚本;或者用代理工具在请求阶段拦截script资源,返回空内容,阻止脚本执行。
内容的提问来源于stack exchange,提问作者Derek Wu
相关产品推荐
相关产品推荐

