如何将面板锚定到DOM元素?

时间:2012-10-09 05:28:33

标签: javascript firefox firefox-addon firefox-addon-sdk

我有一个加载项,它绑定到页面上所有文本控件的onKeyPress事件。在输入一些文本时,我将从内容脚本向附加脚本发送消息,该脚本将显示包含一些数据的面板。这很好用,但面板没有正确定位。我想将面板定位到文本控件。

Panel的show()函数将DOM元素放在应该锚定的位置。但我不确定将DOM元素从内容脚本传递给附加过程。看起来我只能传递JSON可序列化值。

解决这个问题的任何帮助都会很棒。

2 个答案:

答案 0 :(得分:2)

将DOM节点从内容脚本传递到扩展脚本是不可能的。这是设计使然 - 扩展脚本不应该直接处理DOM,它们甚至可能在一个单独的进程中运行(这是附加SDK原始规划的一部分)。

目前,在扩展脚本中获取DOM节点的唯一方法是使用低级API直接访问DOM而不是通过内容脚本。例如,您可以在活动的浏览器窗口中打开页面:

var windowUtils = require("window-utils");
var browser = windowUtils.activeBrowserWindow;
var wnd = browser.content;
var element = wnd.document.getElementById("foobar");

但是,这些低级API不能保证稳定,window-utils模块甚至没有完整记录(例如activeBrowserWindow属性未列在documentation中)。使用它们需要您自担风险,并准备好在SDK的未来版本中停止工作。将HTML元素注入到仅仅看起来像面板的文档中(如canuckistani所建议的)可能确实是更好的选择。

答案 1 :(得分:1)

不使用mainPanel.show(),而是使用view.panel = mainPanel;

myWidget = require('widget').Widget({
      id: "text-entry",
      label: "StrikeBase",
      contentURL: data.url("icon.png"),
//    panel: mainPanel,
      // Instead using this
      onClick: function(view) { 
//        mainPanel.show();
         // Instead using this              
          view.panel = mainPanel;
      }
    });