运行由chrome扩展中的上下文菜单触发的jquery脚本

时间:2014-02-19 15:34:38

标签: google-chrome-extension

我是chrome扩展开发的新手。我的示例代码运行不正常。 要求:点击上下文菜单按钮执行任何jquery脚本(比如$(“body”)。hide();)。

从代码中,只有jquery部分无效。

我有以下文件:

的manifest.json

 {
"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);
            }

background.js有效! 所有警报工作文件,但来自genericOnClick的.hide函数不起作用。 即使我将代码从sample.js移动到backgroud.js,它也行不通。 你能告诉我哪里出错了吗?

1 个答案:

答案 0 :(得分:0)

正如我所提到的,不允许后台脚本与DOM交互,(不允许内容脚本使用chrome.contextMenus)。您需要将两者结合起来,并使用消息传递来告诉内容脚本何时执行。我做了一些其他调整:

  • 我现在重命名了background.jscontent.js以便他们的名字 反映他们的行为,并将background.js纳入活动页面。
  • 我删除了浏览器操作( 扩展需要browserAction.htmlbackground.js 需要chrome.browserAction.onClicked.addListener做任何事情 除了显示图标)。
  • 以编程方式注入jquery意味着始终将其加载为 内容脚本是不必要的(尽管跳过编程注入允许您省略最后三个权限)。
  • background.js不需要jquery 再也没有,所以它也没有加载到那里。
  • 默认executeScript tab是活动标签,因此我们不需要它的id。

这是成品:

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"
}

background.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);

content.js

chrome.runtime.onMessage.addListener(function(msg, sender, sendResponse) {
    if (msg.message == 'hide') {
        $("body").hide();
    }
    sendResponse();
});

您的content.js可能比此处大得多(SSCCE为+1)。但如果它很小,另一种选择是完全省略内容脚本,并用sendMessage替换chrome.tabs.executeScript(null,{code:"$('body').hide();"});