document.scripts 是只读实时 HTMLCollection,直接包含页面所有 script 元素;可快速遍历、区分内外链、筛选 async/defer/module 脚本,但不包含 eval 动态代码、已移除节点、未解析完脚本及 Shadow DOM 中的 script。

document.scripts 是一个只读的 HTMLCollection,它实时包含页面中所有 <script> 元素(无论是否已执行、是否内联或外链),无需使用 querySelectorAll('script') 或遍历整个 DOM 树,因此是获取脚本节点最轻量、最直接的方式。
快速获取并遍历所有 script 节点
直接用 for 循环或展开语法即可遍历:
- 用传统
for循环(兼容性最好):
}
- 用
forEach需先转成数组(ES6+):
console.log(script.src || 'inline');
});
- 或用扩展运算符:
console.log(script.type, script.async, script.defer);
});
识别脚本类型:区分内联 vs 外链
通过 script.src 是否为空字符串或存在来判断:
-
script.src为非空字符串 → 外部脚本(如<script src="app.js"></script>) -
script.src为空字符串且script.textContent或script.innerHTML有内容 → 内联脚本 -
script.src为空且无文本内容 → 可能是仅声明type="module"或type="importmap"的占位脚本
常用筛选与调试场景
结合属性快速定位目标脚本:
立即学习“Java免费学习笔记(深入)”;
- 找所有异步加载的脚本:
script.async === true - 找所有延迟执行的脚本:
script.defer === true - 找模块脚本:
script.type === 'module' - 找未执行完的动态插入脚本(检查
script.readyState,仅部分浏览器支持) - 配合
script.dataset查找带自定义标记的脚本(如<script data-entry="main">)
注意点:实时性与限制
document.scripts 是实时集合,会自动响应 <script> 节点的增删,但有几点需留意:
- 不包含通过
eval()、new Function()或setTimeout("...")动态执行的代码 - 不包含被移除的
<script>元素(即使刚从 DOM 中remove()) - 在
<head>中未解析完成时调用,可能遗漏后续插入的脚本(建议在DOMContentLoaded后使用) - Shadow DOM 中的
<script>不会被包含(除非在 light DOM 中)


















