Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/431.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何将面板锚定到DOM元素?_Javascript_Firefox_Firefox Addon_Firefox Addon Sdk - Fatal编程技术网

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的东西不是更容易吗?这也意味着您不再需要与主加载项代码通信。