Chrome Extension - Dynamic Right-Click Menu

前端 未结 2 1133
别跟我提以往
别跟我提以往 2021-01-30 15:37

I am trying to create an option in the right-click menu that is dynamic based on the user\'s action. If the user selects some text, then right-clicks, the option will say \"Disp

2条回答
  •  暗喜
    暗喜 (楼主)
    2021-01-30 15:55

    I was looking to accomplish the same thing as the original post, and was able to get it working using some message passing. Regardless of whether it's bad practice or not, I used the enabled(true/false) contextMenu property to leave my context menu option present, but grayed out.

    I created a context menu. The important property is the id. The rest is mostly arbitrary because it will be changed dynamically.

    In content.js

    //This event listener will determine if the context menu should be updated 
    //based on if the right-button was clicked and if there is a selection or not
    document.addEventListener("mousedown", function(event){
        if (event.button !== 2) {
            return false;
        }
        var selected = window.getSelection().toString();
            if(event.button == 2 && selected != '') {
                    //get selected text and send request to bkgd page to create menu
                chrome.extension.sendMessage({
                       'message': 'updateContextMenu', 
                       'selection': true});
            } else {
            chrome.extension.sendMessage({
                       'message': 'updateContextMenu',
                       'selection': false});
            }
    }, true);
    

    In background.js:

    //add a message listener that will modify the context menu however you see fit
    chrome.extension.onMessage.addListener(function(request, sender, sendResponse) {
        if (request.message == 'updateContextMenu') {
            if (request.selection) {
                chrome.contextMenus.update('contextMenuId',{
                    'title': 'New Title', 
                    'enabled': true, 
                    "contexts": ["all"],
                    'onclick': someFunction
                });
            } else {
                chrome.contextMenus.update('contextMenuId',{
                    'title': 'Select some text first', 
                    'enabled': false, 
                    "contexts": ["all"]
                });
            }
        } else {
            sendResponse({});
        }
    });
    
    //The original context menu.  The important property is the id.  The rest is mostly 
    //arbitrary because it will be changed dynamically by the listener above.
        chrome.contextMenus.create({
            'id': 'contextMenuId', 
            'enabled': false, 
            'title': 'Some Title', 
            "contexts": ["all"]
            });
    

提交回复
热议问题