2010-09-10 3 views
2

Этот пример от this Mozilla's page.Почему этот пример XBL не работает?

main.xul

<?xml version="1.0"?> 
<?xml-stylesheet href="chrome://global/skin/" type="text/css"?> 
<?xml-stylesheet href="main.css" type="text/css"?> 

<window xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"> 

    <box id="num" class="labeledbutton" title="Number of Things:" value="52"/> 

    <button label="Show" oncommand="document.getElementById('num').showTitle(true)"/> 
    <button label="Hide" oncommand="document.getElementById('num').showTitle(false)"/> 
</window> 

main.css

box.okcancelbuttons { 
    -moz-binding: url('main.xml#labeledbutton'); 
} 

main.xml

<?xml version="1.0"?> 
<binding id="labeledbutton"> 
    <content> 
    <xul:label xbl:inherits="value=title"/> 
    <xul:label xbl:inherits="value"/> 
    </content> 
    <implementation> 
    <method name="showTitle"> 
     <parameter name="state"/> 
     <body> 
     if (state) document.getAnonymousNodes(this)[0]. 
      setAttribute("style","visibility: visible"); 
     else document.getAnonymousNodes(this)[0]. 
      setAttribute("style","visibility: collapse"); 
     </body> 
    </method> 
    </implementation> 
</binding> 

Почему не показывает когда я нажимаю кнопку?

ответ

4

Есть несколько проблем:

Прежде всего в main.css вы определяете класс okcancelbuttons еще в main.xul вы ссылаетесь к labeledbutton класса. Класс можно назвать тем же, что и привязка.

Во-вторых, main.xml просто недействителен xml (самый простой способ проверить - загрузить его в firefox, и он выплюнет ошибки). Для каждого пространства имен ему нужны атрибуты xmlns. В этом случае «основное» пространство имен, xbl и xul. Они должны быть определены в отсутствующем элементе <bindings> вокруг элемента <binding>.

Это в конечном итоге, как это:

main.xml

<?xml version="1.0"?> 
<bindings xmlns="http://www.mozilla.org/xbl" 
      xmlns:xbl="http://www.mozilla.org/xbl" 
      xmlns:xul="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"> 
<binding id="labeledbutton"> 
    <content> 
    <xul:label xbl:inherits="value=title"/> 
    <xul:label xbl:inherits="value"/> 
    </content> 
    <implementation> 
    <method name="showTitle"> 
     <parameter name="state"/> 
     <body> 
     if (state) document.getAnonymousNodes(this)[0]. 
      setAttribute("style","visibility: visible"); 
     else document.getAnonymousNodes(this)[0]. 
      setAttribute("style","visibility: collapse"); 
     </body> 
    </method> 
    </implementation> 
</binding> 
</bindings> 
+0

Прохладный! Пример должен быть таким же. Благодаря! –

+0

@TomBrito, вы знаете, вы можете отредактировать его;) – batman

5

Просто попробуйте

XUL (main.xul)

<box id="num" class="labeledbutton" title="Number of Things:" value="52"/> 

<button label="Show" oncommand="document.getElementById('num').showTitle(true)"/> 
<button label="Hide" oncommand="document.getElementById('num').showTitle(false)"/> 

УС (main.css)

box.okcancelbuttons { 
    -moz-binding: url('main.xbl#labeledbutton'); 
} 

XBL (main.xbl)

<?xml version="1.0"?> 
<bindings xmlns="http://www.mozilla.org/xbl" 
      xmlns:xbl="http://www.mozilla.org/xbl" 
      xmlns:xul="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"> 
<binding id="labeledbutton"> 
    <content> 
    <xul:label xbl:inherits="value=title"/> 
    <xul:label xbl:inherits="value"/> 
    </content> 
    <implementation> 
    <method name="showTitle"> 
     <parameter name="state"/> 
     <body> 
     if (state) document.getAnonymousNodes(this)[0]. 
      setAttribute("style","visibility: visible"); 
     else document.getAnonymousNodes(this)[0]. 
      setAttribute("style","visibility: collapse"); 
     </body> 
    </method> 
    </implementation> 
</binding> 
</bindings>