【问题标题】:How to overlay xul with no id?如何覆盖没有id的xul?
【发布时间】:2012-05-26 04:42:02
【问题描述】:

我正在编写一个 firefox 插件,并且我正在尝试使用 xul 覆盖来插入一个画布元素。问题是,我要插入画布元素的父 xul 节点没有 id。如果没有id可以吗?我还尝试将 anonid 用于没有 id 的元素,如下所示,但也没有运气。

我的 xul 叠加层:

<?xml version="1.0"?>
<overlay id="myOverlay" 
         xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
         xmlns:html="http://www.w3.org/1999/xhtml">

    <tabbrowser id="content">
        <tabbox anonid="tabbox">
            <tabpanels anonid="panelcontainer">
                <notificationbox>
                    <stack anonid="browserStack">
                        <html:canvas id="myCanvas" height="100%" />
                    </stack>
                </notificationbox>
            </tabpanels>
        </tabbox>
    </tabbrowser>

</overlay>

我希望在每个选项卡中的每个浏览器元素之后插入画布元素,如下所示:http://img.photobucket.com/albums/v215/thegooddale/80eae9ee.jpg

【问题讨论】:

    标签: firefox-addon xul


    【解决方案1】:

    尝试为此使用叠加层存在多个问题:

    1. 如果没有 ID,叠加层将无法工作,它们只是没有其他方法来处理元素。
    2. 叠加不能应用于加载窗口时不存在的内容 - 它们是一次性的,不能考虑稍后创建的动态元素。
    3. 覆盖不能应用于匿名元素(在 DOM Inspector 中显示为红色)。这些元素由 XBL 绑定注入,不属于 XUL 文档。

    您每次都必须使用 JavaScript 并“手动”注入您的画布。您可以使用TabOpen event 在打开选项卡时收到通知。这样的东西应该可以工作(未经测试的代码):

    // Always wait for the window to initialize first
    window.addEventListener("load", function()
    {
      function initTab(tab)
      {
        var browser = window.gBrowser.getBrowserForTab(tab);
        var canvas = document.createElementNS("http://www.w3.org/1999/xhtml",
                                              "canvas");
        canvas.setAttribute("anonid", "myCanvas");
        canvas.setAttribute("height", "100%");
        browser.parentNode.appendChild(canvas);
      }
    
      // Init all existing tabs first
      var tabs = window.gBrowser.tabs;
      for (var i = 0; i < tabs.length; i++)
        initTab(tabs[i]);
    
      // Listen to TabOpen to init any new tabs opened
      window.gBrowser.tabContainer.addEventListener("TabOpen", function(event)
      {
        initTab(event.target);
      }, false);
    }, false)
    

    请注意,此代码设置anonid 属性而不是id - ID 应该是唯一的,您不应将相同的 ID 分配给十几个元素。

    【讨论】:

    • 非常感谢。我不明白为什么 gBrowser.browsers 在启动 firefox 时没有在不同的选项卡中列出所有浏览器。我没有想过在窗口“加载”后监听 TabOpen 事件。干杯。
    【解决方案2】:

    如果没有 id,这将无法工作。您可以在 XUL 文档中插入一段 Javascript,使用 document.querySelector 在 XBL 绑定中查找 tabpanels,然后将动态创建的 canvas 附加到 id。

    但是,由于每次打开新标签时都会创建一个新的notificationbox,因此您应该让 JavaScript 监视新标签并相应地插入画布。

    【讨论】:

    • 好答案,+1。尽管如此,我还是添加了一个更详细的答案 - 关于叠加层的工作原理有太多误解。
    猜你喜欢
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    • 2011-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-10
    相关资源
    最近更新 更多