使用“ chrome.webNavigation.onCompleted.addListener”时出现“未捕获的TypeError:无法添加侦听器”

时间:2019-03-28 17:51:31

标签: javascript google-chrome-extension

当尝试使用Chrome的WebNavigation.onCompleted在特定网址上运行background.js时,出现错误 “未捕获的TypeError:无法添加侦听器”。 为了获得manifest.json文件中的权限,我已为扩展程序授予了对activetab和webrequest的访问权限。

我尝试使用其他听众,例如         chrome.browserAction.onClicked.addListener 而且效果很好。我也在使用最新版本的chrome(v73)。

background.js:

 chrome.webNavigation.onCompleted.addListener(function(tab) {
    var eurl = tab.url.split("/skill/");
    if(eurl[0] === "https://www.duolingo.com") {
        chrome.tabs.executeScript(tab.ib, {
            file: 'jquery-3.3.1.min.js'
        });
        chrome.tabs.executeScript(tab.ib, {
            file: 'duohelperinjector.js'
        });}

}, {url: [{urlMatches : '*://duolingo.com/skill/*'}]});

manifest.json:

{
    "name": "DuoHelper",
    "version": "0.0.1",
    "manifest_version": 2,
    "description": "A Chrome Extension That Helps With Duolingo",
    "homepage_url": "https://github.com/TechHax/DuoHelper",
    "background": {
      "scripts": [
        "background.js"
      ],
      "persistent": true
    },
    "browser_action": {
      "default_title": "DuoHelper"
    },
    "permissions": [
      "webNavigation",
      "activeTab"
    ]
  }

我得到的错误:

  

未捕获的TypeError:无法添加侦听器

在扩展名正常运行的情况下,如果URL为*://duolingo.com/skill/*,我希望chrome扩展名将javascript文件注入活动选项卡中。

1 个答案:

答案 0 :(得分:0)

请参见documentationurlMatchesRE2 regular expression,而不是URL match pattern

解决方案1。

正确的RE2表达式应为'https?://(www\\.)?duolingo\\.com/skill/.*'

解决方案2。

更好的方法是对主机名和路径进行纯字符串比较,因为它比使用正则表达式要快得多,并且文档明确建议仅在绝对不可避免的情况下使用正则表达式:

chrome.webNavigation.onCompleted.addListener(info => {
  chrome.tabs.executeScript(info.tabId, {file: 'jquery-3.3.1.min.js'});
  chrome.tabs.executeScript(info.tabId, {file: 'duohelperinjector.js'});
}, {
  url: [{
    hostSuffix: '.duolingo.com',
    pathPrefix: '/skill/',
  }],
});

请注意hostSuffix如何利用API在第一个组件之前添加的隐式点来匹配duolingo.com的任何子域。另外,回调参数不是tab,而是内部带有tabId的{​​{3}}。

解决方案3。

使用文档中所示的different object,但请指定ShowContentAction而不是ShowPageAction,尽管文档中有警告,该内容实际上仍可在稳定的Chrome中运行。