事件处理程序中的错误:ReferenceError: window未定义,使用Manifest V3的Chrome扩展程序。

9

我正在使用 Chrome 扩展程序的清单版本 3,在 background.js 中遇到以下错误:

事件处理程序中的错误:引用错误:window 未定义,chrome extension with manifest v3

清单中的参数如下:

"manifest_version": 3, "permissions": ["contextMenus", "storage", "activeTab", "tabs", "scripting", "webRequest"],

var posLeft = ( window.width - winWidth ) / 2;


1
ManifestV3扩展使用service worker,因此没有DOM或window。为什么您需要在后台脚本中使用window.width? - wOxxOm
1
@wOxxOm 我想要设置chrome.windows.create在浏览器屏幕中心打开,所以我首先想要获取窗口宽度,然后减去chrome.windows的宽度。 - Mitul Sabhaya
3个回答

8

我想通过名称在后台获取全局函数,但不使用window对象,可以使用window["funcname"]"] - Dee

3
对于其他可能在类似情境下查找此错误信息的人来说,当我忽略在运行时而不是在v3后台脚本准备将注入函数动态注入到特定标签页时使window对象可访问时,我遇到了相同的错误。
为了从v3后台脚本动态注入,需要在传递的函数中包含特定标签页对象(在本例中为window),如以下匿名函数所示:
chrome.scripting.executeScript({
    target: { tabId: currentTab.id },
    func: () => window.history.back()
  }); 

如果将window.history.back作为func的值提供,那么显然它将不会被后台脚本所知道或可用,并且将出现相同的错误消息。这在文档中已经描述过了。

3
就此而言,这段代码在ManifestV3服务工作者中可以正常运行,因为该函数从未在服务工作者的上下文中运行,它被序列化为字符串,并注入到选项卡中。 - wOxxOm

3
如果你正在尝试在 background.js 中访问 window 对象,由于它是一个服务工作者,你将无法访问 window 对象。但你可以尝试使用 self ,它将拥有 window 对象的所有属性。
console.log(self,"self")
var window = window ?? self;

注意: 如果您正在使用 Vite 或 Webpack,这可能有效。 enter image description here

不,我认为这不是窗口对象,而是self=this=chrome服务工作者。 - Frank Guo
是的,你说得对。 - Goutham J.M

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接