我的清单如下:
{
"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.facebookcom/foo,内容脚本被加载并完成它的任务。
有更好的方法吗?
试试这个代码
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页面中
如果问题仍然存在,请共享您的清单、内容脚本和相关文件。
如果您的脚本执行得很快,您可以始终使用jQuery 的$.(your code here);
编辑:对于自动更新问题,您可以简单地在内容脚本中添加一个侦听器
document.addEventListener("DOMSubtreeModified", function(event){
//something on the page has changed
});