我在页面脚本中定义的对象似乎无法在扩展的内容脚本中访问。但是这两个脚本确实共享一些变量,例如窗口,文档等。有没有一种方法可以将一个世界中的某些对象暴露在另一个世界中使用?
我在页面脚本中设置了一个变量,如“window.myvar=123”,但我无法像内容脚本中的“alert(window.myvar)”一样访问它(未定义)。但是窗口对象的其他组件在两个世界中是相同的。
DOM/
window
中的元素和属性由浏览器明确按照规范实现,例如document.body
、elem.dataset.foo
、window.scrollY
除了 JS 代码添加的“expando 属性”,如
elem.foo = 1
或 window.foo = 1
setTimeout、setInterval、requestAnimationFrame 的 Id - 请注意,这意味着页面可以轻松清除它们
在 Chrome 中,您需要 注入 MAIN world 来访问页面脚本添加的 JS 工件,然后您可以通过
CustomEvent
交换通用结构化可克隆数据或 MouseEvent
交换 DOM 节点数据,example。注意,它可以被其他扩展或页面拦截,防止它很复杂,请参阅Violentmonkey的源代码。
在 Firefox 中您可以直接使用 wrappedJSObject。