Javascript 我应该在发送消息时使用location.href或chrome.tabs.query来获取选项卡URL吗?
我正在编写一个Chrome扩展,它可以识别特定的URL模式并执行进一步的DOM操作。内容脚本必须获取当前URL并与预定义的URL模式列表相匹配 我可以通过两种方式来实现目标: 第一个是使用location.href manifest.jsonJavascript 我应该在发送消息时使用location.href或chrome.tabs.query来获取选项卡URL吗?,javascript,google-chrome,google-chrome-extension,Javascript,Google Chrome,Google Chrome Extension,我正在编写一个Chrome扩展,它可以识别特定的URL模式并执行进一步的DOM操作。内容脚本必须获取当前URL并与预定义的URL模式列表相匹配 我可以通过两种方式来实现目标: 第一个是使用location.href manifest.json ... "content_scripts": [ { "matches": ["<all_urls>"], "js": ["content.js"], "run_at": "document_end" } ],
...
"content_scripts": [
{
"matches": ["<all_urls>"],
"js": ["content.js"],
"run_at": "document_end"
}
],
...
...
"background" : {
"scripts": ["background.js"]
},
"content_scripts": [
{
"matches": ["<all_urls>"],
"js": ["content.js"],
"run_at": "document_end"
}
],
...
这种方法效果很好。然而,在StackOverflow的其他类似问题中,他们通常建议使用chrome.tabs和从后台脚本向内容脚本发送消息,如下所示:
manifest.json
...
"content_scripts": [
{
"matches": ["<all_urls>"],
"js": ["content.js"],
"run_at": "document_end"
}
],
...
...
"background" : {
"scripts": ["background.js"]
},
"content_scripts": [
{
"matches": ["<all_urls>"],
"js": ["content.js"],
"run_at": "document_end"
}
],
...
content.js
console.log(location.href);
chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) {
if (request.url) {
console.log(request.url)
sendResponse(true);
}
return true;
});
这两种方法都可以正确使用URL。对于后台脚本,与仅在加载页面时注入的内容脚本相比,它需要额外的内存来保持后台脚本在后台运行
另一方面,使用后台脚本有好处,因为后台脚本被称为特权脚本,它可以执行特权chromeapi,比如Chrome.tabs API
因此,就我没有使用任何特权API而言,我应该使用location.href还是大多数开发人员建议使用chrome.tabs和消息发送有什么特别的原因?后台页面脚本的优点:
“选项卡”
访问url
,标题
,favIconUrl
),而基于manifest.json的注入仅限于url
- 使用
操作是高级过滤的一个示例,它基于URL检查和DOM内容(仅如文档中所述的简单选择器)注入内容脚本李>RequestContentScript
- 在内部或侦听器中,仅在需要时注入内容脚本
,换句话说,当不需要背景页面时
如果内容脚本被注入所有页面,那么每个实例都将消耗内存(有些人会打开100个选项卡,所以要小心!)。最坏的情况显然是在所有URL上同时使用持久性后台页面和内容脚本。非持久性事件页面可能会有所帮助,但作用有限,因为
chrome.tabs.onUpdate
可能会非常频繁地运行,从而强制重新加载事件页面(这也需要一些时间)