2012-05-26 49 views
2

我正在写一个Firefox插件,我试图用一个xul覆盖来插入一个画布元素。问题是,我想插入canvas元素的父xul节点没有id。如果没有身份证,可以这样做吗?我也尝试使用匿名元素来表示没有id的元素,正如你可以在下面看到的那样,但是也没有运气。如何覆盖没有ID的xul?

我的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> 

我想这样在每个选项卡每个浏览器元素后要插入的canvas元素:http://img.photobucket.com/albums/v215/thegooddale/80eae9ee.jpg

回答

1

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

但是,由于每次打开新选项卡时都会创建一个新的notificationbox,因此您应该为新选项卡提供JavaScript监视并相应地插入画布。

+0

很好的答案,+1。不过,我已经添加了更详细的答案 - 关于叠加层如何工作的误解太多。 –

2

有多种问题与使用覆盖这个尝试:

  1. 叠加不无标识工作,他们根本不具备另一种方式来解决的一个元素。
  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分配到十几元。

+0

非常感谢。我无法弄清楚为什么gBrowser.browsers在启动firefox时没有列出不同标签中的所有浏览器。我没有想过在“加载”窗口之后收听TabOpen事件。干杯。 – Yansky