【问题标题】:Chrome extension how to inject my content script into all Facebook pagesChrome 扩展如何将我的内容脚本注入所有 Facebook 页面
【发布时间】:2013-02-01 13:19:33
【问题描述】:

我的清单如下所示:

{
  "manifest_version": 2,

  "name": "Facebook Extension",
  "version": "1.0",

  "browser_action": {
    "default_icon": "images/fbh.png",
    "default_popup": "fbh-popup.html"
  },

  "permissions": [
    "storage",
    "background",
    "tabs",
    "http://www.facebook.com/*",
    "https://www.facebook.com/*"
  ],

  "content_scripts": [
    {
      "matches": [
        "http://www.facebook.com/*", 
        "https://www.facebook.com/*"
      ],
      "js": ["js/jquery-1.9.1.min.js", "js/fbh-main.js"],
      "css": ["css/fbh-main.css"],
      "run_at": "document_end"
    }
  ],

  "background":{
    "persistent": true,
    "scripts": ["js/jquery-1.9.1.min.js","js/fbh-background.js"]
  }
}

我想在每次访问 Facebook 中的新页面时注入我的内容脚本。例如,如果我单击用户的个人资料,我想注入内容脚本。

在我的后台页面中,我有以下监听器:

chrome.tabs.onUpdated.addListener(function(tabId, changeInfo) {
    console.log(changeInfo);
    if (changeInfo.status === 'complete') {
        chrome.tabs.executeScript(null, {file: "js/fbh-main.js"});
    }
});

但是,这有几个问题。首先,此函数尝试将我的内容脚本注入所有页面。我需要能够读取清单权限。其次,如果我从 www.facebook.com 开始,内容脚本会做它应该做的事情。但是,如果从那里,我单击“foo”的配置文件并转到 www.facebook.com/foo,则内容脚本被注入(如 console.log 消息所证明的那样),但它没有做它应该做的事情.我认为它被注入得太早了,因为如果我直接导​​航到 www.facebook.com/foo,内容脚本就会被加载并执行它的操作。

有没有更好的方法来做到这一点?

【问题讨论】:

标签: javascript google-chrome-extension


【解决方案1】:

试试这个代码

chrome.tabs.onUpdated.addListener(function(tabId, changeInfo,tab) {
    console.log(changeInfo);
    if ((tab.url.indexOf("http://www.facebook.com/") !=-1 || tab.url.indexOf("https://www.facebook.com/") !=-1) && changeInfo.status === 'complete') {
        chrome.tabs.executeScript(tabId, {file: "js/fbh-main.js"});
    }
});
  • chrome.tabs.executeScript(null, 将在当前窗口的活动选项卡中执行脚本,这可能会随着用户交互而改变,chrome.tabs.executeScript(tabId 将始终确保在目标选项卡中注入脚本。
  • chrome.tabs.onUpdated.addListener 将为每个标签触发,添加了过滤器 tab.url.indexOf("https://www.facebook.com/") 以确保脚本被注入到 Facebook 页面中。

如果问题仍然存在,请分享您的清单、内容脚本和相关文件

【讨论】:

    【解决方案2】:

    如果你的脚本很快执行,你可以随时使用jQuery的$.(your code here);

    编辑:对于自动更新问题,您可以简单地在内容脚本中添加一个监听器

    document.addEventListener("DOMSubtreeModified", function(event){
        //something on the page has changed
    });
    

    【讨论】:

    • 我不是 Chrome 扩展专家,但是为您的代码设置硬编码超时不是一种不好的做法吗?你不应该听一个事件吗?
    • 谢谢,你是对的,已经很晚了:p 我认为这里的解决方案更好。
    猜你喜欢
    • 2022-11-07
    • 1970-01-01
    • 1970-01-01
    • 2014-11-03
    • 1970-01-01
    • 2011-12-11
    • 1970-01-01
    • 2012-06-17
    • 1970-01-01
    相关资源
    最近更新 更多