|
IE支持初始化和執(zhí)行ActiveX組件腳本來(lái)提供額外的功能;很多其它瀏覽器靠Java
applet增加其功能,基于Mozilla的瀏覽器現(xiàn)在可以通過(guò)使用跨平臺(tái)組件對(duì)象模塊(Cross Platform Component
Object Module,XPCOM)組件添加它們自己的功能。 XPCOM是一個(gè)框架,它允許對(duì)項(xiàng)目進(jìn)行模塊化設(shè)計(jì),將整個(gè)開(kāi)發(fā)劃分為多個(gè)組件。組件然后在運(yùn)行時(shí)期重新裝配,創(chuàng)建出組件的克隆共同創(chuàng)建一個(gè)應(yīng)用程序。 XPCOM 有點(diǎn)像微軟的COM,但是它們的實(shí)現(xiàn)有點(diǎn)不同。微軟的COM組件是注冊(cè)在系統(tǒng)注冊(cè)表中的,而XPCOM組件是通過(guò)Mozilla自己的注冊(cè)表注冊(cè)的。這個(gè) 信息存在于兩個(gè)文件中:comreg.dat和xpti.dat。在comreg.dat中你會(huì)發(fā)現(xiàn)很多信息。 你沒(méi)有必要知道XPCOM 技術(shù)的所有復(fù)雜的細(xì)節(jié)就能夠獲益于XPCOM。感謝XPCOM,你可以在JavaScript中使用XPCOM組件,并且還可以在JavaScript中 開(kāi)發(fā)XPCOM組件。這樣就向需要快速解決方案但又不想用C或者C++編寫(xiě)本地XPCOM組件的開(kāi)發(fā)人員打開(kāi)了創(chuàng)建XPCOM組件的大門(mén)。 nsDictionary對(duì)象 Mozilla 已經(jīng)發(fā)行了能夠使用JavaScript編寫(xiě)XPCOM組件的版本。里面其中一個(gè)是nsDictionary對(duì)象,它重新組裝了IE中的ActiveX組 件Scripting.Dictionary。它暴露了下面的方法:hasKey()、getKeys()、getValue()、 setValue()、deleteValue()、and clear()。 hasKey()接受收一個(gè)字符串參數(shù),返回一個(gè)Boolean值表示一個(gè)鍵是否存在。 getKeys()沒(méi)有參數(shù),返回鍵名的一個(gè)數(shù)組。 getValue()接受一個(gè)字符串參數(shù),返回基于所傳入的鍵的一個(gè)ISupports對(duì)象。 setValue()接受兩個(gè)參數(shù),key(string)和value(ISupports),創(chuàng)建一個(gè)key-value對(duì)。 deleteValue()接受一個(gè)字符串參數(shù)(key),從nsDictionary組件中刪除一個(gè)key-value對(duì)。 clear()不帶參數(shù),清除nsDictionary組件的內(nèi)容。 下面是實(shí)際使用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> 這 段代碼看起來(lái)有點(diǎn)怪,尤其是如果你習(xí)慣于微軟的代碼,但是事實(shí)不是那樣不可能。其實(shí)只是包含兩個(gè)類型為“text”的<INPUT>標(biāo)記的一 個(gè)簡(jiǎn)單HTML頁(yè)面。有五個(gè)按鈕顯示nsDictionary對(duì)象不同的任務(wù)。用戶在txtKey文本框中輸入一個(gè)值,然后txtValue文本框中的值 就會(huì)創(chuàng)建一個(gè)key-value對(duì)。用戶還能夠在txtKey文本框中輸入一個(gè)鍵名,然后提取存儲(chǔ)在那個(gè)鍵中的值。 當(dāng)頁(yè)面進(jìn)入時(shí),腳本會(huì) 通過(guò)Privilege Manager詢問(wèn)使用XPConnect的權(quán)限。然后它使用內(nèi)嵌的Components.classes集合在注冊(cè)表中查詢 “@mozilla.org/dictionary”Contract ID返回ISupports接口,從而設(shè)置oDict變量指向nsDictionary。相反,ISupports接口多多少少是用來(lái)返回 IDictionary接口的。 當(dāng)用戶按下Set Value按鈕時(shí),將會(huì)向Privilege Manager查詢使用XPConnect的權(quán)限。(Privilege Mnager在每個(gè)方法調(diào)用中使用。)nsDictionary對(duì)象的setValue()方法帶有兩個(gè)參數(shù):key(一個(gè)字符串值)和value(一個(gè) ISupport對(duì)象)。所有組件都實(shí)現(xiàn)了ISupports接口。有一組用于指定數(shù)據(jù)類型數(shù)據(jù)的基于ISupports的組件。有一個(gè)特殊的接口 nsISupportsCString允許一個(gè)組件以一種通用類型存儲(chǔ)和傳遞字符串?dāng)?shù)據(jù)。ISupportsXXX類型的集合暴露一個(gè)叫做“data”的 屬性。ISupportsCString組件的一個(gè)實(shí)例被創(chuàng)建,然后其參數(shù)被設(shè)置。然后這又作為setValue()的第二個(gè)參數(shù)傳入。 當(dāng)用戶按下Get Value按鈕時(shí),會(huì)從相應(yīng)的鍵返回一個(gè)ISupports接口。ISupports接口然后查詢ISupportsCString接口。在返回之后,data參數(shù)就用來(lái)設(shè)置txtValue文本框的值。 代 碼的其它部分都是相當(dāng)好的自說(shuō)明,但是要注意的最主要的事就是XPCOM組件的實(shí)現(xiàn)。為了能使該例能夠正常工作,你需要把這段代碼在你的本地計(jì)算機(jī)上保存 為一個(gè)HTML文件。在Mozilla瀏覽器中,使用“file:///. . .”打開(kāi)這個(gè)文件,Privilege Manager就會(huì)授權(quán)你的腳本使用XPConnect。其它的解決安全問(wèn)題的方法是使用Netscape Signing Toole數(shù)字簽名你的腳本。 |
|
|
來(lái)自: xiaoqdu > 《開(kāi)發(fā)資料》