直播中
5.2.6 在客戶端上創(chuàng)建對象實例
在ASP中討論在服務(wù)器上實例化對象和組件的技術(shù)時,值得強調(diào)的是在瀏覽器中運行客戶端頁面而完成同樣工作的方式。如果你使用ASP創(chuàng)建包含客戶端腳本程序的頁面,或者使用<OBJECT>元素創(chuàng)建客戶端組件實例,將會發(fā)現(xiàn)這是非常有用的。在大多數(shù)情況下,腳本運行期對象可在客戶端上實例化和使用,效果與服務(wù)器上的ASP相同。
1. VBScript CreateObject方法
在客戶端使用CreateObject時,在瀏覽器的環(huán)境內(nèi)創(chuàng)建組件或?qū)ο髮嵗?,它們與瀏覽器運行在相同的內(nèi)存空間里(即進程內(nèi)),除非實現(xiàn)的對象是帶有.exe擴展文件名的可執(zhí)行文件。
通常指定對象的ClassID,而不是使用ProgID字符串,這樣就不可能與其他安裝在客戶端的對象發(fā)生沖突。
<SCRIPT LANGUAGE=”VBScript”>
Dim objThis
Set objThis = CreateObject(“clsid:892D6DA7-E0F9-00105A42AF30”)
…
</SCRIPT>
當(dāng)然也可以使用ProgID,并且使用通用的對象或組件(特別是標(biāo)準(zhǔn)安裝提供的對象或組件),那么得到錯誤的組件的風(fēng)險是很小的:
<SCRIPT LANGUAGE=”VBScript”>
Dim objThis
Set objThis = CreateObject(“Scripting.Dictionary”)
…
</SCRIPT>
2. Jscript ActiveXObject方法
為了在客戶端上實例化Jscript的對象和組件,必須使用ActiveXObject方法和new操作符:
<SCRIPT LANGUAGE=”JScript”>
var objMyData = new ActiveXObject(‘clsid: 892D6DA7-E0F9-00105A42AF30’);
</SCRIPT>
或:
<SCRIPT LANGUAGE=”JScript”>
var objMyData = new ActiveXObject(‘this.object’);
</SCRIPT>
3. <OBJECT>元素技術(shù)
也可使用<OBJECT>元素創(chuàng)建客戶端對象或組件的實例。應(yīng)省略RUNAT屬性或者將其設(shè)定為“CLIENT”。然而,這個屬性在客戶端上是被忽略的,因此設(shè)置這個屬性的唯一目的就是,在ASP頁面使用<OBJECT>元素實例化服務(wù)器端的組件實例時防止混淆。
<OBJECT ID=”objThis” RUNAT=”CLIENT”
CLASSID=”clsid: 892D6DA7-E0F9-00105A42AF30”
CODEBASE=”http://yourserver.com/components/mycomponent.cab”>
<PARAM NAME=”param1” VALUE=”value1”>
<PARAM NAME=”param2” VALUE=”value2”>
</OBJECT>
注意,這里出現(xiàn)的CODEBASE屬性,表示允許下載并安裝來自URL的組件(如果該組件沒有安裝)。IE 3.0以上的版本有此功能。
對于使用<OBJECT>元素的方法、可使用的屬性、在客戶端使用的值,可查看網(wǎng)站http://msdn.Microsoft.com/workshop/author/dhtml/reference/objects/OBJECT.asp,或者Windows 2000 Platform SDK文檔中的<OBJECT> tags,或者看看《IE5 Dynamic HTML Programmer’ Reference》一書,ISBN 1-861001-74-6,Wrox出版社。
5.3 Scripting.Dictionary對象
許多Microsoft的編程語言,如Visual Basic、VBScript和Jscript,都提供集合(collection)??梢园鸭舷胂鬄閿?shù)組,可以使用其中內(nèi)建的函數(shù)完成存儲和操縱數(shù)據(jù)等基本任務(wù)。無須擔(dān)心數(shù)據(jù)是在哪些行列,而是使用唯一的鍵進行訪問。
VBScript和Jscript都提供類似的對象,通稱Scripting.Dictionary對象或Dictionary對象。它類似于二維數(shù)組,把鍵和相關(guān)條目的數(shù)據(jù)存放在一起。然而真正的面向?qū)ο蟮姆椒?,不?yīng)直接訪問數(shù)據(jù)條目,必須使用Dictionary對象支持的方法和屬性來實現(xiàn)。
本章提供了一些示例頁面,允許試驗?zāi)_本運行期對象的方法和屬性。這些實例在下載的文件的文件的Chaper05子目錄里。
5.3.1 創(chuàng)建和使用Dictionary對象
創(chuàng)建一個Dictionary對象的示例如下:
‘In VBScript:
Dim objMyData
Set objMyData = Server.CreateObject(“Scripting.Dictionary”)
//In Jscript:
var objMyData = Server.CreateObject(‘Scripting.Dictionary’);
<!-- Server-Side with an OBJECT element -->
<OBJECT RUNAT=”SERVER” SCOPE=”PAGE” ID=”objMyData”
PROGID=”Scripting.Dictionary”>
</OBJECT>
Dictionary對象還可用于客戶端的IE中。
1. Dictionary對象的成員概要
表5-2和表5-3列出了Dictionary對象的屬性和方法及相應(yīng)的說明。
當(dāng)增加一個鍵/條目對時,如果該鍵已存在;或者刪除一個鍵/條目對時,該關(guān)鍵字/條目對不存在,或改變已包含數(shù)據(jù)的Dictionary對象的CompareMode,都將產(chǎn)生錯誤。
表5-2 Dictionary對象的屬性和說明
屬 性 說 明
CompareMode (僅用于VBScript)設(shè)定或返回鍵的字符串比較模式
Count 只讀。返回Dictionary里的鍵/條目對的數(shù)量
Item(key) 設(shè)定或返回指定的鍵的條目值
Key(key) 設(shè)定鍵值
表5-3 Dictionary對象的方法和說明
方 法 說 明
Add(key,item) 增加鍵/條目對到Dictionary
Exists(key) 如果指定的鍵存在,返回True,否則返回False
Items() 返回一個包含Dictionary對象中所有條目的數(shù)組
Keys() 返回一個包含Dictionary對象中所有鍵的數(shù)組
Remove(key) 刪除一個指定的鍵/條目對
RemoveAll() 刪除全部鍵/條目對
2. 對Dictionary中增加和刪除條目
一旦得到一個新的(空的)Dictionary,可以對其添加條目,從中獲取條目以及刪除條目:
‘ In VBScript:
objMyData.Add “MyKey”, “MyItem” ‘Add Value MyItem with key MyKey
objMyData.Add “YourKey”, ”YourItem” ‘Add value YourItem with key YourKey
blnIsThere = objMyData.Exists(“MyKey”) ‘Returns True because the item exists
strItem = objMyData.Item(“YourKey”) ‘Retrieve value of YourKey
strItem = objMyData.Remove(“MyKey”) ‘Retrieve and remove YourKey
objMyData.RemoveAll ‘Remove all the items
在JScript中,等價的代碼為:
// In JScript;
objMyData.Add (‘MyKey’, ‘MyItem’); //Add Value MyItem with key MyKey
objMyData.Add (‘YourKey’, ‘YourItem’); //Add value YourItem with key YourKey
var blnIsThere = objMyData.Exists(‘MyKey’); //Returns True because the item exists
var strItem = objMyData.Item(‘YourKey’); //Retrieve value of YourKey
var strItem = objMyData.Remove(‘MyKey’); //Retrieve and remove YourKey
objMyData.RemoveAll(); //Remove all the items
3. 修改鍵或條目的值
可以通過修改鍵的值,或通過修改與特定的鍵關(guān)聯(lián)的條目的數(shù)據(jù),來改變存儲在Dictionary內(nèi)的數(shù)據(jù)。下面的代碼改變鍵為MyKey的條目中的數(shù)據(jù)。
ObjMyData.Item(“MyKey”) = “NewValue” ‘ In VBScript
ObjMyData.Item(‘MyKey’) = ‘NewValue’; // In JScript
如果指定的鍵在Dictionary未找到,將在Dictionary中創(chuàng)建一個以MyKey為鍵,以New Value為其條目值的新的鍵/條目對。有意思的是,如果使用一個不存在的鍵來檢索條目,不僅得到一個空的字符串(這是可以想到的),而且還在Dictionary里添加一個新的鍵/條目對,鍵即是指定的鍵,但條目的數(shù)據(jù)為空。
可以使用Key屬性僅改變鍵的值而不改變與之對應(yīng)的條目的數(shù)據(jù)。將一個已存在的鍵MyKey改變?yōu)镸yNewKey,可以用:
objMyData.Key(“MyKey”) = “MyNewValue” ‘ In VBScript
objMyData.Item(‘MyKey’) = ‘MyNewValue’; // In JScript
如果指定的鍵未找到,則產(chǎn)生運行期錯誤。
4. 設(shè)置比較模式
Dictionary的CompareMode屬性僅適用于VBScript,不能在JScript中使用。當(dāng)比較字符串鍵時,允許指定比較的方式。兩個允許的值為BinaryCompare(0)和TextCompare(1)。BinaryCompare(0)為二進制數(shù)對照(即區(qū)分大小寫);TextCompare(1)為文本對照(即不區(qū)分大小寫)。
5. 遍歷Dictionary
研究Dictionary時,有兩個方法和一個屬性需要特別注意,它們允許我們遍歷存儲在Dictionary里的所有鍵/條目對。Items方法用一個一維數(shù)組的形式返回Dictionary里所有的條目數(shù)據(jù),而keys方法用一個一維數(shù)組返回所有已存在的鍵值??梢允褂肅ount屬性得到鍵或條目的數(shù)量。
例如,可以使用下列代碼得到名稱為objMyData的Dictionary中所有的鍵和條目值。注意,雖然Count屬性保存了在Dictionary里的鍵/條目數(shù)量,但VBScript和JScript的數(shù)組總是從下標(biāo)0開始的。因此,數(shù)組下標(biāo)應(yīng)從0到Count-1。
‘In VBScript:
arrKeys = objMyData.Keys ‘Get all the keys into an array
arrItems = objMyData.Items ‘Get all the items into an array
For intLoop = 0 To objMyData.Count –1 ‘Iterate through the array
StrThisKey = arrKeys(intLoop) ‘This is the key value
StrThisItem = arrItems(intLoop) ‘This is the item (data) value
Next
// In JScript
// Get VB-style arrays using the Keys() and Items() methods
var arrKeys = new VBArray(objMyData.Keys()).toArray();
var arrItems = new VBArray(objMyData.Items()).toArray();
for (intLoop = 0; intLoop < objMyData.Count; intLoop++) {
// Iterate through the arrays
strThisKey = arrKeys[intLoop]; // This is the key value
strThisItem = arrItems[intLoop]; // This is the item (data) value
}
在VBScript里也可以使用For Each … Next語句完成同樣的功能:
‘ Iterate the dictionary as a collection in VBScript
For Each objItem in arrItems
Response.Write objItem & “ = “ & arrItems(objItem) & “<BR>”
Next