読み込んでいます...

在上一节中我们了解了一下XUL和Firefox插件的UI的编写方法,熟悉XUL插件的UI的编写方法还不够我们编写一个多语言和可扩展的插件。在编写插件之前,肯定有很多疑问,最最基础的原因还是因为对Firefox插件的不了解,所以现在我们先看Firefox插件项目中的组成结构。对于组成结构,我画了下面这个图。

在上图中,我勾勒了3个文件,这三个文件彼此对应展现一个扩展或者窗口,其他的文件也基本上和这个结构相同,这个结构包括有:

  • overlay.xul:主窗体界面,UI,也是我们的XUL代码编写的位置,主要用于UI的呈现。
  • overlay.js:主窗体的js代码,主要用javascript编写事件的响应。
  • overlay.dtd:多语言包,主要在local文件夹下。

当然,这个结构还应该算上在skin文件夹下的overlay.css,用于样式控制。

在我们了解了一个扩展或者窗体的基本结构后,我们就可以发现其实扩展的开发和HTML网页的制作没有什么很大的区别(当然区别还是很大的,主要在解释和引擎上,而在思路上是没有很大的区别的),XUL文档可以看作是HTML文档,而js文档可以看作是HTML后面的js文档,而css我就不用多说了,样式布局,在Firefox的扩展中同样可以使用css进行样式控制。我们看一下overlay.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”>
<script src=”overlay.js”/>
<script src=”setLocal.js”/>
<script src=”io.js”/>
//……
</overlay>

从上面的代码我们可以看到,overlay.xul文档和XML文档很相似,但是也和HTML文档很相似,首先,上面3行代码的申明是必须的,比如我们指定了css文件,指定了dtd语言包。在overlay标签中(相当于body标签),我们可以编写XUL代码(前面的我们讲过),然后就会在浏览器中呈现,在主要的标签内,我们可以申明我们想要使用的js文件,例如这里我使用了overlay.js,selLocal.js等js文件。

值得注意的是,在扩展加载的时候,默认情况下并不会加载一些方法,在HTML有onload方法,虽然Firefox的扩展也支持,但是在默认情况下是不支持的,我们必须添加以下代码让扩展在加载时支持我们需要的方法。

<script type=”application/x-javascript”>
window.addEventListener(
load, 方法名称, false);
</script>

注意这里的type必须是application/x-javascript,虽然这样,但是Firefox同样支持标砖的javascript,所以很多标准的javascript方法都可以直接拿过来用。

现在我们再看dtd文件,dtd文件是语言包文件,我们可以定义一个字符串(键值对应的字符串),然后使用,例如如下代码。

<!ENTITY {appname} “{appdisplayname}”>

当我们在overlay中调用的时候,我们可以直接使用{appname}调用我们值{appdisplayname}。当然,这是一个系统自动生成的,如果我们需要自定义的话,可以按照这个方法自定义语言,代码如下。

<!ENTITY title.label {appdisplayname}>
<!ENTITY separate.label This is a A Mozilla/Firefox/Thunderbird Addon example!>
<!ENTITY close.label Close>

当我们需要使用的时候,我们可以按照&close.label;的方法来使用,只要在相应的XUL代码中嵌入这个字符串,在运行的时候就能够显示相应的字符,这在多语言上面是非常好的,因为我们可以直接选择浏览器的语言,扩展的语言也会相应的更改。例如上面代码要适应中文化,我们也可以写成。

<!ENTITY title.label “{appdisplayname}”>
<!ENTITY separate.label “这是一个例子”>
<!ENTITY close.label “关闭”>

在扩展的开发中,还有js文件和css文件,其编写方法和普通的没什么区别,例如js文件可以写成这样。

var setLocal={
local:
null,
pathJson:
“”,
ext:
null,
setLocals:
function(localname)
{
//…..
},
}

在使用的时候我们直接使用setLocal.方法名称(或变量名称)即可访问方法和变量,和普通的没什么区别,css也是一样,这里我就不做演示了。但是值得注意的是,css并不是所有的都会支持,当然解析是没有问题的,但是例如背景颜色,在按钮的情况下是不支持的,在窗口的情况下是支持的。而同样image属性,因为按钮有image属性,所以css的image属性很多情况下也不会起作用。

在netbean里面开发扩展,有一个好处就是能够自动的创建开发项目,而不太好的地方就是debug非常不好,而且netbean还有很多bug,而Firefox开发的过程中,如果有错误,是不会提示错误也不会有任何显示的,如果UI制作错误,根本就不会显示,这个时候找错误就非常难了,所以在开发过程中,尽量保证开发的代码是很可读的而且很好辨认的(例如缩进什么的),这样就方便了我们的开发以及debug。

  1. 阿祠 @

    看了一下,有两个问题
    overlay.xul应该是xml格式吧
    <!DOCTYPE overlay SYSTEM "chrome://{appname}/locale/overlay.dtd">
    这里chrome是?

  2. 诡异的西红柿 @

    overlay.xul是按照XML格式呈现的,但是其实也不是XML格式,算是XML和HTML的混合体。
    另外,chrome并不是Google浏览器的名字,是FF的一种约定,只是重名了罢了。

  3. 农民李威 @

    别搞这些专业的。多发点你拍的PP上来。

  4. 诡异的西红柿 @

    [q]别搞这些专业的。多发点你拍的PP上来。[/q]
    呵呵,劳逸结合嘛。。

  5. dlfen @

    “果然是天才” “…” 我在压迫中茁壮成长!

  6. 诡异的西红柿 @

    [q]“果然是天才” “…” 我在压迫中茁壮成长![/q]
    像谁强迫你了一样。。:)

  7. 阿祠 @

    发现一个问题,js没这么强悍吧。。
    搞得比程序语言还厉害

  8. 诡异的西红柿 @

    [q]发现一个问题,js没这么强悍吧。。搞得比程序语言还厉害[/q]
    js是很强悍的。。。虽然我不会用,但是我知道,不过现在慢慢的会用了。。呵呵

  9. Gooder @

    写的很好啊。。看看。。

  10. learner-zin @

    我最近也在看这个,学习了

  11. learner-zin @

    不错的东西,希望继续写下去。

  12. Meta @

    Up..up..

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

    [...] Firefox Add-on – 插件组成结构 [...]

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