Javascript 有没有一种方法可以添加一个脚本,该脚本在任何元素添加到DOM之前运行,但依赖于body元素?

Javascript 有没有一种方法可以添加一个脚本,该脚本在任何元素添加到DOM之前运行,但依赖于body元素?,javascript,mutation-observers,Javascript,Mutation Observers,我正在尝试使用MutationObserver检查页面上的每个变异 是否有一种简单的方法可以修复以下问题,这样我就不必将其作为内联脚本包含在正文中(即,将其包含在中) 问题是,我需要bodyList变量才能开始监视添加到页面中的项目 显然,我不能使用onLoad事件或任何东西,因为到那时突变已经全部发生了(除非在我不知道的情况下有办法访问它们?) 或者有没有一种方法可以将突变观察者附加到文档本身而不是元素 我相信答案很简单,但我找不到任何文档来说明这一点 <body> <scr

我正在尝试使用
MutationObserver
检查页面上的每个变异

是否有一种简单的方法可以修复以下问题,这样我就不必将其作为内联脚本包含在正文中(即,将其包含在
中)

问题是,我需要
bodyList
变量才能开始监视添加到页面中的项目

显然,我不能使用onLoad事件或任何东西,因为到那时突变已经全部发生了(除非在我不知道的情况下有办法访问它们?)

或者有没有一种方法可以将突变观察者附加到文档本身而不是元素

我相信答案很简单,但我找不到任何文档来说明这一点

<body>
<script>
//I want to move this inline script into the <head>
var bodyList = document.querySelector("body"),
            observer = new MutationObserver(function (mutations) {
                mutations.forEach(function (mutation) {
                   console.log("MUTATION", mutation)
                });
            });
    observer.observe(bodyList, {childList: true, subtree: true});
</script>
....all the HTML elements that I want to monitor

//我想将此内联脚本移动到
var bodyList=document.querySelector(“body”),
观察者=新的突变观察者(功能(突变){
突变。forEach(功能(突变){
log(“突变”,突变)
});
});
observer.observe(bodyList,{childList:true,subtree:true});
..我要监视的所有HTML元素

您可以将观察者附加到HTML文档本身,等待
出现,然后将观察者附加到正文:

// In the <head>:
new MutationObserver((_, observer) => {
    const { body } = document;
    if (!body) return;
    // Remove this observer, since it's not needed anymore; body exists
    observer.disconnect();
    new MutationObserver(function (mutations) {
        mutations.forEach(function (mutation) {
            console.log("MUTATION", mutation)
        });
    })
        .observe(body, { childList: true, subtree: true });
})
    .observe(document.documentElement, { childList: true });
//在:
新的变异观察者((u,观察者)=>{
const{body}=文件;
如果(!body)返回;
//移除此观察者,因为不再需要它;身体存在
observer.disconnect();
新的突变观察者(功能(突变){
突变。forEach(功能(突变){
log(“突变”,突变)
});
})
.observe(body,{childList:true,subtree:true});
})
.observe(document.documentElement,{childList:true});

非常感谢,这是有道理的,我想如果没有内联脚本,就没有办法做到这一点?i、 e.如果我没有初始化
MutationObserver
,我就看不到以前的突变,我知道这似乎是一个愚蠢的问题,但对于
MutationObserver
,这是一个完全不可能的问题!如果这是您的意思,您可以将脚本链接到单独的文件中。如果你想完全不用
标记,你可以使用一个内联处理程序,它会立即出错并运行脚本,就像XSS攻击一样,但这真的很奇怪。不,我的意思是它必须在
之前出现并执行,以便捕获页面上的所有突变,如果我通过一个外部脚本添加它,这意味着我只会看到脚本加载并执行后发生的突变?即,没有生成的
窗口。突变
对象(类似于
窗口。性能
,您可以稍后调用它并仍然获得所有实体)。对不起,我不是很清楚。如果我将脚本链接到一个单独的文件中,那么我只会看到在下载、解析、编译和执行该文件之后发生的突变。假设加载该文件需要2秒钟,我将无法访问在此之前发生的突变?