Javascript Chrome扩展如何将我的内容脚本注入所有Facebook页面

Javascript Chrome扩展如何将我的内容脚本注入所有Facebook页面,javascript,google-chrome-extension,Javascript,Google Chrome Extension,我的清单如下所示: { "manifest_version": 2, "name": "Facebook Extension", "version": "1.0", "browser_action": { "default_icon": "images/fbh.png", "default_popup": "fbh-popup.html" }, "permissions": [ "storage", "background",

我的清单如下所示:

{
  "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,内容脚本就会被加载并完成它的工作


有更好的方法吗?

如果您的脚本很快就会执行,您可以始终使用
$(此处的代码)

编辑:对于自动升级问题,您只需在内容脚本中添加一个侦听器即可

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

如果您的脚本即将执行,您可以始终使用
$(此处是您的代码)

编辑:对于自动升级问题,您只需在内容脚本中添加一个侦听器即可

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

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/“”
    以确保脚本被注入到封面书籍页面中
如果问题仍然存在,请共享您的清单、内容脚本和相关文件

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/“”
    以确保脚本被注入到封面书籍页面中

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

我不是Chrome Extensions专家,但为代码设置硬编码超时不是一种糟糕的做法吗?您不应该听事件吗?Thx,您是对的,已经晚了:p我认为这里的解决方案更好。我不是Chrome Extensions专家,但是为代码设置硬编码超时不是一种糟糕的做法吗?难道你不应该改为收听事件吗?Thx,你是对的,已经晚了:p我认为这里的解决方案更好。有什么帮助吗?有什么帮助吗?