我已将插件加载到我的XUL覆盖中,

<vbox style="height:0;">
    <html:embed type="application/x-my-plugin" id="my-plugin" style="height:0;"/>
</vbox>


现在,当用户加载新标签并且我有对调用者的引用时,将触发一个事件。这是通过附加在XUL叠加层上的javascript完成的。

var caller = myEvent.originalTarget;


当我尝试执行以下操作时,我的变量“ plugin”为空。可能是什么问题,我该如何解决?

var plugin = caller.getElementById("my-plugin");
plugin.calculateTime();

最佳答案

我假设您的实际代码使用的是document.getElementById而不是caller.getElementById。如果document.getElementById返回null,则具有此ID的元素肯定不在文档中。这可能有两个原因:


您访问文档的时间太早,尚未完成加载。通常,您永远不要在load事件之前访问DOM,因为它可能导致各种问题。但是,如果您的代码是从TabOpen事件运行的,那么这应该不是问题。
当您的叠加层合并到浏览器窗口中时,将跳过此特定元素。如果叠加层顶层的元素没有ID或在文档中找不到ID,则将忽略它们。为了考虑您的元素,您的叠加层应如下所示:


<overlay ...>
  <window id="main-window">
    <vbox collapsed="true">
      <html:embed .../>
    </vbox>
  </window>
</overlay>


main-windowbrowser.xul根元素的ID,以便将元素插入顶层。请注意,我使用了collapsed attribute,如果您需要一个不占用任何空间但仍已初始化的元素,则比设置height样式要好。

07-24 17:57
查看更多