Javascript 用于PDF的Chrome扩展上下文菜单

Javascript 用于PDF的Chrome扩展上下文菜单,javascript,google-chrome,google-chrome-extension,Javascript,Google Chrome,Google Chrome Extension,我正在为chrome浏览器开发一个扩展,我想为pdf文档添加一个指定的上下文菜单。我还为类型“page”和“image”添加到指定的上下文菜单中。 如果我将类型设置为“all”,则有一个contextmenu,但没有为pdf文档指定 是否可以为pdf文档添加指定的contextmenu,还是应该在clickEventHandler中使用类型为“all”的it make开关大小写 更多信息,请访问: 以下是“文件”类型: 我猜您只想在选项卡中显示PDF时添加上下文菜单,对吗?我只是想问一下,因为

我正在为chrome浏览器开发一个扩展,我想为pdf文档添加一个指定的上下文菜单。我还为类型“page”和“image”添加到指定的上下文菜单中。 如果我将类型设置为“all”,则有一个contextmenu,但没有为pdf文档指定

是否可以为pdf文档添加指定的contextmenu,还是应该在clickEventHandler中使用类型为“all”的it make开关大小写

更多信息,请访问:

以下是“文件”类型:


我猜您只想在选项卡中显示PDF时添加上下文菜单,对吗?我只是想问一下,因为一开始我认为您想在PDF文件的链接上添加上下文菜单,这确实是可能的*。(你可能知道)

我找不到直接执行此操作的方法,但是另一种方法是根据当前URL是否与PDF文件匹配来侦听和添加或删除上下文菜单。一个缺点是,这意味着需要
选项卡
权限,这可能会让用户感到害怕。(“此扩展可以访问您的选项卡和浏览活动”或类似内容)

*出于好奇,您可以这样做:

chrome.contextMenus.create({
    title: "Hello world",
    contexts: ["link"],
    targetUrlPatterns: ["*://*/*.pdf"]
});

(您当然可以添加您感兴趣的其他选项)

此函数适用于我的pdf文档:

chrome.tabs.onActivated.addListener(function (info) {
    var tab = chrome.tabs.get(info.tabId, function (tab) {
        if (tab.url.indexOf(".pdf") > 0) {
            chrome.contextMenus.create({
                "id": "1",
                title: "Just for PDF Documents",
                contexts: ["all"],
                onclick: function (e) {
                }
            });
        } else {
            chrome.contextMenus.remove("1", null);
        }
    });
});
也许是电话线

if (tab.url.indexOf(".pdf") > 0) {

应该用表达式编辑

目前的答案并不完美:

  • 删除上下文菜单的方法

  • 不能很好地处理新打开的pdf文件或多个窗口

    let g_contextMenus = [{
        id: "test",
        title: "test"
    }];
    
    function createContextMenus() {
    
    for (var menu of g_contextMenus) {
        chrome.contextMenus.create({
            id: menu["id"],
            type: "normal",
            title: menu["title"],
            contexts: ["all"]
        });
        }
    }
    createContextMenus();
    
    function updateContextMenu(tabId) {
        chrome.tabs.get(tabId, function(tab) {
            var suffix = tab.url.slice(-4);
            var isPdf = suffix.toLowerCase() == ".pdf";
            for (var menu of g_contextMenus) {
                chrome.contextMenus.update(menu["id"], { visible: isPdf })
            }
        });
    };
    
    /**
     * Switch tab
     **/
    chrome.tabs.onActivated.addListener(function(info) {
        updateContextMenu(info.tabId);
    });
    
    /**
     * New open file
     **/
    chrome.tabs.onUpdated.addListener(function(tabId, info, tab) {
        var suffix = tab.url.slice(-4);
        if (info.status == "complete" && suffix.toLowerCase() == ".pdf") {
            updateContextMenu(tabId);
        }
    });
    
    /**
     * Multiple window/New window
     **/
    chrome.windows.onFocusChanged.addListener(function(winId) {
        chrome.tabs.query({ lastFocusedWindow: true, active: true }, function(tabs) {
            updateContextMenu(tabs[0].id);
        });
    });
    
  • 参考资料:


  • 谢谢,我修改了我的函数,现在指定的上下文菜单只适用于pdf文档:很好奇,考虑到进程外的pdf扩展的行为非常不同,这到今天仍然有效吗?我不明白为什么这不适用于
    'documentUrlPatterns':[“*://*/*.pdf”]
    let g_contextMenus = [{
        id: "test",
        title: "test"
    }];
    
    function createContextMenus() {
    
    for (var menu of g_contextMenus) {
        chrome.contextMenus.create({
            id: menu["id"],
            type: "normal",
            title: menu["title"],
            contexts: ["all"]
        });
        }
    }
    createContextMenus();
    
    function updateContextMenu(tabId) {
        chrome.tabs.get(tabId, function(tab) {
            var suffix = tab.url.slice(-4);
            var isPdf = suffix.toLowerCase() == ".pdf";
            for (var menu of g_contextMenus) {
                chrome.contextMenus.update(menu["id"], { visible: isPdf })
            }
        });
    };
    
    /**
     * Switch tab
     **/
    chrome.tabs.onActivated.addListener(function(info) {
        updateContextMenu(info.tabId);
    });
    
    /**
     * New open file
     **/
    chrome.tabs.onUpdated.addListener(function(tabId, info, tab) {
        var suffix = tab.url.slice(-4);
        if (info.status == "complete" && suffix.toLowerCase() == ".pdf") {
            updateContextMenu(tabId);
        }
    });
    
    /**
     * Multiple window/New window
     **/
    chrome.windows.onFocusChanged.addListener(function(winId) {
        chrome.tabs.query({ lastFocusedWindow: true, active: true }, function(tabs) {
            updateContextMenu(tabs[0].id);
        });
    });