Mittels XBL können eigene XUL Tags erstellt werden. Codeteile die öfter in einer Applikation verwendet werden, können in einem XBL zusammengefasst werden und sorgen damit für übersichtlicheren und sauberen Code der nur an einer zentralen Stelle gewartet werden muss.
Vorteile
Nachteile
Das fertige Binding kann beispielsweise mit Hilfe einer Box eingefügt werden
myapp.xul
<box class="MyBinding" id="box-mybinding"/>
Damit das Binding gefunden wird, muss dieses im Stylesheet definiert werden
style.css
box.MyBinding { -moz-binding: url('mybinding.xml#MyBinding'); }
mybinding.xml
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <bindings xmlns="http://www.mozilla.org/xbl" xmlns:xul="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" xmlns:xbl="http://www.mozilla.org/xbl" xmlns:html="http://www.w3.org/1999/xhtml" > <binding id="MyBinding"> <content> <xul:vbox flex="1"> <xul:description>Mein Binding</xul:description> </xul:vbox> </content> <implementation> </implementation> </binding> </bindings>
<xul:textbox anonid="mytextbox" /> <xul:button onclick="document.getBindingParent(this).doSomething();" value="doSomething"/> <implementation> <method name="doSomething"> <body> <![CDATA[ var val = document.getAnonymousElementByAttribute(this ,'anonid', 'mytextbox'); alert(val); ]]> </body> </method> </implementation>
<property name="value"> <getter> try { netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect"); tree = document.getAnonymousElementByAttribute(this ,'anonid', 'mytree'); var col = tree.columns.getColumnFor(document.getAnonymousElementByAttribute(this ,'anonid', 'treecol-my_id')); return tree.view.getCellText(tree.currentIndex, col); } catch(e) { return false; } </getter> </property>
Bei der Verwendung von Observern wird oft eine Referenz auf das XBL benötigt. Diese kann so übergeben werden:
myTreeDatasource.addXMLSinkObserver({ mybinding: this, onBeginLoad: function(aSink) {}, onInterrupt: function(aSink) {}, onResume: function(aSink) {}, onEndLoad: function(aSink) { netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect"); var tree = document.getAnonymousElementByAttribute(this.mybinding ,'anonid', 'mytree'); tree.builder.rebuild(); }, onError: function(aSink, aStatus, aErrorMsg) { alert("error! " + aErrorMsg); } });
Bei der Verwendung von Callback Funktionen wird oft eine Referenz auf das XBL benötigt. Dies kann mit Hilfe von Closures gelöst werden:
function mycallb(obj) { var me=obj; this.invoke=function (respObj) { try { var id = respObj.Body[0].save[0].message[0].Text; } catch(e) { var fehler = respObj.Body[0].Fault[0].faultstring[0].Text; alert('Fehler: '+fehler); return; } me.RefreshTree(); } } var cb=new mycallb(this); SOAPClient.SendRequest(sr,cb.invoke);