20

我正在编写我的第一个 Google 扩展代码,但遇到了我一生中从未见过的奇怪错误。

Uncaught TypeError: Cannot read property 'onCompleted' of undefined background.js:4
(anonymous function)

顺便说一句,我对 Javascript 很陌生(尽管对 Java 有广泛的了解)。

我的代码如下所示:

chrome.webNavigation.onCompleted.addListener(function(){//error right here
if(hasHostSuffix(document.URL,'mysite.com'))
{
    console.log("Web navigation commited!");
    var links = document.getElementsByName("a");
    for(var i = 0; i < links.length; i++)
    {
        console.log(links[i].getAttribute("href"));
        if(links[i].style.backgroundColor='#272727')
        {
            links[i].className="gone";
        }
    }
}
});

我无法找到有关我收到此错误的任何可靠信息。

任何帮助将不胜感激:)

编辑:

引起我注意的是我忘记了一些重要信息 xD 我的男人:

{
"manifest_version": 2,
...,
"permissions": [
    "webNavigation"
],
...,
"content_scripts":[
    {
        "matches":["http://www.mysite.com/*"],
        "css":["ur_customstyle.css"],
        "js":["background.js"]
    }
]
}
4

3 回答 3

27

在@rsanchez 回答之上,如果您chrome.webNavigation在扩展程序的后台脚本中调用 a ,但仍然出现此错误,您可能还需要webNavigation在您的manifest.json.

"permissions": [
    "webNavigation"
  ]

Mozilla 文档| Chrome 文档

于 2018-04-03T15:39:45.580 回答
17

chrome.webNavigation,与大多数 chrome.* API 一样,只能从扩展程序的后台脚本访问,而不能从内容脚本访问。尽管您的文件名为background.js,但您的清单显示您正在将其用作内容脚本。

在这种情况下使用内容脚本是正确的,因为您需要与 DOM 交互。从您发布的代码片段来看,您似乎不需要使用 webNavigation API。您只需将清单中的内容脚本设置为run_at: document_end,它就会在 DOM 完成后立即运行。检查http://developer.chrome.com/extensions/content_scripts.html

于 2013-05-01T16:12:51.330 回答
0

您需要确保在您manifest.json的扩展程序中注册了persistent: false

"background": {
    "scripts": [
        "./scripts/saving/extension/background.js"
    ],
    "persistent": false // <---- HERE!!!!!
}

根据这里所说的:https ://developer.chrome.com/extensions/background_pages

保持后台脚本持续活动的唯一情况是扩展程序使用 chrome.webRequest API 来阻止或修改网络请求。webRequest API 与非持久性后台页面不兼容。

!!!并且 !!!

(如果是的话persistent: true

您需要卸载扩展并再次加载

更新:

原来这一切都无关紧要

在 Chrome 72 中发生的情况是扩展需要始终卸载并重新加载

简单的刷新/重新加载会引发这个问题

于 2019-03-11T04:26:14.383 回答