我正在尝试编写一个简单的Chrome pageAction扩展来将页面上的所有锚点从一个域更改为另一个域...但我似乎无法让它工作,我在调试它时遇到问题
我是否误解了如何构建这种扩展?或者我只是在滥用API?
的manifest.json :
{
"name": "theirs2ours",
"version": "1.0",
"description": "Changes all 'their' URLs to 'our' URLs.",
"background_page": "background.html",
"permissions": [
"tabs"
],
"page_action": {
"default_icon": "cookie.png",
"default_title": "theirs2ours"
},
"content_scripts": [
{
"matches": ["http://*/*"],
"js": ["content.js"]
}
]
}
background.html :
<html>
<head>
<script type='text/javascript'>
chrome.tabs.onSelectionChanged.addListener(function(tabId) {
chrome.pageAction.show(tabId);
});
chrome.tabs.getSelected(null, function(tab) {
chrome.pageAction.show(tab.id);
});
chrome.pageAction.onClicked.addListener(function(tab) {
chrome.tabs.sendRequest(tab.id, {}, null);
});
</script>
</head>
<body>
</body>
</html>
content.js :
var transform = function() {
var theirs = 'http://www.yourdomain.com';
var ours = 'http://sf.ourdomain.com';
var anchors = document.getElementsByTagName('a');
for (var a in anchors) {
var link = anchors[a];
var href = link.href;
if (href.indexOf('/') == 0) link.href = ours + href;
else if (href.indexOf(theirs) == 0) link.href = href.replace(theirs, ours);
}
};
chrome.extension.onRequest.addListener(function(request, sender, sendResponse) {
transform();
});
答案 0 :(得分:3)
我认为这不是你想要的扩展方式。
首先,我假设您在单击页面操作按钮时要替换锚点。
您在每个页面上注入 content.js 的清单,无论您是否点击了页面操作按钮。
我建议您从清单中删除 content_scripts 字段,然后手动注入 content.js
chrome.tabs.executeScript(tabId, {file:'content.js'})
您应该在页面操作的点击监听器中执行此操作。
顺便说一下,在那个监听器中,您正在向内容脚本发送请求,但它没有监听器来监听这样的请求消息。在此扩展程序中,您无需使用 senRequest 。
答案 1 :(得分:2)
您不是requesting permission在这些网页上运行内容脚本。内容脚本的匹配项确定了它们在哪些页面中执行,但您仍需要请求将脚本注入这些页面的权限。
"permissions": [
"tabs",
"http://*/*"
]