Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 我应该在发送消息时使用location.href或chrome.tabs.query来获取选项卡URL吗?_Javascript_Google Chrome_Google Chrome Extension - Fatal编程技术网

Javascript 我应该在发送消息时使用location.href或chrome.tabs.query来获取选项卡URL吗?

Javascript 我应该在发送消息时使用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" } ],

我正在编写一个Chrome扩展,它可以识别特定的URL模式并执行进一步的DOM操作。内容脚本必须获取当前URL并与预定义的URL模式列表相匹配

我可以通过两种方式来实现目标: 第一个是使用location.href

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"
  }
],
...
这种方法效果很好。然而,在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

    • 使用
      RequestContentScript
      操作是高级过滤的一个示例,它基于URL检查和DOM内容(仅如文档中所述的简单选择器)注入内容脚本
    • 在内部或侦听器中,仅在需要时注入内容脚本
  • 更改工具栏图标或浏览器关联菜单以反映状态变化;内容脚本不能做到这一点,后台页面脚本可以做到

  • 像大多数chrome.*一样访问特权API,扩展的内部存储,如IndexedDB、WebSQL、HTML5文件系统、localStorage(后者不是一个好的选择,因为它不能直接在内容脚本中使用,而且它是同步的,因此会阻止执行)

  • 在上述所有情况下,如果在检查条件时使用了数据,或者数据仅在后台脚本中可用,则使用消息将数据传递给内容脚本是有意义的。否则,内容脚本内部的可读性同样好,甚至可能更好

    当满足所有这些条件时,“无背景”内容脚本更好:

  • 要处理的URL可以完全使用通配符/globs进行设置,或者它实际上必须是内容脚本中的
    ,换句话说,当不需要背景页面时
  • 至于内存消耗:这两种方法的优劣取决于它的使用方式。
    如果内容脚本被注入所有页面,那么每个实例都将消耗内存(有些人会打开100个选项卡,所以要小心!)。最坏的情况显然是在所有URL上同时使用持久性后台页面和内容脚本。非持久性事件页面可能会有所帮助,但作用有限,因为
    chrome.tabs.onUpdate
    可能会非常频繁地运行,从而强制重新加载事件页面(这也需要一些时间)