読み込んでいます...

我们经常在开发过程中遇到这样一个场景,例如不同的语言执行不同的方法,例如如果是中文,就说“你好”,如果是英文就是“Greeting” ,我们通常会写如下伪代码。

//伪代码
if(语言==中文)
{
    说“你好”
}
else if(语言==英语)
{
    说
"Greeting"
}

这样是可行的,但是如果语言多了,那是不是就要写很多代码呢,况且JS里面没有很好的委托的解决方案,不过JS倒也有另外一个特性,就是传递函数,然后用eval来执行,不过这个不太好看,也不方面维护,在做Firefox扩展开发的时候,我们可以利用Firefox的绑定的特性来实现这一效果。

首先我们还是写一个HelloWorld程序了,我们写XUL如下。

<?xml version="1.0"?>
<?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代码。

#mymenuitem
{
    -moz-binding
: url(‘chrome://{appname}/content/test1.xml#mytest1′) !important;
    color:red;
}

这里我们使用了Firefox里面的属性【-moz-binding】,告诉我们这个控件应该绑定哪个xml,并且绑定到哪个id上,怎么?不太理解,我们慢慢来。

首先我们再content下建立一个test1.xml,然后我们写下如下代码。

<?xml version="1.0"?>
<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,我们可以添加代码如下。

<binding id="mytest2" extends="chrome://global/content/bindings/menu.xml#menuitem">
    
<implementation>
    
<property name="para">
    
<getter>
            
<![CDATA[
              return "Blinding2 Success!";
            
]]>
    
</getter>
    
</property>

    <method name="BindingCSS">
        
<body>
            
<![CDATA[
                alert(this.para);
            
]]>
        
</body>
    
</method>
</binding>

这个时候我们只要修改CSS里面相应的ID的属性就可以更改绑定的事件了。代码可以从下面下载。

test.rar (33.71 kb)

444路过 5评论 Firefox Addon 阅读全文..
  1. 诡异的西红柿 @

    @Mingle
    运行Disk里面的一个xpi就行了。

  2. Mingle @

    我使用的FireFox 3.5.3,不知道如何运行您发布的程序?请指点。

  3. 诡异的西红柿 @

    @guest
    你说的是对的,dtd在多语言来说是非常简单容易的。

  4. guest @

    这个,据我肤浅的理解以为,firefox项目里通篇都用的是DTD定义的字符集实体,这个方法适用于更广泛的文档类型,比如html、xml、这些都可以很方便的显示出来不同的语言,而且最大的好处是方便管理。你觉得呢?

  5. 置顶的更新,文章汇总 : GuoJing's Blog | 用心对待每一行代码 @

    [...] Firefox Add-on – 通过CSS绑定及改变事件 [...]

:-D :-? 8) :cry: 8-O :lol: :-x :-| :?: :-P :oops: :roll: :( :) :-o :wink: more »