当尝试使用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文件注入活动选项卡中。
答案 0 :(得分:0)
请参见documentation:urlMatches
是RE2 regular expression,而不是URL match pattern。
正确的RE2表达式应为'https?://(www\\.)?duolingo\\.com/skill/.*'
更好的方法是对主机名和路径进行纯字符串比较,因为它比使用正则表达式要快得多,并且文档明确建议仅在绝对不可避免的情况下使用正则表达式:
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}}。
使用文档中所示的different object,但请指定ShowContentAction而不是ShowPageAction,尽管文档中有警告,该内容实际上仍可在稳定的Chrome中运行。