首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >火狐WebExtension工具栏按钮以切换侧边栏

火狐WebExtension工具栏按钮以切换侧边栏
EN

Stack Overflow用户
提问于 2017-06-24 22:21:07
回答 2查看 1.5K关注 0票数 7

由于火狐澳洲版界面,没有更多的工具栏按钮来切换书签和历史侧边栏只需一次点击。有“显示侧边栏”工具栏按钮,但它显示一个动画弹出,需要2点击。

因此,我试图创建一个WebExtension来实现这些按钮。

  • 给定的WebExtension只能添加一个工具栏按钮,因此我必须创建两个单独的扩展。这开始很好..。好吧,我会处理的。
  • sidebar_action不添加工具栏按钮,因此它排除了此方法。
  • 这让我和browser_action在一起了。

我尝试了很多事情,但都没有成功,例如:

  • 在一个SidebarUI.toggle("viewBookmarksSidebar");脚本中调用background.js,但是没有定义SidebarUI对象。
  • 这里有chrome://browser/content/bookmarks/bookmarksPanel.xul URL,但是我缺少加载它的侧边栏。
  • 我试图将sidebar_actionbrowser_action结合起来,但这是不可能的。
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-06-25 03:23:28

使用browserAction按钮打开自己的侧边栏

您可以有一个browserAction工具栏按钮来打开您自己的侧边栏。您可以通过在您的sidebar_action中定义一个browser_action和一个browser_action来实现这一点。

当提出这个问题时,不可能将sidebar_actionbrowser_action合并到manifest.json中。我不确定这种情况何时真正改变了,但到目前为止(在FF71上进行了测试),您可以两者兼得。

下面是执行此操作的示例代码:

manifest.json:

代码语言:javascript
复制
{
    "manifest_version": 2,
    "name": "Button opens sidebar",
    "description": "Open the sidebar with a toolbar button.",
    "version": "1.0",

    "browser_action": {
        "default_icon": "icon.png",
        "default_title": "Open Sidebar"
    },
    "background": {
        "scripts":[
            "background.js"
        ]
    },
    "sidebar_action": {
        "default_icon": "icon.png",
        "default_title": "Example Sidebar",
        "default_panel": "sidebar.html",
        "open_at_install": false
    }
}

background.js:

代码语言:javascript
复制
//The manifest.json entry must be a file in your extension, but you can change it to
//  an external site in your background.js:
browser.sidebarAction.setPanel({panel: 'https://example.org/'});
//Open the sidebar when the browserAction button is clicked.
browser.browserAction.onClicked.addListener(() => {
  browser.sidebarAction.open();
});

sidebar.html

代码语言:javascript
复制
<html>
  <body>
    <div>Example text</div>
  </body>
</html>

将侧边栏打开/关闭

我尝试实现按钮的简单实现,实际上是切换侧栏:

background.js

代码语言:javascript
复制
browser.browserAction.onClicked.addListener(() => {
    browser.sidebarAction.isOpen({}).then((isOpen) =>  {
        if (isOpen) {
            browser.sidebarAction.close();
        } else {
            browser.sidebarAction.open();
        }
    });
});

不幸的是,这个错误失败了:

错误:只能从用户输入处理程序调用sidebarAction.open。

使用第二个browserAction onClicked

您可以利用从扩展中显示HTML的侧边栏在后台上下文中运行的事实,只需在侧边栏中添加一个额外的browserAction.onClicked侦听器就可以关闭侧边栏。

background.js

代码语言:javascript
复制
browser.browserAction.onClicked.addListener(() => {
    browser.sidebarAction.open();
});

sidebar.js

代码语言:javascript
复制
browser.browserAction.onClicked.addListener(() => {
    browser.sidebarAction.close();
});

sidebar.html

代码语言:javascript
复制
<html>
  <head>
    <script src="sidebar.js"></script>
  </head>
  <body>
    <div>Example text</div>
  </body>
</html>

事件侦听器按照添加的顺序执行,因此由sidebar.js添加的事件侦听器(关闭侧栏)在background.js中的事件监听器之后运行,后者打开侧栏。因此,当侧边栏打开时,它会在被单击的browserAction按钮上关闭。

无法打开实际书签或历史记录侧边栏

您特别想要的是打开实际的书签或历史侧边栏,这在WebExtensions中是不可能的。您可以做的是自己实现类似的侧边栏。

我确实尝试将侧栏URL更改为chrome:// URL:

代码语言:javascript
复制
browser.sidebarAction.setPanel({panel: 'chrome://browser/content/aboutDialog.xul'});

不幸的是,这会导致一个错误:

错误:拒绝访问URL chrome://browser/content/chrome Dialog.xul

如果您希望以某种方式以编程方式打开实际的书签或历史侧边栏,那么您将需要提出一个错误请求该功能。另外,您还可以创建一个WebExtension实验,它在安装WebExtensions实验时向WebExtension API添加功能。WebExtension实验不会自动集成到火狐中,但有可能会集成到火狐中。

票数 4
EN

Stack Overflow用户

发布于 2020-03-22 23:06:56

火狐⩾73

从Firefox 73开始,您可以简单地使用:

代码语言:javascript
复制
browser.browserAction.onClicked.addListener(() => {
    browser.sidebarAction.toggle();
});

关于MDN的文档

Firefox < 73

如果您需要支持旧版本的Firefox,特别是ESR,您可以跟踪哪些侧边栏是打开的。这是我为我的一个加载项开发的方法,也是我知道的唯一一个在多个窗口中正确工作的方法。

在您的背景脚本中:

代码语言:javascript
复制
let openedSidebarWindows = {};
browser.runtime.onConnect.addListener(port => onConnect(port));
browser.browserAction.onClicked.addListener(tab => this.onClick(tab));

function onConnect(port) {
  const windowId = parseInt(port.name);
  openedSidebarWindows[windowId] = port;
  port.onDisconnect.addListener(port => {
    delete openedSidebarWindows[parseInt(port.name)];
  });
}

function onClick({ windowId }) {
  if (openedSidebarWindows[windowId] !== undefined) {
    browser.sidebarAction.close();
  } else {
    browser.sidebarAction.open();
  }
}

在您的侧边栏脚本中:

代码语言:javascript
复制
browser.runtime.connect({ name: windowId.toString() });
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44741462

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档