打开调试工具时,我的扩展程序中出现以下警告/错误(以下所有代码都运行正常,但是它会抛出此错误):
未捕获的TypeError:无法读取未定义的属性'onUpdated'
在下面的代码中,我正在尝试获取浏览器的当前标签页。 (这是一个background.js脚本)
chrome.tabs.onUpdated.addListener(function(tabId,changeInfo,tab) {
chrome.tabs.getSelected(null,function(tab) {
var tablink = tab.url;
console.log("Website: " + tablink);
});
});
上面的这个脚本是我的后台脚本,从清单中调用。
"background": {
"scripts": ["background.js"]
},
现在我的问题是,为什么代码工作时会抛出错误?错误显示在chrome“debugging / inspect-element”中。如何从调试中删除这个所谓的“错误”?
修改 使用从内容脚本到后台脚本的“whoami”调用后,我在后台脚本上出现以下错误。
providing tab information background.js:3
Error in event handler for runtime.onMessage: Cannot read property 'url' of undefined
Stack trace: TypeError: Cannot read property 'url' of undefined
at chrome-extension://hejlnkjmnpomhknnbfjdfnablcmkloid/background.js:4:41
at Function.target.(anonymous function) (extensions::SafeBuiltins:19:14)
at EventImpl.dispatchToListener (extensions::event_bindings:397:22)
at Function.target.(anonymous function) (extensions::SafeBuiltins:19:14)
at Event.publicClass.(anonymous function) [as dispatchToListener] (extensions::utils:89:26)
at EventImpl.dispatch_ (extensions::event_bindings:379:35)
at EventImpl.dispatch (extensions::event_bindings:403:17)
at Function.target.(anonymous function) (extensions::SafeBuiltins:19:14)
at Event.publicClass.(anonymous function) [as dispatch] (extensions::utils:89:26)
at messageListener (extensions::messaging:190:29) extensions::uncaught_exception_handler:9
答案 0 :(得分:3)
您的清单文件中存在一些小缺陷。您在弹出窗口或选项页面中使用的脚本文件不应声明为内容脚本。将它们包含在各自的html文件中就足够了(你已经在做了),考虑到你不打算将它们注入其他外部网页。
弹出窗口和选项页面不是内容脚本。他们有权使用Chrome API,就像后台脚本一样。
将内容脚本注入其他网站。如果您真的有意义这样做,那么您很可能还应该包含“run_at”属性。再说一次,这取决于你想用它做什么。
"content_scripts": [{
"matches": ["http://*/*","https://*/*"],
"js": ["jquery.js","chat.js","options.js"],
"run_at": "document_end"
}]
但是,内容脚本没有访问选项卡API的权限。同时使用后台脚本作为内容脚本会导致这些类型错误并最终可能会破坏您的扩展,但它仍然可能看起来像您的扩展正在工作 - 至少在后台脚本(弹出窗口,选项)的范围内。
严格区分后台和内容脚本。 如果您不需要将代码注入其他网站,我建议您将其与权限一起删除 - 如果您要求read and modify user data on all web sites的许可,则在安装您的扩展程序时的权限警告会不必要
答案 1 :(得分:1)
我不直接知道为什么你的代码不起作用,但是:
首先,现在不推荐使用getSelected,请参阅文档https://developer.chrome.com/extensions/tabs#method-getSelected并使用tabs.query {active:true};)
第二,这里有一种“歧义”,当你编写“tab.url”时,使用“tab”变量是来自getSelected还是来自Updated事件? (如果它是最后一个,则getSelected是无用的)