无法从 Chrome 扩展程序访问 javascript 函数

Can't access javascript function from Chrome extension

提问人:Felipe Obregón 提问时间:11/14/2023 更新时间:11/14/2023 访问量:25

问:

我正在尝试编写一个 Chrome 扩展程序,该扩展程序可以自动执行公司内部网站上的一些任务。网站使用 .aspx 文件。我正在尝试从我的扩展调用一个函数,但我收到此错误:__doPostBack()

test.js:7 未捕获的 ReferenceError:未定义__doPostBack

测试.js:

function clickLink() {
  __doPostBack('ctl00$Main$AssetSearchPanel$DialogContainers$GridContainers$ctl02$BtnName','')
}

clickLink()

manifest.json文件

{
  "manifest_version": 3,
  "name": "Containers v2",
  "description": "Base Level Extension",
  "version": "1.0",
  "content_scripts": [
    {
      "js": [
        "test.js"
      ],
      "matches": [
        "https://url.com"
      ]
    }
  ],
  "content_security_policy": {
    "extension_pages": "script-src 'self' 'wasm-unsafe-eval'; object-src 'self';"
  }
}

我尝试使用内联脚本来规避调用此函数,但由于 Chrome 安全策略,我无法做到。

我可以从页面的Chrome DevTools控制台调用该函数。

javascript 谷歌浏览器

评论

0赞 Dominic 11/14/2023
即使你的内容脚本在不同的上下文中运行,你也必须将脚本注入到DOM中(假设你的网站没有阻止它的CSP标头),它通过postMessage与你的内容脚本进行通信
0赞 AndrewL64 11/14/2023
从哪里调用函数?__doPostBack
0赞 Felipe Obregón 11/14/2023
我的内容脚本测试.js

答:

0赞 Storcale 11/14/2023 #1

我正在写这个关于JavaScript知识的答案,而在chrome扩展API或任何它的名字上可能不是这种情况。

大多数情况下,从其他文件调用函数时,必须在代码中导入或引用该文件。

export function __doPostBack() {
// Your code here

};

这是您将放入 script.js 中的代码,用于导出函数,并使其能够被其他文件访问。

import { __doPostBack } from './script.js';

这是您将放入 test.js 中的代码,用于将函数导入到文件中,并能够使用它

var test = new __doPostBack()

此外,您还可以将脚本.js 导入为库。 在这种情况下:

myLibrary.__doPostBack()

引用:从另一个 JavaScript 文件导入函数

注意:如果有人真正了解 Google chrome 扩展程序,请使用他们的答案。

希望这对你有帮助!

1赞 h-kod 11/14/2023 #2

要解决此问题,您可以尝试以下步骤:

  • 在文件中,通过确保此函数与文件中指定的 URL 匹配,确保正确调用该函数。目前,它似乎只与 匹配,因此请检查此 URL 是否与目标页面兼容。test.js__doPostBackmanifest.jsonhttps://url.com

  • 如果问题仍然存在,您可以更新文件中的文件部分,如下所示:content_scriptsmanifest.jsontest.js

    "content_scripts": [
      {
        "js": [
          "test.js"
        ],
        "matches": [
          "https://*.url.com/*"
        ]
      }
    ]
    

    这将与 下的所有页面匹配,包括子域。url.com

  • 由于 Chrome 的安全策略,您可以通过消息进行通信,而不是直接调用内部的函数。将以下代码添加到该文件中:test.js

    chrome.runtime.onMessage.addListener(
      function(request, sender, sendResponse) {
        if (request.action == "callDoPostBack") {
          __doPostBack(request.params);
        }
      }
    );
    

    然后,在注入内容的文件中,您可以这样调用它:

    chrome.runtime.sendMessage({action: "callDoPostBack", params: ['ctl00$Main$AssetSearchPanel$DialogContainers$GridContainers$ctl02$BtnName', '']});