当前位置: 首页 > 知识库问答 >
问题:

javascript - chrome扩展的background.js 文件无法调用同文件中的函数?

文志学
2023-12-22

chrome扩展的background.js 文件无法调用同文件中的函数,我基于 manifest v3 创建了一个 chrome extension,具体代码如下

manifest.json

{  "manifest_version": 3,  "name": "achromeextension",  "version": "1.0",  "description": "",  "permissions": ["contextMenus", "activeTab", "scripting"],  "background": {    "service_worker": "background.js"  },  "icons": {    "48": "icon.png"  }}

background.js 的代码如下

chrome.runtime.onInstalled.addListener(() => {  chrome.contextMenus.create({    id: "chromeextensiondemo",    title: "chromeextensiondemo",    contexts: ["selection"]  });});chrome.contextMenus.onClicked.addListener((info, tab) => {  if (info.menuItemId === "chromeextensiondemo") {    chrome.scripting.executeScript({      target: { tabId: tab.id },      function: callmenow,      args: [info.selectionText]    });  }});function showcontentpop(input) {  return output;}function callmenow(selectedText) {  const resultText = showcontentpop(selectedText);  alert(resultText);}

但现在遇到的问题是,提示错误,错误信息是 showcontentpop is not defined.

请问这个该怎么处理?

能正常调用函数 showcontentpop

共有2个答案

张高澹
2023-12-22

这是 chrome 扩展开发中一定要理解的一个问题:浏览器扩展里存在多个互相隔离的上下文环境。。大约包含:

  1. background script
  2. content script
  3. 目标页面
  4. popup/side panel 页面

所以你在 background 环境里声明的函数,自然在目标页面里无法使用。

解决方案有两个,我建议你使用 content script,把你需要的函数注入到 content 环境,然后用过 postMessage 调用。

谷奕
2023-12-22

在您的代码中,您试图在 chrome.scripting.executeScript 中调用 callmenow 函数,这个函数中又调用了 showcontentpop 函数。然而,由于 chrome.scripting.executeScript 是在扩展的上下文之外执行的,它无法访问到 background.js 文件中定义的 showcontentpop 函数。这就是为什么您看到 "showcontentpop is not defined" 的错误。

为了解决这个问题,您需要确保 showcontentpop 函数在 chrome.scripting.executeScript 可以访问的范围内。一种方法是,将 showcontentpop 函数定义在全局作用域中,这样它就可以被 chrome.scripting.executeScript 访问。

修改后的 background.js 代码如下:

chrome.runtime.onInstalled.addListener(() => {  chrome.contextMenus.create({    id: "chromeextensiondemo",    title: "chromeextensiondemo",    contexts: ["selection"]  });});chrome.contextMenus.onClicked.addListener((info, tab) => {  if (info.menuItemId === "chromeextensiondemo") {    chrome.scripting.executeScript({      target: { tabId: tab.id },      function: callmenow,      args: [info.selectionText]    });  }});window.showcontentpop = function(input) {  return output;}function callmenow(selectedText) {  const resultText = showcontentpop(selectedText);  alert(resultText);}

这样,showcontentpop 函数现在是在全局作用域中定义的,可以被 chrome.scripting.executeScript 访问。

 类似资料:
  • 我一直在开发一个应用程序,需要播放声音,并有大量的声音文件。wav格式,大小接近1GB。我已经按照官方文件制作了扩展文件。 首先我做了一个决定。压缩0次的压缩文件,全部。wav文件位于该文件下(没有任何子文件夹。即main.1.package包含所有声音文件)。然后我重新命名了。将文件夹压缩到。obb。然后我把它放在。共享存储obb文件夹下apps文件夹中的obb文件(com.moinul.app

  • 我正在尝试构建一个自动填充扩展,但我不知道如何在我的js FIE中使用用户输入。我试着用: 这在html脚本中(弹出用于扩展)。并且在autofill js文件中我写到: 但如果我在chrome控制台中键入第一个命令并刷新页面,则full_name_E值将出现在框中。我试过导入/导出,但它不起作用。有人帮忙吗?

  • 问题内容: 我想更改特定文件夹中文件的扩展名。我在论坛上阅读了有关此主题的信息。使用“确实”的想法,我编写了以下代码,我希望它可以工作,但不能。我很感谢您为我的失误提供任何指导。 问题答案: 在对源文件是不必要的,因为只需要在源和目标路径来完成这项工作。而且,始终返回,因此调用其返回值没有任何意义。 我简单地删除了两个。检查是否适合您。

  • 我在两个html文件的头部包含了相同的javascript文件: 和html页面1,然后链接到html页面2。但是,当您跟随指向page2的超链接时,加载page2时,javascript文件中的代码不会再次被调用。即使我试图在html文件2的头部或正文中添加一块代码来调用JS文件中的函数,它也不会执行。 我做错什么了吗? 编辑:这是代码http://jsfiddle.net/dL6gpveL/1

  • 问题内容: 我正在创建一个扩展程序,它将从网站上下载mp3文件。我正在尝试通过创建带有指向mp3文件的链接的新标签来实现此目的,但是chrome会继续在播放器中打开它而不是下载它。有什么方法可以创建一个弹出窗口,要求用户“另存为”文件? 问题答案: 快进了3年,现在GoogleChrome提供了API(自Chrome31起)。 在清单中声明许可后,可以通过以下调用启动下载: 如果要在脚本中生成文件

  • 我已按以下格式设置文件夹: AAPL_176546(空子文件夹)AAPL_2000(空子文件夹)AAPL_30234(空子文件夹)AAPL_176546.mp3AAPL_176546.txtAAPL_2000.mp3AAAPL_2000.txtAAPL_30234.mp3AAPL_30234.txt 我希望遍历文件夹并将相应的.txt和.mp3文件移动到子文件夹中(例如move AAPL_1765