似乎无法获得chrome.contextMenus.onClicked以在Chrome扩展程序中触发

问题描述 投票:1回答:1

我正在尝试编写我的第一个浏览器扩展,并且我似乎无法通过单击上下文菜单项来触发单击处理程序。 console.log调用似乎没有向控制台吐出任何东西,我尝试使用alert()以防万一“背景”脚本(不确定背景和内容脚本之间的区别是什么),但是似乎也没有做任何事情。

当我在测试页面的输入中选择一些文本时,右键单击并选择加密或解密,没有任何反应;不在控制台或开发人员工具的网络选项卡中。我究竟做错了什么?

manifest.json的:

{
    "manifest_version": 2,

    "name": "my name",
    "description": "my description",
    "version": "1.0",

    "background": {
        "scripts": ["jquery-3.2.1.min.js", "background.js"],
        "persistent": false
    },
    "content_scripts": [
        {
            "matches": ["http://*/*", "https://*/*"],
            "js": ["content_script.js"]
        }
    ],
    "permissions": [
        "activeTab",
        "contextMenus",
        "http://my.hostname.com/"
    ]
}

background.js:

/**
 * A handler which will run the analysis of the DOM element's selected text
 */
function clickHandler(info, tab) {
    "use strict";
    console.log(info);
    console.log(tab);
    // get selected text as encrypt/decrypt
    chrome.tabs.query({active: true, currentWindow: true}, function (tabs) {
        chrome.tabs.sendMessage(tabs[0].id, "get selection", null, function(selection) {
            var data = {
                "action": action,
                "selection": selection
            };
            var max_length = 4095;
            if (data.selection.length > max_length) {
                data.selection = data.selection.substring(0, max_length);
            }
            var url = "http://my.hostname.com/";
            jQuery.post(url, data, function (response) {
                chrome.tabs.sendMessage(tabs[0].id, response);
            }, "json");
        });
    });
}

/**
 * Create a context menu items to allow encode/decode
 */
chrome.runtime.onInstalled.addListener(function() {
    chrome.contextMenus.create({
        "id": "encrypt",
        "title": "Encrypt",
        "type": "normal",
        "contexts": ["editable"]
    });

    chrome.contextMenus.create({
        "id": "decrypt",
        "title": "Decrypt",
        "type": "normal",
        "contexts": ["selection"]
    });

    chrome.contextMenus.onClicked.addListener(clickHandler);
});
google-chrome-extension
1个回答
3
投票

您需要在onInstalled之外移动contextMenus.onClicked。

chrome.runtime.onInstalled.addListener(function() {
 //create context menus
})
chrome.contextMenus.onClicked.addListener(function() {
 //handle context menu actions
})

“每次加载活动页面时,注册接收您的扩展程序感兴趣的任何活动。活动页面将为您的扩展程序的每个新版本加载一次。之后,它将仅加载以提供您已注册的活动。通常意味着您的事件侦听器应该添加到事件页面的顶级范围,否则它们可能在重新加载事件页面时不可用。如果您需要在安装或升级扩展时进行一些初始化,请监听运行时.onInstalled事件。这是注册declarativeWebRequest规则,contextMenu条目和其他这样的一次性初始化的好地方。“

https://developer.chrome.com/extensions/event_pages#best-practices

© www.soinside.com 2019 - 2024. All rights reserved.