Chrome扩展程序ContextMenu for PDF

时间:2013-08-14 08:26:30

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

我正在开发Chrome浏览器的扩展程序,我想为pdf文档添加指定的上下文菜单。我还为“page”和“image”类型添加了指定的contextmenus。 如果我将类型设置为“全部”,那么有一个上下文菜单,但没有为pdf文档指定。

是否可以为pdf文档添加指定的上下文菜单,或者我应该在clickEventHandler中使用“all”类型和切换案例?!

详情请见: http://developer.chrome.com/extensions/contextMenus.html

这些是“文件”类型:

contexts ( optional array of enum of "all", "page", "frame", "selection", "link", "editable", "image", "video", "audio", or "launcher" )

3 个答案:

答案 0 :(得分:3)

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

我找不到直接执行此操作的方法,但另一种方法是听取chrome.tabs.onActivated并根据当前网址是否与PDF文件匹配来添加或删除上下文菜单。一个缺点是它意味着要求tabs权限,这对用户来说可能看起来很可怕。 (“此扩展程序可以访问您的标签页和浏览活动”或类似内容)

*对于好奇的人,你这样做:

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

(你会添加你感兴趣的其他选项)

答案 1 :(得分:2)

此功能适用于我的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) {

应该用表达式编辑!

答案 2 :(得分:0)

目前的答案并不完美:

  1. 移除上下文菜单的方法

  2. 不适用于新打开的 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);
        });
    });
    

参考文献:

  1. How to get the currently opened tab's URL in my page action popup?
  2. Check if Item is already in the Context Menu