Chrome扩展程序上下文菜单:单击菜单项后如何将div附加到页面

时间:2013-11-11 20:44:11

标签: javascript google-chrome google-chrome-extension

使用构建Chrome扩展程序。目前我已经整理了一个上下文菜单项。单击上下文菜单项时,它会在我的后台脚本itemClicked()中触发context_menu.js

function itemClicked(info, tab) {
     alert("clicked");
}

警报触发。我也可以通过itemClicked()

来发送ajax请求

但是,我不能将任何元素附加到页面(或任何类型的DOM操作)。即使是基本的东西也行不通:

  var d = document.createElement('div');
  d.setAttribute("css", "width: 100px; height: 100px; background-color: red; position: fixed; top: 70px; left: 30px; z-index: 99999999999;");
  document.body.appendChild(d); 

所以我尝试将相同的代码添加到内容脚本中:

chrome.contextMenus.onClicked.addListener(function(OnClickData info, tabs.Tab tab) {
  //code to append the input here
});

但它仍然无效。我做错了什么?

单击?

后,如何让上下文菜单向页面添加内容?

非常感谢!

编辑:这是我的manifest.json(删除了无关的东西,比如姓名/描述......等)

{


  "permissions": [
    "activeTab",        
    "tabs",
    "cookies",
    "contextMenus"
  ],

  "background": {
    "scripts": ["context_menu.js"]
  },
  "browser_action": {
    "default_icon": "icon16.png",
    "default_css": "popup.css",
    "default_popup": "popup.html"
  },

  "content_scripts": [
    {      
      "matches": ["<all_urls>"],
      "js": ["vendor/jquery-1.8.2.min.js", "config.js", "content_script.js"]   
    }
  ],

  "web_accessible_resources": ["popup.html"]

}

1 个答案:

答案 0 :(得分:17)

你可能误解了 background page 的概念(以及更年轻,更资源友好且更喜欢的兄弟: event page )和那是 content script

内容脚本

  • 绑定到加载到选项卡中的特定网页。
  • 生活在一个孤立的世界(JS上下文),但可以直接访问网页DOM。
  • 可以与背景页面进行通信(请参阅 Message Passing )。

背景页

  • 绑定到您的扩展程序(每个扩展程序最多有1个背景(或事件)页面。)
  • 总是在后台的某个地方(活动页面“不时小睡”,但你总能将它们唤醒)。
  • 无法直接访问任何网页。
  • 可以与内容脚本(和其他视图)进行通信(请参阅 Message Passing )。
  • 可以做很酷的事情(因为他们可以访问很酷的 chrome。* API)。

chrome.contentMenus API仅适用于后台网页。因此,您必须创建任何上下文菜单并在那里监听onClicked个事件(在后台页面中) 单击上下文菜单后,您可以使用 Programmatic Injection 将一些代码(或内容脚本)注入活动标签的网页。

以下是演示此方法的示例扩展的源代码。

<强>的manifest.json:

{
    "manifest_version": 2,
    "name":    "Test Extension",
    "version": "0.0",

    "background": {
        "persistent": false,   // <-- let's make it an event page
        "scripts": ["background.js"]
    },

    "permissions": [
        "contextMenus",
        "activeTab"   // <-- here, sufficient for our purpose
    ]
}

<强> background.js:

/* Create a context-menu */
chrome.contextMenus.create({
    id: "myContextMenu",   // <-- mandatory with event-pages
    title: "Click me",
    contexts: ["all"]
});

/* Register a listener for the `onClicked` event */
chrome.contextMenus.onClicked.addListener(function(info, tab) {
    if (tab) {
        /* Create the code to be injected */
        var code = [
            'var d = document.createElement("div");',
            'd.setAttribute("style", "'
                + 'background-color: red; '
                + 'width: 100px; '
                + 'height: 100px; '
                + 'position: fixed; '
                + 'top: 70px; '
                + 'left: 30px; '
                + 'z-index: 9999; '
                + '");',
            'document.body.appendChild(d);'
        ].join("\n");

        /* Inject the code into the current tab */
        chrome.tabs.executeScript(tab.id, { code: code });
    }
});

(如果注入的代码足够复杂,最好注入.js文件。有关 Programmatic Injection 的更多信息。)