我们经常在开发过程中遇到这样一个场景,例如不同的语言执行不同的方法,例如如果是中文,就说“你好”,如果是英文就是“Greeting” ,我们通常会写如下伪代码。
if(语言==中文)
{
说“你好”
}
else if(语言==英语)
{
说"Greeting"
}
这样是可行的,但是如果语言多了,那是不是就要写很多代码呢,况且JS里面没有很好的委托的解决方案,不过JS倒也有另外一个特性,就是传递函数,然后用eval来执行,不过这个不太好看,也不方面维护,在做Firefox扩展开发的时候,我们可以利用Firefox的绑定的特性来实现这一效果。
首先我们还是写一个HelloWorld程序了,我们写XUL如下。
<?xml-stylesheet href="chrome://{appname}/skin/overlay.css" type="text/css"?>
<!DOCTYPE overlay SYSTEM "chrome://{appname}/locale/overlay.dtd">
<overlay id="{appname}-overlay"
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
<!– firefox –>
<menupopup id="menu_ToolsPopup">
<menuitem id="mymenuitem" label="Hello"
oncommand="this.BindingCSS()"/>
</menupopup> </overlay>
这里我们创建了一个menuitem,并且说了当有命令的时候执行BindingCSS方法,可是在这里我们没有使用任何的JS文件啊,那这个方法写在哪里呢又为什么可以调用了呢。我们慢慢来。我们可以看到这个方法名字叫BindingCSS,这也就是我要告诉大家,Firefox可以绑定CSS特性来修改相应的事件。我们可以看相应的CSS代码。
{
-moz-binding: url(‘chrome://{appname}/content/test1.xml#mytest1′) !important;
color:red;
}
这里我们使用了Firefox里面的属性【-moz-binding】,告诉我们这个控件应该绑定哪个xml,并且绑定到哪个id上,怎么?不太理解,我们慢慢来。
首先我们再content下建立一个test1.xml,然后我们写下如下代码。
<bindings id="test"
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">
<binding id="mytest1" extends="chrome://global/content/bindings/menu.xml#menuitem">
<implementation>
<property name="para">
<getter>
<![CDATA[
return "Blinding1 Success!";
]]>
</getter>
</property>
<method name="BindingCSS">
<body>
<![CDATA[
alert(this.para);
]]>
</body>
</method>
</binding>
</bindings>
现在到了重难点了,我们首先看一下这个XML,首先需要一个根节点bindings,id在这里可以随便取,没有问题,后面是一些命名空间了,直接照抄就可以了。
然后我们继续往下走,可以看到binding节点,嗯,我们可以看到这个id,是不是很熟悉,正确,这个地方就是我们要绑定的内容,前面我们写了test1.xml#mytest1就是说明当前控件绑定的是这个节点一下的东西。然后看属性,有一个extends属性,这个属性说明的是继承自Firefox的哪个控件,例如我这里就是menu里面的menuitem(这里也是#id的哦),如果你不知道如何看id,看这篇文章,用这个工具去找相应的控件。
然后我们继续看下面,下面就豁然开朗了,这里有属性(property),方法(method),代码就很简单了,我这里就不详细讲解了。于是,我们就给我们的一个XUL控件绑定了一个事件,是不是很神奇?当然,这里不只有属性,方法,还能写字段(field)和结构或者说类(constructor)。
OK,如果你上面的还没消化好,建议你好好消化,消化好了,我们就可以看如何修改CSS修改事件了。其实也不难,因为既然是通过CSS绑定的,我们只要修改一下控件的ID不就完了吗?对,聪明,我们可以绑定mytest2,我们可以添加代码如下。
<implementation>
<property name="para">
<getter>
<![CDATA[
return "Blinding2 Success!";
]]>
</getter>
</property>
<method name="BindingCSS">
<body>
<![CDATA[
alert(this.para);
]]>
</body>
</method>
</binding>
这个时候我们只要修改CSS里面相应的ID的属性就可以更改绑定的事件了。代码可以从下面下载。
@Mingle
运行Disk里面的一个xpi就行了。
我使用的FireFox 3.5.3,不知道如何运行您发布的程序?请指点。
@guest
你说的是对的,dtd在多语言来说是非常简单容易的。
这个,据我肤浅的理解以为,firefox项目里通篇都用的是DTD定义的字符集实体,这个方法适用于更广泛的文档类型,比如html、xml、这些都可以很方便的显示出来不同的语言,而且最大的好处是方便管理。你觉得呢?
[...] Firefox Add-on – 通过CSS绑定及改变事件 [...]