IE支持初始化和执行ActiveX组件脚本来提供额外的功能;很多其它浏览器靠Java
applet增加其功能,基于Mozilla的浏览器现在可以通过使用跨平台组件对象模块(Cross Platform Component
Object Module,XPCOM)组件添加它们自己的功能。 XPCOM是一个框架,它允许对项目进行模块化设计,将整个开发划分为多个组件。组件然后在运行时期重新装配,创建出组件的克隆共同创建一个应用程序。 XPCOM 有点像微软的COM,但是它们的实现有点不同。微软的COM组件是注册在系统注册表中的,而XPCOM组件是通过Mozilla自己的注册表注册的。这个 信息存在于两个文件中:comreg.dat和xpti.dat。在comreg.dat中你会发现很多信息。 你没有必要知道XPCOM 技术的所有复杂的细节就能够获益于XPCOM。感谢XPCOM,你可以在JavaScript中使用XPCOM组件,并且还可以在JavaScript中 开发XPCOM组件。这样就向需要快速解决方案但又不想用C或者C++编写本地XPCOM组件的开发人员打开了创建XPCOM组件的大门。 nsDictionary对象 Mozilla 已经发行了能够使用JavaScript编写XPCOM组件的版本。里面其中一个是nsDictionary对象,它重新组装了IE中的ActiveX组 件Scripting.Dictionary。它暴露了下面的方法:hasKey()、getKeys()、getValue()、 setValue()、deleteValue()、and clear()。 hasKey()接受收一个字符串参数,返回一个Boolean值表示一个键是否存在。 getKeys()没有参数,返回键名的一个数组。 getValue()接受一个字符串参数,返回基于所传入的键的一个ISupports对象。 setValue()接受两个参数,key(string)和value(ISupports),创建一个key-value对。 deleteValue()接受一个字符串参数(key),从nsDictionary组件中删除一个key-value对。 clear()不带参数,清除nsDictionary组件的内容。 下面是实际使用nsDictionary的例子: <html> <head> <script language="JavaScript"> netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect"); var oDict = Components.classes['@mozilla.org/dictionary;1']. createInstance(Components.interfaces.nsIDictionary); function btnSetValue_onclick() { netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect"); try { var key = document.thisForm.txtKey.value; var cString = Components.classes['@mozilla.org/supports-cstring;1']. createInstance(Components.interfaces.nsISupportsCString); cString.data = document.thisForm.txtValue.value; oDict.setValue(key, cString); } catch(e) { alert(e); } } function btnGetValue_onclick() { netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect"); try { var iSupports = oDict.getValue(document.thisForm.txtKey.value); var cString = iSupports.QueryInterface(Components.interfaces.nsISupportsCString); document.thisForm.txtValue.value = cString.data; } catch(e) { alert(e); } } function btnDelValue_onclick() { netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect"); try { oDict.deleteValue(document.thisForm.txtKey.value); } catch(e) { alert(e); } } function btnGetKeys_onclick() { netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect"); try { var i = {}; var keys = oDict.getKeys(i).join(","); alert("Keys: {" + keys + "}\nLength: " + i.value); } catch(e) { alert(e); } } function btnClearAll_onclick() { netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect"); try { oDict.clear(); } catch(e) { alert(e); } } </script> </head> <body> This is a test. <form name="thisForm" id="thisForm"> Key: <input type="text" name="txtKey" id="txtKey" size=10><br> Value: <input type="text" name="txtValue" id="txtValue" size=25><br> <input type="button" value="Set Value" name="btnSetValue" onclick="btnSetValue_onclick()"> <input type="button" value="Get Value" name="btnGetValue" onclick="btnGetValue_onclick()"> <input type="button" value="Delete Value" name="btnDelValue" onclick="btnDelValue_onclick()"> <input type="button" value="Get Keys" name="btnGetKeys" onclick="btnGetKeys_onclick()"> <input type="button" value="Clear All" name="btnClearAll" onclick="btnClearAll_onclick()"><br> </form> </body> </html> 这 段代码看起来有点怪,尤其是如果你习惯于微软的代码,但是事实不是那样不可能。其实只是包含两个类型为“text”的<INPUT>标记的一 个简单HTML页面。有五个按钮显示nsDictionary对象不同的任务。用户在txtKey文本框中输入一个值,然后txtValue文本框中的值 就会创建一个key-value对。用户还能够在txtKey文本框中输入一个键名,然后提取存储在那个键中的值。 当页面进入时,脚本会 通过Privilege Manager询问使用XPConnect的权限。然后它使用内嵌的Components.classes集合在注册表中查询 “@mozilla.org/dictionary”Contract ID返回ISupports接口,从而设置oDict变量指向nsDictionary。相反,ISupports接口多多少少是用来返回 IDictionary接口的。 当用户按下Set Value按钮时,将会向Privilege Manager查询使用XPConnect的权限。(Privilege Mnager在每个方法调用中使用。)nsDictionary对象的setValue()方法带有两个参数:key(一个字符串值)和value(一个 ISupport对象)。所有组件都实现了ISupports接口。有一组用于指定数据类型数据的基于ISupports的组件。有一个特殊的接口 nsISupportsCString允许一个组件以一种通用类型存储和传递字符串数据。ISupportsXXX类型的集合暴露一个叫做“data”的 属性。ISupportsCString组件的一个实例被创建,然后其参数被设置。然后这又作为setValue()的第二个参数传入。 当用户按下Get Value按钮时,会从相应的键返回一个ISupports接口。ISupports接口然后查询ISupportsCString接口。在返回之后,data参数就用来设置txtValue文本框的值。 代 码的其它部分都是相当好的自说明,但是要注意的最主要的事就是XPCOM组件的实现。为了能使该例能够正常工作,你需要把这段代码在你的本地计算机上保存 为一个HTML文件。在Mozilla浏览器中,使用“file:///. . .”打开这个文件,Privilege Manager就会授权你的脚本使用XPConnect。其它的解决安全问题的方法是使用Netscape Signing Toole数字签名你的脚本。 |
|