Hack 69. Make New Tags and Widgets with XBL![]() ![]() XUL tags that browsers provide? Make new ones.The HTML and XHTML standards allow a content author to extend the set of composition elements on a web page by applying special styles to the <div> and <span> tags and their content. A styled <div> block might appear to be a navigation bar, an advertisement, or some other specialized content that HTML does not explicitly define. XML Binding Language (XBL) is an alternate strategy for naming features of web pages. This hack shows how you might use it.XBL is a Mozilla technology that's slowly being adopted by the W3C. It first appeared at the W3C as a technical note at http://www.w3.org/TR/2001/NOTE-xbl-20010223/. More recently, it has entered the formal standardization track via the sXBL standard (the s indicates that XBL's initial standard use is in SVG). That standard is here: http://www.w3.org/TR/sXBL. Mozilla XBL syntax is not yet the same as the W3C syntax, but the concepts are all the same. It will match the standard one day.In Firefox, XBL is used to create a new tag for any XML or HTML dialect, but most frequently for XUL. Public or strictly conforming HTML and XHTML documents should not be hacked with XBL. Use it for custom, private documents only. An XBL binding written in XML is attached to a tag using a Mozilla-specific CSS style: tagname { -moz-binding : url("binding-definition.xml"); }R> It's also possible to say the binding is bound to the tag, but the idea of attachment will get you into far less trouble. 6.13.1. Make a <sidebar> element for HTMLHTML and XHTML can achieve a lot when combined with CSS, but they don't contain any direct support for sidebars. Sidebars are blocks of text, usually floating on the right side of the screen, that contain information that's an aside to the main flow of the text. Let's make a <sidebar> tag using XBL. Here's an HTML equivalent, to begin with: <div style="float : right; background-color : lightyellow;">R> Using XBL, we extract the structural content into a file named sidebar.xml: <?xml version="1.0"?>The <content> part matches the XHTML content, with a few namespaces thrown in. Note the use of XBL's special inherits attribute and <children> tag mixed into the XHTML. The <resources> section is optional. In this case, /image/library/english/10055_sidebar.css might contain the following styles: .sidebar-title { font-weight : bold; }These styles affect the tags inside the content part of the binding. These tags can't be styled from HTML. To attach this binding, HTML pages must include extra styles. These styles affect the whole binding. The following file, bind-/image/library/english/10055_sidebar.css, is an example of such a style: sidebar {R> The HTML or XHTML page must include this stylesheet with a <link> tag. Once the binding is created, a web page can reuse the structural content freely: <html>Figure 6-12 shows this HTML page after the bound <sidebar> tags are rendered. Figure 6-12. HTML page with <sidebar> tags derived from XBL![]() 6.13.2. Make a Custom XUL WidgetA more typical use of XBL is to increase the set of widgets that XUL offers. XUL's default widget set is defined in a file called xul.css in the chrome. You can increase the set of widgets by using any stylesheet, or you can hack that file directly [Hack #75] . Figure 6-13 shows an example of a simple new widget called checkbutton. Figure 6-13. XUL window showing XBL checkbutton widget![]() off. The checkbutton widget is hooked up to the <checkbutton> tag using CSS, the same as in the HTML case: checkbutton { -moz-binding : url("checkbutton.xml#checkbutton"); }There are no extra styles in this case. XUL relies on the <?xml-stylesheet?> processing instruction to load CSS. The widget has the focus (the dotted line), because it's already been clicked a few times. The tag used to create this example is simply this: <checkbutton label="Click me to toggle check state" checked="true"/>Unlike text, widgets are active and responsive, so the checkbutton XBL binding has more object-like features than the sidebar example. Here's the binding definition: <?xml version="1.0"?>R> The <implementation> section can define fields, properties, and methods, mostly not illustrated in this example. The <handlers> section defines handlers, in this case, a single handler for the click DOM 2 event. This handler will fire if no handler is explicitly placed on the <checkbutton> tag.Here's a sample XUL document that benefits from this binding: <?xml version="1.0"?> |