我们在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.‘),
//方法体..
//……
}
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);
{
return defaultValue;
}
{
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);
{
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);
}
{
this.remove(prefName);
}
{
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;
}
}
//则返回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);
},
{
return this.pref.getPrefType(prefName) != 0;
}
{
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");
var pref = new net.ff.pref();
pref.setValue("key","value");
//如果这个key的值获取不到则返回default value
pref.getValue("key","default value");
这样就很简单了,所以,当我们有小的变量需要保存的时候,没有必要再使用文件读写了,直接使用Pref去存储变量就可以了。这样也轻量了很多,更加可读和具有维护性了。
[...] Firefox Add-on – 使用Pref存储变量 [...]
博主,您的第三行代码有误
if(net.ff.pref) net.ff.pref = function(){};
应该是
if(!net.ff.pref) net.ff.pref = function(){};
if的判断条件出错