这一章内容较多,故分三篇:XUL简介、XUL中可用的窗体部件、其他XUL功能。
在学习如何开发扩展之前,我们来了解XUL,基于XML的用户接口语言,XUL是扩展的基本组成之一。
XUL是一种基于XML的语言,是为mozilla浏览器的GUI标记语言而开发的。结合HTML和脚本语言去开发用户界面的早期实验经历了很长一个过程,可以认为XUL是这个过程的演化结果。用在windows vista中的XAML也经历了相似的过程,在adobe flash中使用的FLEX也一样。与显示平台无关的网页相似,用XUL标记的应用程序在任何运行了Firefox的环境中都能够同样的运行。
由于HTML原本是作为一种标记文档、指定网页的语言,它不可避免的缺少用于标记应用程序的功能。然而,XUL则是在已经成熟的标记语言的基础上用于描述用户界面的语言,插入带有复杂特性的UI组件是可能的,并且只需要写一下标签而不需要任何特殊的脚本。
与那些由W3C这样的标准化组织标准化的正式技术规范的语言不同,XUL当前还没有一个明确的技术规范。最新的XUL技术规范请参见MDC上的XUL参考手册以及mozilla wiki上的XUL页面。
本章中解释的每一个元素,都有一个带有源代码的例子。你可以你可以输入这些例子并在Firefox中打开它们来看看它们有什么样的行为及是怎样展现的。
XUL似乎是mozilla应用程序(如Firefox、thunderbird以及它们的扩展)中专有的,但是其他基于gecko引擎的网页浏览器、甚至基于网页的内容也有使用XUL的。例如,有一个辅助在amazon上购物的Mozilla Amazon Browser,以及用来编写并显示幻灯片的工具Presentation Method in XUL。
要试验本章中的示例代码,将它们保存为.xul为后缀的文件并将其拖到Firefox浏览器窗口中即可。(译注:Firefox较高版本不支持这种方式,要这样测试可用使用早期版本的Firefox。如firefox3.6).
如果我们想要Firefox运行的过程中不显示任何Firefox本身的GUI而只显示某个XUL文件的内容,我们可用运行Firefox并设置选项-chrome file_URL.XUL。
另一种方法,如清单1所示,使用window.openDialog()方法,这只能用在XUL窗口中。这是用于扩展来打开独立窗口的。
清单1:打开一个没有Firefox固有GUI的Firefox窗口
window.openDialog('another.xul', '_blank','chrome,all,dialog=no');
清单2展示了一个由XUL(一个XUL文档)标记定义GUI的文件例子。在XUL中,根元素一般是window元素。其名字空间是:
http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul
如果字符编码是UTF-8,编码的指定和XML声明都可以省略。但是本章中的例子都将它们包含进来了。
因为一个XUL文档也是一个XML文档,它可以包含XHTML,SVG、MathML,以及其他元素;如果你使用外部的实体参考,XML文档的内容都是模块化的;联合使用其他与XML相关的技术如DOM,XLink,或XSLT,你可以在很多不同的应用程序中使用它。
清单2:XUL文档的一般结构
<?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet href="chrome://global/skin/"?> <window xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"> <!-- Contents go here. --> </window>
XUL使用CSS来指定其原始的外观。因为XUL也是一种XML,读入样式表使用xml-stylesheet处理指令。
在清单2的第二行,我们在读入主题的标准样式表。通过chrome://global/skin/指向一个特殊的样式表,我们就可以使标签和按钮尺寸,窗口背景色等等与当前Firefox选择的主题相匹配。我们也可以读入一个我们自己设置的样式表。
原则上,XUL联合使用两类box:水平box和垂直box,对所有的UI组件进行布局。如清单3所示,可以使用hbox来将元素水平的布局,也可以使用vbox来将元素进行垂直的布局。当这个文件在Firefox中打开的时候,显示如图1所示。
清单3:水平和竖直box
<label value="Horizontal layout"/> <hbox> <button label="horizontal1"/> <button label="horizontal2"/> </hbox> <label value="Vertical layout"/> <vbox> <button label="vertical1"/> <button label="vertical2"/> </vbox> <label value="mixed"/> <hbox> <button label="mixed1"/> <vbox> <button label="mixed2"/> <button label="mixed3"/> </vbox> <button label="mixed4"/> </hbox>
在看各种接口对象之前,我们来看看他们中的一些共同属性,特别是那些经常使用的属性。
Id和class
属性id和 class与XHTML中的功能相同。id是用来定义一个元素的唯一标识名称的,class是用来为元素分类的;这两个都为CSS和javascript提供了引用元素的方便的途径。也有特殊类型的元素只在别的元素引用的时候才会显示出来。
orient
一个box中的内容是竖直还是水平排列的取决于这些元素的初始状态。你可以使用orient属性来设置或者改变这一布局方式,orient的选项是horizontal和vertical。
align和pack
align和pack属性都是指定box中元素布局的。他们的值可以是start(上边或者左边),center,end(下边或右边),或者stretch(将元素扩展到最大以匹配其所在的元素)。
align属性定义为与orient属性相垂直的方向,而pack属性与orient属性的操作方向一致。图2展示了分别为两个元素设置align="center" pack="start"的时候结果的不同。
清单4:align与pack与orient的关系
<box flex="1" align="end" pack="end"> <button label="Happy"/> <button label="Sad"/> </box>
<hbox> <label value="label1" flex="1" style="border: 1px solid;"/> <label value="label2" flex="2" style="border: 1px solid;"/> </hbox>
<vbox> <button label="button1" ordinal="3"/> <button label="button2" ordinal="2"/> <button label="button3" ordinal="1"/> </vbox>
<button label="Button" width="200" height="100"/>
<button label="Button" style="min-width: 10em;"/>