5

我正在为 chrome 浏览器开发一个扩展,我想为 pdf 文档添加一个指定的上下文菜单。我还为“页面”和“图像”类型添加了指定的上下文菜单。如果我将类型设置为“全部”,那么会有一个上下文菜单,但没有为 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" )
4

3 回答 3

5

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

我找不到直接执行此操作的方法,但是另一种方法可能是chrome.tabs.onActivated根据当前 URL 是否与 PDF 文件匹配来收听并添加或删除上下文菜单。一个缺点是,这意味着请求tabs许可,这对用户来说可能看起来很吓人。(“这个扩展可以访问你的标签和浏览活动”或类似的东西)

*对于好奇,你这样做:

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

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

于 2013-08-15T05:49:32.110 回答
3

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

应该用表达式编辑!

于 2013-08-15T09:45:27.263 回答
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. 如何在我的页面操作弹出窗口中获取当前打开的选项卡的 URL?
  2. 检查项目是否已经在上下文菜单中
于 2021-02-25T10:45:43.107 回答