Javascript 如何将面板锚定到DOM元素?
我有一个附加组件,它绑定到页面上所有文本控件的Javascript 如何将面板锚定到DOM元素?,javascript,firefox,firefox-addon,firefox-addon-sdk,Javascript,Firefox,Firefox Addon,Firefox Addon Sdk,我有一个附加组件,它绑定到页面上所有文本控件的onKeyPress事件。当输入一些文本时,我将从内容脚本向附加脚本发送一条消息,该脚本将显示一个包含一些数据的面板。这工作正常,但面板未正确定位。我想定位定位到文本控件的面板 面板的show()函数将DOM元素带到它应该锚定的位置。但我不确定是否要将DOM元素从内容脚本传递到附加进程。看起来我只能传递JSON可序列化的值 解决此问题的任何帮助都将非常有用。将DOM节点从内容脚本传递到扩展脚本是不可能的。这是由设计决定的——扩展脚本永远不应该直接处理
onKeyPress
事件。当输入一些文本时,我将从内容脚本向附加脚本发送一条消息,该脚本将显示一个包含一些数据的面板。这工作正常,但面板未正确定位。我想定位定位到文本控件的面板
面板的show()
函数将DOM元素带到它应该锚定的位置。但我不确定是否要将DOM元素从内容脚本传递到附加进程。看起来我只能传递JSON可序列化的值
解决此问题的任何帮助都将非常有用。将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
属性没有在列表中列出)。使用它们的风险由您自己承担,并做好准备,以免它们在SDK的未来版本中停止工作。向文档中注入一个看起来像面板的HTML元素(如canuckistani所建议的)可能确实是一个更好的选择。使用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;
}
});
我不确定Panel是否是下注解决方案——在内容脚本中创建一些类似html Panel的东西不是更容易吗?这也意味着您不再需要与主加载项代码通信。