使用 Firefox Add-on SDK 进行面板定位

发布于 2024-11-24 19:52:39 字数 1636 浏览 3 评论 0原文

我正在尝试使用新的 SDK 将我的面板定位在附加组件中取得一些进展。

我发现文档仅显示了控制面板位置的一种方法,那就是在 show() 时传递锚点:

显示(锚点)

显示面板。 [锚:句柄]

面板应显示的页面中 DOM 节点的句柄 被锚定。如果没有给出,面板将在最里面居中 最近的浏览器窗口。请注意,目前无法 仅使用高级 API 以这种方式锚定面板。

理想情况下,我希望锚点是单击该小部件时面板显示锚定到的小部件,但该小部件不是页面中的 DOM 节点,所以我想不是......

我也许可以解决这个问题,但我什至找不到如何将面板锚定到 DOM 节点的工作示例。当我通过 port 传回 contentScript 中的 DOM 节点时,如下所示:

lib/main.js

  var scraper = pageMod.PageMod({
    include: ['*'],
    contentScriptWhen: 'ready',
    contentScriptFile: [data.url('jquery-1.6.2.min.js'), data.url('scraper.js')],
    onAttach: function(worker){
      worker.port.on('pageLoaded', function(page){
        widget.panel.show(page.anchor);
      }); 
    } 

data/scraper.js< /strong>

$('body').append('
  <div id="anchor-to-me" style="position:fixed; bottom: 0; right: 0;">.</div>
');

var anchor = $('#anchor-to-me').get();
self.port.emit('pageLoaded', { anchor : anchor  }); 

我收到以下控制台错误:

error: An exception occurred.
Traceback (most recent call last):
  File "resource://jid1-wuvxefqtmptsnw-at-jetpack-addon-kit-lib/panel.js", line 147, in show
    let document = getWindow(anchor).document;
  File "resource://jid1-wuvxefqtmptsnw-at-jetpack-addon-kit-lib/panel.js", line 345, in getWindow
    let anchorWindow = anchor.ownerDocument.defaultView.top;
TypeError: anchor.ownerDocument is undefined

任何可以帮助我成功锚定到 DOM 元素或找到其他方法来定位面板的信息都会很棒。

谢谢。

I am trying to make some headway positioning my panel in an Add-on make with the new SDK.

I see that the documentation shows only one way to control the position of a panel, and that is by passing an anchor when you show() it:

show(anchor)

Displays the panel. [ anchor : handle ]

A handle to a DOM node in a page to which the panel should appear to
be anchored. If not given, the panel is centered inside the most
recent browser window. Note that it is not currently possible to
anchor panels in this way using only the high level APIs.

Ideally, I'd like the anchor to be the widget that the panel appears anchored to when that widget is clicked, but the widget is not a DOM node in a page so I guess not...

I can probably work around this, but I can't even find a working example of how to anchor the panel to a DOM node. When I pass back a DOM node in a contentScript through port like this:

lib/main.js

  var scraper = pageMod.PageMod({
    include: ['*'],
    contentScriptWhen: 'ready',
    contentScriptFile: [data.url('jquery-1.6.2.min.js'), data.url('scraper.js')],
    onAttach: function(worker){
      worker.port.on('pageLoaded', function(page){
        widget.panel.show(page.anchor);
      }); 
    } 

data/scraper.js

$('body').append('
  <div id="anchor-to-me" style="position:fixed; bottom: 0; right: 0;">.</div>
');

var anchor = $('#anchor-to-me').get();
self.port.emit('pageLoaded', { anchor : anchor  }); 

I get the following console error:

error: An exception occurred.
Traceback (most recent call last):
  File "resource://jid1-wuvxefqtmptsnw-at-jetpack-addon-kit-lib/panel.js", line 147, in show
    let document = getWindow(anchor).document;
  File "resource://jid1-wuvxefqtmptsnw-at-jetpack-addon-kit-lib/panel.js", line 345, in getWindow
    let anchorWindow = anchor.ownerDocument.defaultView.top;
TypeError: anchor.ownerDocument is undefined

Any info to help me successfully anchor to a DOM element, or find some other way to position the panel would be great.

Thanks.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

玉环 2024-12-01 19:52:39
const panel = require("panel").Panel({
  width: 240,
  height: 320,
  contentURL: data.url("foo.html"),
  contentScriptFile: [data.url("jquery-1.4.4.min.js"),
                      data.url("panel.js")]
});

const widget = widgets.Widget({
  id: "some-id",
  label: "Some label",
  contentURL: data.url("icon.png"),
  //panel: panel,
  onClick: function(view) { /* cool stuff */ 
     view.panel = panel;
  }
});

不要使用 mainPanel.show(),而是使用 view.panel = mainPanel;。它将解决问题,因为我也做了同样的事情。

const panel = require("panel").Panel({
  width: 240,
  height: 320,
  contentURL: data.url("foo.html"),
  contentScriptFile: [data.url("jquery-1.4.4.min.js"),
                      data.url("panel.js")]
});

const widget = widgets.Widget({
  id: "some-id",
  label: "Some label",
  contentURL: data.url("icon.png"),
  //panel: panel,
  onClick: function(view) { /* cool stuff */ 
     view.panel = panel;
  }
});

Instead of using mainPanel.show(), use view.panel = mainPanel;. It will solve the problem bcz I did the same.

怀念你的温柔 2024-12-01 19:52:39

当您定义小部件时,您可以添加一个面板属性,该属性是面板的实例:

[面板:面板]

当用户单击小部件时打开的可选面板。注:如果
您还注册了一个“点击”侦听器,它将被调用而不是
面板被打开。但是,您可以从侦听器显示面板
通过调用 this.panel.show()。

这是一个示例(不幸的是,文档中没有这样的示例):

const panel = require("panel").Panel({
  width: 240,
  height: 320,
  contentURL: data.url("foo.html"),
  contentScriptFile: [data.url("jquery-1.4.4.min.js"),
                      data.url("panel.js")]
});

const widget = widgets.Widget({
  id: "some-id",
  label: "Some label",
  contentURL: data.url("icon.png"),
  panel: panel,
  onClick: function() { /* cool stuff */ }
});

When you define your widget, you can add a panel property that is the instance of your panel:

[ panel : Panel ]

An optional panel to open when the user clicks on the widget. Note: If
you also register a "click" listener, it will be called instead of the
panel being opened. However, you can show the panel from the listener
by calling this.panel.show().

Here's an example ( unfortunately there isn't an example of this in the docs ):

const panel = require("panel").Panel({
  width: 240,
  height: 320,
  contentURL: data.url("foo.html"),
  contentScriptFile: [data.url("jquery-1.4.4.min.js"),
                      data.url("panel.js")]
});

const widget = widgets.Widget({
  id: "some-id",
  label: "Some label",
  contentURL: data.url("icon.png"),
  panel: panel,
  onClick: function() { /* cool stuff */ }
});
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文