用户脚本如何将自身的DOM节点对象映射到页面上?

前端开发 2026-07-10

用户脚本通常在一个与其运行的页面分离的执行域中执行,且 表示用户脚本中的DOM节点对象与实际页面访问的对象并非同一对象。这一点在大多数情况下是好事:它防止页面对属性和原型所做的修改影响(并因此可能破坏)用户脚本。

但有时,用户脚本需要穿透这个沙箱,获取页面的DOM节点对象,因为用户脚本通常使用的对象缺少页面自行在其DOM节点对象上安装的一些额外属性。

<p id="node">Hello!</p>
<script>
  document.getElementById('node').test = 42;
</script>
// ==UserScript==
// […]
// ==/UserScript==

console.log(document.getElementById('node').test);              //= undefined
console.log(unsafeWindow.document.getElementById('node').test); //= 42

假设我在用户脚本的执行域中持有一个DOM节点对象。如何从页面的执行域获取相应的对象?

解决方案

正如我在其他评论中所说的,这在 greasemonkey/firemonkeytampermonkey/violentmonkey 的处理方式不同。

正确的方法是使用 wrappedJSObject(仅限Firefox):

let node = document.querySelector("#node");
node = node.wrappedJSObject ?? node;

你也可以给该节点再添加一个属性,然后用querySelector进行查询:

document.querySelector("#node").dataset.unsafe = true;
let node = unsafeWindow.document.querySelector("[data-unsafe]");
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章