読み込んでいます...

我们在Firefox插件的开发过程中,经常会需要存储一些全局变量,比如作者的名字,地址,或者网站的超链接等等。这些都是一些很小的变量,如果每次都用文件去读写的话,不仅代码量变长,而且还非常的复杂,所以如果能定义一个全局变量就好了,这里我们就可以使用Firefox里面的XPCOM来进行全局变量的编写。

首先我们定义一个XPCOM变量,代码如下所示。

if(!net) var net ={};
if(!net.ff) net.ff ={};
if(!net.ff.pref) net.ff.pref = function(){};

//这里还是用面向对象的思想去写
net.ff.pref.prototype  =
{
    pref : Components.classes[
"@mozilla.org/preferences-service;1"].
    getService(Components.interfaces.nsIPrefService).
    getBranch(
extensions.testlib.),
        
//方法体..
        
//……
}

在定义了全局变量pref之后,我们就能够使用XPCOM提供给我们的方法去进行全局变量的申明和获取了,示例代码如下所示。 

//设置变量,如果prefName的值不存在
//
则返回defaultValue
getValue: function(prefName, defaultValue)
{
    
var prefType=this.pref.getPrefType(prefName);

    if (prefType==this.pref.PREF_INVALID)
    {
        
return defaultValue;
    }

    switch (prefType)
    {
        
case this.pref.PREF_STRING: return this.pref.getCharPref(prefName);
        
case this.pref.PREF_BOOL: return this.pref.getBoolPref(prefName);
        
case this.pref.PREF_INT: return this.pref.getIntPref(prefName);
    }
},

//设置键值
//
注意value一定要是string,boolean或者number变量
//
如果是object则使用toString()方法
setValue: function(prefName, value)
{
    
var prefType=typeof(value);

    switch (prefType)
    {
    
case "string":
    
case "boolean":
        
break;
    
case "number":
        
if (value % 1 != 0)
        {
            
throw new Error("Cannot set preference to non integral number");
        }
        
break;
    
default:
        
throw new Error("Cannot set preference with datatype: " + prefType);
    }

    if (this.exists(prefName) && prefType != typeof(this.getValue(prefName)))
    {
        
this.remove(prefName);
    }

    switch (prefType)
    {
        
case "string": this.pref.setCharPref(prefName, value); break;
        
case "boolean": this.pref.setBoolPref(prefName, value); break;
        
case "number": this.pref.setIntPref(prefName, Math.floor(value)); break;
    }
}

在执行设置和获取方法里面,还有一些判断的方法,包括是否存在这个全局变量和除去全局变量,这里我们还需要编写下面的代码。 

remove: function(prefName)
{
    
this.pref.deleteBranch(prefName);
},

exists: function(prefName)
{
    
return this.pref.getPrefType(prefName) != 0;
}

在编写完成后,我们的这个类net.ff.pref就能够使用了,而且也非常的方便,示例代码如下。 

//声明对象
var pref = new net.ff.pref();
pref.setValue(
"key","value");
//如果这个key的值获取不到则返回default value
pref.getValue("key","default value");

这样就很简单了,所以,当我们有小的变量需要保存的时候,没有必要再使用文件读写了,直接使用Pref去存储变量就可以了。这样也轻量了很多,更加可读和具有维护性了。

330路过 2评论 Firefox Addon 阅读全文..
  1. 置顶的更新,文章汇总 : GuoJing's Blog | 用心对待每一行代码 @

    [...] Firefox Add-on – 使用Pref存储变量 [...]

  2. sygougou @

    博主,您的第三行代码有误

    if(net.ff.pref) net.ff.pref = function(){};

    应该是
    if(!net.ff.pref) net.ff.pref = function(){};

    if的判断条件出错

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