所以我正在尝试谷歌Chrome扩展,理论上应该非常直接。我知道有大量的堆栈查询,我已经尝试了一些,我甚至复制并粘贴了直接的测试解决方案,但我没有成功。所以这是项目。加载页面时,请检查html内容,然后以编程方式更改图标。
这是我的content.js
chrome.tabs.onUpdated.addListener( function (tabId, changeInfo, tab) {
if (changeInfo.status == 'complete' && tab.active) {
var markup = document.documentElement.innerHTML;
var m = markup.indexOf("candy");
if (m > -1) {
chrome.browserAction.setIcon({path: "check.png"});
} else {
chrome.browserAction.setIcon({path: "cross.png"});
}
}
})
这是我的manifest.json
{
"manifest_version": 2,
"name": "Tag Analyzer Plugin",
"description": "Check if tag exist on page",
"version": "1.0",
"browser_action": {
"default_icon": "cross.png"
},
"content_scripts": [
{
"matches": [
"<all_urls>"
],
"js": ["content.js"]
}
],
"permissions": ["<all_urls>"]
}
现在我将此项目作为内容脚本运行,因为作为内容脚本,我可以使用逻辑
var markup = document.documentElement.innerHTML;
var m = markup.indexOf("candy");
if (m > -1) {} else {}
然而,作为内容脚本,chrome API的东西不起作用。当我将此脚本作为后台脚本运行时,脚本可以正常工作,除了
var markup = document.documentElement.innerHTML;
不返回页面html,它返回注入的脚本html。
我已经阅读了这篇stack,其中提供了有关差异的信息,并且我已经阅读并测试了许多堆栈,例如here,但没有取得多大成功。所以显然我错过了什么,做错了什么。感谢先进的任何帮助。
更新
所以我做了一些修改,但它仍然没有用,虽然我认为它更接近于工作。
根据下面的评论,我现在使用内容脚本和后台脚本。没有错误被抛出,但后台脚本没有任何错误。
content.js
var markup = document.documentElement.innerHTML;
var m = markup.indexOf("candy");
if (m > -1) {
chrome.runtime.sendMessage({"found" : true});
} else {
chrome.runtime.sendMessage({"found": false});
}
background.js
chrome.runtime.onMessage.addListener(
function(request, sender, sendResponse) {
if request.found {
alert("HERE");
chrome.browserAction.setIcon({
path: "check.png",
tabId: sender.tab.id
});
} else {
alert("HERE2");
chrome.browserAction.setIcon({
path: "cross.png",
tabId: sender.tab.id
});
}
});
的manifest.json
{
"manifest_version": 2,
"name": "Tag Analyzer Plugin",
"description": "find tag on page",
"version": "1.0",
"browser_action": {
"default_icon": "cross.png"
},
"background": {
"scripts": ["background.js"],
"persistent": false
},
"content_scripts": [
{
"matches": [
"<all_urls>"
],
"js": ["content.js"]
}
],
"permissions": ["<all_urls>"]
}
我在background.js上添加了一些警报,看它是否是触发器,没有任何内容,图标也没有变化。