Chrome扩展程序getUrl无法在注入文件中运行

Bha*_*mar 15 javascript google-chrome-extension

我正在开发Chrome扩展程序,有没有办法chrome.extension.getURL('file path')从注入文件中获取方法?我无法从注入的文件访问上述方法.

的manifest.json

{
"name": "Name",
"version": "0.1",
"description": "Name chrome extension",
"background": {
"persistent": false,
"scripts": ["js/background.js"]
},
"permissions": [
"tabs", 
"https://*/*"
],
"content_scripts": [
{
  "matches": ["https://mail.google.com/*"],
  "js": ["js/content.js"],
  "run_at": "document_end"
}
],
"web_accessible_resources": [
"js/injected.js",
"html/popup.html"
],
"manifest_version": 2
}
Run Code Online (Sandbox Code Playgroud)

injected.js

console.log("Ok injected file worked");
console.log("Url: ", chrome.extension.getURL('html/popup.html'));
Run Code Online (Sandbox Code Playgroud)

contentScript.js

var s = document.createElement('script');
s.src = chrome.extension.getURL('js/injected.js');
(document.head || document.documentElement).appendChild(s);
Run Code Online (Sandbox Code Playgroud)

小智 20

chrome.extension.getURL现已弃用。文档

chrome.runtime.getURL在后台脚本中使用。

您需要将消息从您的发送contentScriptbackgroundScript

例如。

// contentScript.js

chrome.runtime.sendMessage({ message: "popup" }, function (response) {
  //
});
Run Code Online (Sandbox Code Playgroud)
// backgroundScript.js

chrome.runtime.onMessage.addListener((request, sender, sendResponse) => {
  if (request.message === "popup") {
    chrome.tabs.create({ url: chrome.runtime.getURL("popup.html") });
  }
});
Run Code Online (Sandbox Code Playgroud)

  • 这在 2022 年最接近正确。但是,您也可以在内容脚本中使用 chrome.runtime.getURL。 (5认同)

Sid*_*Sid 12

不,你不能,一旦你在页面中注入脚本,它就无法访问chrome.extension.getURl.但你可以在你injected script和你之间进行交流content script.其中一种方法是使用自定义事件.

mainfest.json:

{
"name": "Name",
"version": "0.1",
"description": "Name chrome extension",
"background": {
"persistent": false,
"scripts": ["js/background.js"]
},
"permissions": [
"tabs", 
"https://*/*"
],
"content_scripts": [
{
  "matches": ["https://mail.google.com/*"],
  "js": ["js/content.js"],
  "run_at": "document_end"
}
],
"web_accessible_resources": [
"js/injected.js",
"html/popup.html"
],
"manifest_version": 2
}
Run Code Online (Sandbox Code Playgroud)

在你的injected script:

console.log("Ok injected file worked");


document.addEventListener('yourCustomEvent', function (e)
{
    var url=e.detail;
    console.log("received "+url);
});
Run Code Online (Sandbox Code Playgroud)

在你的content script:

var s = document.createElement('script');
s.src = chrome.extension.getURL('js/injected.js');
(document.head || document.documentElement).appendChild(s);

s.onload = function(){

  var url=chrome.runtime.getURL("html/popup.html");

  var evt=document.createEvent("CustomEvent");
  evt.initCustomEvent("yourCustomEvent", true, true, url);
  document.dispatchEvent(evt);
};
Run Code Online (Sandbox Code Playgroud)


Mos*_*hua 8

getURL自 Chrome 58 起已弃用。

只需更换

s.src = chrome.extension.getURL('js/injected.js');
Run Code Online (Sandbox Code Playgroud)

s.src = chrome.runtime.getURL('js/injected.js');
Run Code Online (Sandbox Code Playgroud)


小智 5

您必须在扩展清单的web_accessible_resources中提及file_path或file_names。
EG:
"web_accessible_resources":[ "styles/*", "yourfilename.js" ]
之后,您可以通过调用方法将文件包含在注入的脚本中。 "chrome.extension.getURL('yourfilename.js')";

  • 我收到此错误“未捕获的TypeError:无法读取未定义的属性'getURL'” (2认同)