1

我正在尝试访问 XBL 绑定的 XUL 元素。我想从javascript控制它。

这是绑定。

<binding id="imip-throbber">
    <resources>
          <stylesheet src="chrome://lightning/skin/lightning-widgets.css"/>
    </resources>
    <content pack="center" align="center">
        <xul:image anonid="loading-throbber" src="chrome://global/skin/icons/loading_16.png" hidden="false"/>
    </content>
</binding>

这是 CSS 绑定

imip-throbber {
  -moz-binding: url(chrome://lightning/content/lightning-widgets.xml#imip-throbber);
}

这是 xul 的实现

<

lightning-notification-bar id="imip-bar"
                                    collapsed="true"
                                    insertbefore="msgHeaderView"
                                    label="&lightning.imipbar.description;">

          <button id="imip-button1"
                  class="imip-button"
                  hidden="true"/>
          <button id="imip-button2"
                  class="imip-button"
                  hidden="true"/>
          <button id="imip-button3"
                  class="imip-button"
                  hidden="true"/>

    <imip-throbber id="loading-lbl">
</lightning-notification-bar>

这是javascript访问

let imipThrobble = document.getElementById("loading-lbl");

该javascript行下方的代码似乎没有被执行。我是否需要在绑定中添加一些内容才能访问该元素?

4

1 回答 1

0

不能轻易...

MDN 上的XBL 文档说明了 XBL自动添加的“匿名”内容:

[XBL 绑定 xml 文件的]内容标记内的元素被匿名添加到滚动条中。尽管匿名内容显示在屏幕上,但您无法以 正常方式通过脚本访问它。对 XUL 来说,就好像只有一个元素,尽管它实际上是由许多元素组成的。

(强调我的)。

任何状况之下...

MDN 上的 XBL 1.0 参考继续说

实际上,匿名内容存在于文档中它自己的绝缘口袋中。使用 parentNode,匿名内容节点可以引用它们的显式父节点,但显式父节点不知道它们的匿名子节点。匿名内容不能通过绑定元素的 childNodes 列表访问,也不能使用 firstChild/nextSibling 迭代绑定元素的子元素。匿名内容只能通过getAnonymousNodesgetAnonymousElementByAttribute等特殊方法访问。

因此,您可以使用getAnonymousNodes/getAnonymousElementByAttribute来获取由 XBL 绑定自动插入的匿名内容。这些方法主要由绑定本身(或与之相关)的 JavaScript 代码使用,但是,您可以在绑定到 XUL DOM 的 JavaScript 中使用它们。MDN 上的一些例子

但为什么?

一个更好的问题是,为什么要从绑定到 XUL DOM 的 JavaScript 访问这些元素?

一个很好的理由可能是您没有编写绑定并且您希望使用一些不同的内容/行为即时“升级”它们。另一方面,如果您确实编写了有问题的 XBL 绑定,为什么不在绑定到 XBL 元素的 JavaScript 中完成您想要做的事情呢?您可以将 JavaScript方法添加到已经可以访问匿名内容的元素(以及 XUL DOM 的其余部分)。

于 2014-05-03T07:00:14.683 回答