Google chrome extension 在chrome扩展中运行上下文菜单触发的jquery脚本
我是chrome扩展开发的新手。我的示例代码运行不正常。 要求:点击上下文菜单按钮执行任何jquery脚本(比如$(“body”).hide();) 从代码来看,只有jquery部分不起作用 我有以下文件: manifest.jsonGoogle chrome extension 在chrome扩展中运行上下文菜单触发的jquery脚本,google-chrome-extension,Google Chrome Extension,我是chrome扩展开发的新手。我的示例代码运行不正常。 要求:点击上下文菜单按钮执行任何jquery脚本(比如$(“body”).hide();) 从代码来看,只有jquery部分不起作用 我有以下文件: manifest.json { "manifest_version": 2, "name": "jQuery DOM", "version": "1", "permissions": [ "contextMenus","tabs","activeTab" ], "background":
{
"manifest_version": 2,
"name": "jQuery DOM",
"version": "1",
"permissions": [
"contextMenus","tabs","activeTab"
],
"background": {
"scripts": ["jquery.min.js","sample.js"]
},
"description": "Manipulate the DOM when the page is done loading",
"browser_action": {
"name": "Manipulate DOM",
"icons": ["icon.png"],
"default_icon": "icon.png"
},
"content_scripts": [ {
"js": [ "jquery.min.js", "background.js" ],
"matches": [ "http://*/*", "https://*/*"],
"run_at": "document_end"
}]
}
background.js
$("body").append('Test');
我在文件夹中有icon.png,它加载得很好。
jquery.min.js位于同一文件夹中
sample.js
alert("Extension loaded");
function genericOnClick(info, tab) {
alert("Tab "+tab.id);
chrome.tabs.executeScript(tab.id, {
file: "jquery.min.js",
allFrames: true
},function(){
alert("callback");
$("body").hide();
});
alert("Completed");
$("body").hide();
}
var contexts = ["page"];
for (var i = 0; i < contexts.length; i++) {
var context = contexts[i];
var title = "Test Page menu item";
var id = chrome.contextMenus.create({"title": title, "contexts":[context],
"onclick": genericOnClick});
console.log("'" + context + "' item:" + id);
}
警报(“已加载扩展”);
函数常规单击(信息,选项卡){
警报(“选项卡”+选项卡id);
chrome.tabs.executeScript(tab.id{
文件:“jquery.min.js”,
所有帧:正确
},函数(){
警报(“回调”);
$(“body”).hide();
});
警报(“已完成”);
$(“body”).hide();
}
变量上下文=[“页面”];
for(var i=0;i
background.js有效!
所有警报都可以在文件中工作,但genericOnClick的.hide函数不起作用。
即使我将代码从sample.js移到background.js,它也不会工作。
你能告诉我哪里出错了吗?正如我提到的,背景脚本不允许与DOM交互(而内容脚本不允许使用
chrome.contextMenus
)。您需要将两者结合起来,并使用消息传递告诉内容脚本何时执行。我还做了一些其他调整:
- 我重命名了
和background.js
,这样他们的名字现在 反映他们所做的,并将content.js
放入事件页面background.js
- 我删除了浏览器操作(浏览器)
扩展需要
或browserAction.html
才能使用 需要background.js
来执行任何操作 而不是显示图标)chrome.browserAction.onClicked.addListener
- 以编程方式注入jquery意味着总是将其作为 内容脚本是不必要的(尽管跳过编程注入允许您忽略最后三个权限)
不需要jquery 再也没有了,所以也没有在那里加载background.js
- 默认的
tab是活动选项卡,因此我们不需要它的idexecuteScript
manifest.json
{
"manifest_version": 2,
"name": "jQuery DOM",
"version": "1",
"permissions": [
"contextMenus", "activeTab", "tabs", "http://*/", "https://*/"
],
"background": {
"scripts": [ "background.js" ],
"persistent": false
},
"content_scripts": [ {
"js": [ "content.js" ],
"matches": [ "<all_urls>" ]
}],
"description": "Manipulate the DOM when the page is done loading"
}
content.js
function genericOnClick(info, tab) {
chrome.tabs.executeScript(null,
{"file": "jquery.min.js"},
function() {
chrome.tabs.sendMessage(tab.id,{"message":"hide"});
});
}
chrome.contextMenus.create({"title": "Test Page menu item",
"contexts":["page"],
"id":"contextId"});
chrome.contextMenus.onClicked.addListener(genericOnClick);
chrome.runtime.onMessage.addListener(function(msg, sender, sendResponse) {
if (msg.message == 'hide') {
$("body").hide();
}
sendResponse();
});
您的
content.js
可能比这里要大得多(+1表示默认值)。但是如果它很小,另一个选择是完全省略内容脚本,并用chrome.tabs.executeScript(null,{code:$('body').hide();“})替换sendmages
代码>看起来您正在将内容脚本(在每个页面的上下文中运行)与背景脚本(在每个页面的chrome上下文中运行)与浏览器操作(单击操作图标时运行)相结合。你想做什么,什么时候做?我希望$(“body”).hide()在我单击上下文菜单项时可以工作。在我看来,一切都正常,只是背景脚本(sample.js
)不允许与DOM交互。我认为您需要向内容脚本发送消息(background.js
——应该重命名),并使其隐藏正文。您不需要浏览器操作。这能解决问题吗?@Teepeemm我试着用action来准备上下文菜单,但这些带有action的菜单在background.js中不起作用。请原谅我的文件命名,它会造成混乱。关于浏览器操作,它(至少对我来说)可以测试附加组件是否工作。但是没有写任何操作。或者如果content.js
是巨大的,则以编程方式注入它以及jquery
,并且仍然忽略manifest.json
中的content\u scripts
对象。非常感谢您的回答,它成功了。我继续要求在大约:空白页上运行相同的脚本,但失败了。你能就解决我的问题提出你的建议吗。请参阅以了解更多详细信息