《VBScript制作實(shí)例》筆記
2024-07-21 02:15:57
供稿:網(wǎng)友
 
菜鳥學(xué)堂: 
 
=========== 添加vbscript代碼的三種方法 ============
假設(shè)已有一個名為btnsubmit的按鈕,添加vbscript代碼的方法有三種: 
第一種,最常用:
<script language="vbscript">
private sub btnsubmit_onclick
msgbox("ok!")
end sub
</script>
第二種,使用for/event屬性:
<script language="vbscript" for="btnsubmit" event="onclick">
msgbox("ok!")
</script>
第三種:可以不必單獨(dú)為一個事件生成一個事件處理程序,只要把事件處理的過程當(dāng)作元素標(biāo)記中的一個屬性就可以了。需要注意,事件的處理過程的值應(yīng)該用單引號括起來,而不像其他的屬性值是用雙引號括起來的。
<input type="submit" name="btnsubmit" value="按鈕" onclick='msgbox"ok!"' language="vbscript">
========on error resume next語句=========
若不使用 on error resume next 語句,發(fā)生的任何運(yùn)行時錯誤都將是致命的,即,顯示錯誤信息并終止運(yùn)行。
on error resume next 會使程序從緊隨產(chǎn)生錯誤的語句之后的語句繼續(xù)執(zhí)行,或是從緊隨最近一次調(diào)用過程(該過程含有 on error resume next 語句)的語句繼續(xù)運(yùn)行。這個語句可以不顧運(yùn)行時的錯誤,繼續(xù)執(zhí)行程序,之后您可以在過程內(nèi)部建立錯誤處理例程。所以,如果希望在例程中進(jìn)行內(nèi)部錯誤處理,則應(yīng)在每一個調(diào)用的例程中執(zhí)行 on error resume next 語句。
==========vbscript中的錯誤處理功能============
嚴(yán)格地講,vbscript中的錯誤處理功能是比較弱的,當(dāng)錯誤發(fā)生時,它沒有辦法直接調(diào)用錯誤處理程序,它發(fā)生錯誤的時候并沒有產(chǎn)生中斷或提示信息的機(jī)制。在visual basic中,錯誤發(fā)生的時候可以利用on error goto...的語句來進(jìn)行錯誤處理,當(dāng)錯誤發(fā)生時,程序會自動跳轉(zhuǎn)到用goto后面的標(biāo)號指示的代碼處。可是vbscript中不允許這樣使用。
但是利用on error resume next語句,還是可以實(shí)現(xiàn)某種程度的錯誤捕捉功能,只不過所有的錯誤陷阱要么必須在線處理,要么只能報告程序中出現(xiàn)的最后一個錯誤。下面給出了vbscript的錯誤處理基本框架。
sub mysub()
on error resume next
........
'在線處理
if err.number=? then
........
end if
'報告腳本遇到的上一個錯誤的信息
if err.number<>0 then
msgbox err.description
end if
end sub
注意,當(dāng)使用on error resume next語句后,除了最后一個錯誤,前面發(fā)生過的錯誤都已經(jīng)被清除了,所以無法知道發(fā)生過的所有錯誤。為了能夠及時處理,建議采用在線處理方法。
============err對象的raise方法==========
err對象的raise方法用于引發(fā)特定的錯誤。
可以用下面的程序顯示錯誤的描述
on error resume next
err.raise 6 '產(chǎn)生溢出錯誤。
msgbox ("error # " & cstr(err.number) & " " & err.description)
err.clear '清除錯誤。
========activex==========
activex是使web頁面豐富多彩的好方法,雖然html控件提供了基本的可視化操作(如按鈕等),但卻缺乏那些用戶已經(jīng)熟悉的可視化功能,而通過加入一些通用的(或者自己開發(fā)的)activex控件,用戶就能獲得常見的計算機(jī)應(yīng)用程序的感覺。用<object>標(biāo)簽使用activex控件。id屬性指定控件的名字,然后是activex控件的id號。如果瀏覽者的客戶機(jī)上沒有該控件,就要用codebase指定下載這一控件的源站點(diǎn)位置,如http://www.mysite.com/controls/mycontrol.ocx,除了指明控件的擴(kuò)展名為.ocx以外,不需要提供別的什么信息。接下來是用<param>標(biāo)記添加參數(shù)。一個典型的程序段如下:
<object id="objuseractivex" classid="clsid:7823a620-9dd9-11cf-a662-00aa00c066d2">
<param name="..." value="...">
<param name="..." value="...">
</object>
如果開發(fā)者不想讓瀏覽者知道其<param>標(biāo)記中的參數(shù),該內(nèi)容會被編碼,然后以data屬性寫入<object>標(biāo)記,如:
<object id="objuseractivex" classid="clsid:7823a620-9dd9-11cf-a662-00aa00c066d2" data="..........">
==========filesystemobject對象=============
filesystemobject (fso) 對象模式,允許對大量的屬性、方法和事件,使用較熟悉的 object.method 語法,來處理文件夾和文件。
fso 對象模式使文件處理變得很容易。在處理文件時,主要的目標(biāo)是以易于訪問的格式把數(shù)據(jù)存儲在有效的空間和資源中。這就要求能夠創(chuàng)建文件,插入和改變數(shù)據(jù),以及輸出(讀取)數(shù)據(jù)。因?yàn)榘褦?shù)據(jù)存儲在數(shù)據(jù)庫中,如 access 或 sql 服務(wù)器,會給應(yīng)用程序增加很大的開銷,所以把數(shù)據(jù)存儲在二進(jìn)制或文本文件中可能是最有效的解決方案。可能不希望有該開銷,或者數(shù)據(jù)訪問要求可能不需要與功能完備的數(shù)據(jù)庫相關(guān)聯(lián)的所有額外功能。
fso 對象模式包含在 scripting 類型庫中,該庫位于 scrrun.dll 文件中。因而,要使用 fso 對象模式,必須把 scrrun.dll 放在 web 服務(wù)器的適當(dāng)系統(tǒng)目錄中。
在 vbscript 中,使用下面的代碼來創(chuàng)建 filesystemobject 的一個實(shí)例: 
dim fso
set fso = createobject("scripting.filesystemobject")
filesystemobject 對象模式中的某些功能是多余的。例如,可以用 filesystemobject 對象的 copyfile 方法,也可以用 file 對象的 copy 方法來復(fù)制文件。這兩種方法功能是相同的;兩種方法能使編程更靈活。
要訪問現(xiàn)有文件,則使用 filesystemobject 對象中的getfile 
方法:
dim fso, f1
set fso = createobject("scripting.filesystemobject")
set f1 = fso.getfile("c:/test.txt")
一旦有了對象的句柄,就可以訪問它的屬性。要找出最后一次修改文件的時間,則使用下面的 vbscript 語法:
response.write "file last modified: " & f1.datelastmodified 
創(chuàng)建空文本文件的方法是用 createtextfile 方法。 下面的示例示范了在 vbscript 中如何用這種方法來創(chuàng)建文本文件:
dim fso, f1
set fso = createobject("scripting.filesystemobject")
set f1 = fso.createtextfile("c:/testfile.txt", true)
要打開現(xiàn)有的文件,則使用 filesystemobject 對象的 opentextfile 方法。
要寫數(shù)據(jù)到打開的文本文件,則根據(jù)下表所述任務(wù)使用 textstream 對象的 write、writeline 或 writeblanklines 方法。
下面的 vbscript 例子示范了如何打開文件,并向文件添加數(shù)據(jù),然后關(guān)閉文件: 
sub createfile()
dim fso, tf
set fso = createobject("scripting.filesystemobject")
set tf = fso.createtextfile("c:/testfile.txt", true)
' 寫一行,并且?guī)в行滦凶址?br>tf.writeline("testing 1, 2, 3.") 
' 向文件寫三個新行字符。 
tf.writeblanklines(3) 
' 寫一行。
tf.write ("this is a test.") 
tf.close
end sub
要從文本文件讀取數(shù)據(jù),則使用 read、readline 或 readall 方法。下表描述了不同的任務(wù)應(yīng)使用哪種方法。
如果使用 read 或 readline 方法,并且想跳過數(shù)據(jù)的特殊部分,則使用 skip 或 skipline 方法。read 方法的結(jié)果文本存在一個字符串中,該字符串可以顯示在一個控件中,也可以用字符串函數(shù)(如 left、right 和 mid)來分析,連接等等。 
下面的 vbscript 示例示范了如何打開文件,和如何寫數(shù)據(jù)到文件中并從文件讀取數(shù)據(jù):
sub readfiles
dim fso, f1, ts, s
const forreading = 1
set fso = createobject("scripting.filesystemobject")
set f1 = fso.createtextfile("c:/testfile.txt", true)
' 寫一行。
response.write "writing file <br>"
f1.writeline "hello world"
f1.writeblanklines(1)
f1.close
' 讀取文件的內(nèi)容。
response.write "reading file <br>"
set ts = fso.opentextfile("c:/testfile.txt", forreading)
s = ts.readline
response.write "file contents = '" & s & "'"
ts.close
end sub
==============“cookie”技術(shù)=============
術(shù)語“cookie”表示的是賦給客戶應(yīng)用程序的字符串。“cookie”一詞來源于“magic cookie”unix編程概念,有時又被叫做“記號”(token)。一般來說,使用“記號”這個術(shù)語對國人來說,要比“cookie”一詞更容易理解一些。
cookie是一個字符串,一般包含許多組變量名及變量的值,各組名和值之間用分號分隔,并且分號后還跟一個空格,變量名與變量值之間用等號分隔,一個典型的cookie字串如下:
value1=100; value2=good; sale50
用document對象的cookie屬性返回當(dāng)前的cookie字符串。
用document.cookie="value1=100"的方式為cookie賦值,如果cookie中有這個變量,將用新值替換,如果cookie中沒有這個變量,就會為它創(chuàng)建一個變量。
以上的cookie技術(shù)將變量及變量值存儲在內(nèi)存中,而不是硬盤中。所有的頁面共用一個cookie空間,如果頁面a與頁面b分別在cookie中寫入了數(shù)據(jù),則無論在哪個頁面中用document.cookie都可以顯示出各頁面所有的cookie數(shù)據(jù)。只要有一個ie窗口打開就不會丟失cookie,一旦所有的ie窗口都關(guān)閉,則所有的cookie都被清除。
下面是我自己編寫的讀取cookie變量的函數(shù)。
<script language="vbscript">
function readcookie(pcook)
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'本函數(shù)用來讀取cookie中的數(shù)據(jù)。
'流程:先刪去cookie中pcook變量前面的字串,再刪去pcook變量后面的字串,就是pcook的值。
'輸入:要讀取的變量名。
'輸出:該變量名的值。如果沒有該變量的值,為其賦初值。
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
dim whereis_pcook '要查找的pcook標(biāo)記名在cookie中的起始位置
dim howlong_pcook '要查找的pcook標(biāo)記名的長度
dim howlong_cookie '整個cookie的長度
dim whereis_fenhao '查找endstring中的分號(;)的起始位置
dim endstring '存放臨時字串,該字串經(jīng)處理最后得到pcook的值
whereis_pcook = instr(document.cookie,pcook)
if whereis_pcook = 0 then 
'如果當(dāng)前cookie中沒有該pcook值,就為其賦初值
select case pcook
case "value1"
document.cookie="value1=100"
endstring="100"
case "value2"
document.cookie="value2=good"
endstring="good"
case "value3"
document.cookie="value3=sale50"
endstring="sale50"
end select
else
howlong_pcook = len(pcook)
howlong_cookie=len(document.cookie)
'從cookie中pcook的值開始到cookie最后的字串。
'要注意,cookie在各值之間用分號分隔,并且分號后還跟一個空格,所以下面的語句中有“+1”
'另外,各變量名與變量之間用等號隔,所以下面的語句中有“-1”
'當(dāng)然,以上兩個量相互抵消,但為了更好地理解本語句,故仍保留
endstring = right(document.cookie,howlong_cookie - whereis_pcook + 1 - howlong_pcook - 1)
whereis_fenhao=instr(endstring,";")
'如果沒有找到分號,說明此變量是最后一個,所以endstring就是最終的結(jié)果;
'如果找到分號,就取分號前面的字串,得到最終結(jié)果。
if whereis_fenhao <> 0 then
endstring=left(endstring,whereis_fenhao - 1)
end if
end if
readcookie=endstring
end function
</script>
==========日歷控件============
操作系統(tǒng):windows2000 professional
在frontpage2000下名為“calendar控件9.0”,classid="clsid:8e27c92b-1264-101c-8a2f-040224009c02"
可以用calendar.year,calendar.month,calendar.day調(diào)用該控件的年月日值,當(dāng)日歷中改變年月日時分別觸發(fā)calendar_newyear(),calendar_newmonth(),calendar_newday()事件。
要注意,在下拉列表中選擇了年或月后,calendar.year,calendar.month,calendar.day三個值均會被清零。
=========關(guān)于vb的顏色常數(shù)============
在vbscript中使用vbs的顏色常數(shù)會出現(xiàn)意想不到的顏色,比如document.bgcolor=vbyellow
不會將頁面背景顯示成黃色,而是淡藍(lán)色。
原因在于vbs的顏色常數(shù)表示方法與html中顏色的表示方法不同,vbs的顏色常數(shù)vbyellow的機(jī)內(nèi)值是"hffff",vbs的本意是要它表示值為"ffff00"的顏色,但因?yàn)槌?shù)的機(jī)內(nèi)值沒有寫成6位十六進(jìn)制數(shù),所以html會將其解釋為"00ffff",導(dǎo)致出錯。
關(guān)于vbs的顏色常數(shù)在頁面中實(shí)際顯示的顏色可以在frontpage中實(shí)驗(yàn)。在頁面屬性中選背景顏色/其它顏色,在值中直接填入vbs的顏色常數(shù)的機(jī)內(nèi)值,確定后系統(tǒng)會把它進(jìn)行轉(zhuǎn)換,得到在頁面中實(shí)際顯示的顏色。
有些vbs的顏色常數(shù)的機(jī)內(nèi)值6位數(shù)是對稱的,所以會正確顯示,如vbgreen(hff00)和vbmagenta(hff00ff)。
=================== elements 對象 ===================
private sub window_onload()
for i = 0 to 6
frmres.elements(i).value=""
next
end sub
這段窗口初始化程序?qū)㈨撁嬷衒rmres表單的最前面7個元素(第0-第6個元素)的值清空,注意,不能將循環(huán)條件寫成
for i=1 to 7
因?yàn)檫@樣系統(tǒng)將認(rèn)為是第1-第7個元素,系統(tǒng)對元素的標(biāo)識是從0開始的。
====================== set語句 =======================
dim theform
set theform = document.frmres
上面語句設(shè)置用theform變量引用frmres表單,可以減少書寫,并使對頁面的變動有更強(qiáng)的適應(yīng)性。在程序中可以這樣引用frmres的元素:
theform.txtname.focus
注意:set語句將對象引用賦給變量或?qū)傩裕O(shè)置theform變量的語句前面必須要用set引導(dǎo),否則將出錯。
當(dāng)使用 set 將一個對象引用賦給變量時,并不是為變量創(chuàng)建對象的副本,而是創(chuàng)建對象的引用。可有多個對象變量引用同一個對象。因?yàn)檫@些變量是對象引用(不是副本),所以對對象所作的任何改動都會影響所有引用該對象的變量。
===========location對象===========
每個窗口都有一個location對象,定義了其包含的主頁的網(wǎng)頁地址信息。location對象的主要屬性有:
href 網(wǎng)頁的url
protocal 網(wǎng)絡(luò)協(xié)議
host,hostname 主機(jī)名
pathname 路徑
port 端口號
還可以使用 location.href=newurl 語句重定向頁面地址。
==========window對象================
window對象的屬性和方法無需指明窗口的名稱,因此window對象的方法名稱可以看作系統(tǒng)的語句。如窗口的名稱可以用window.name,也可以直接用name。
status屬性是狀態(tài)欄提示信息,可用下面的語句改變狀態(tài)欄的信息:
status="i am busy! please wait for a miniter!"
window對象的navigate方法可以重定向頁面地址。如 navigate "http://www.sina.com.cn"
============== alert和 confirm 語句 =================
alert "比爾正在認(rèn)真地進(jìn)行一項生物試驗(yàn)"
window對象的alert方法用來顯示提示文本,如上圖。window對象的confirm方法彈出一個含有“確定”和“取消”按鈕的對話框,可以用分支程序處理用戶的選擇。如上圖。 
flag=prompt ("比爾正在進(jìn)行生物試驗(yàn)嗎?")
if flag then
msgbox "正在進(jìn)行中……"
else
msgbox "玩去了……"
end if
========== window對象的prompt方法與inputbox函數(shù)的比較==========
window對象的prompt方法的格式為:
username=prompt ("請輸入你的名字:","jack")
第一個參數(shù)為提示信息,第二個參數(shù)為默認(rèn)值。如上圖。inputbox函數(shù)可以顯示更個性化的輸入對話框,格式為:
username=inputbox ("請輸入你的名字:","輸入對話框","jack")
第一個參數(shù)為提示信息,第二個參數(shù)為對話框標(biāo)題,第三個參數(shù)為默認(rèn)值。如上圖。 
prompt方法與inputbox函數(shù)基本上是一樣的,prompt方法彈出的對話框中有"javascript"字樣,而inputbox函數(shù)彈出的對話框中有"vbscript"字樣。
=========history對象============
history對象中包含著窗口中顯示過的主頁的列表。
forward 方法是向前翻頁,相當(dāng)于ie中的“前進(jìn)”按鈕。back 方法是向后翻頁,相當(dāng)于ie中的“后退”按鈕。forward和back方法均可以帶參數(shù),表示前進(jìn)和后退的頁數(shù)。
go 方法是轉(zhuǎn)到某個頁面,它的參數(shù)相對于當(dāng)前頁面,正數(shù)是前進(jìn),負(fù)數(shù)是后退。
length 屬性是窗口顯示過的窗口的總數(shù)。
如 history.back
history.go 3
=======link對象=======
用document對象的links屬性可以訪問link對象,links屬性是一個數(shù)組,從0開始記數(shù),包含了所有的鏈接對象,其中鏈接對象的順序由html文件中的鏈接對象的定義決定。鏈接對象的屬性與窗口的location對象的屬性很相似。
以下程序?qū)⒏淖冺撁嬷械谝粋€鏈接的href屬性。用set語句將鏈接對象的名稱賦給lnk變量的好處是,有些情況下是無法把每一個對象的名稱寫出來的(如不能用name屬性為<a>標(biāo)記命名),用set語句就可以引用這個對象。
set lnk=document.links(0)
lnk.href="page-1.htm"
msgbox "鏈接已改成 " & lnk.href
link對象的length屬性,是主頁中所有鏈接對象的個數(shù)。下面的程序?qū)@示出網(wǎng)頁中的所有鏈接。
dim msg , i , lnk
for i=0 to document.links.length-1
set lnk=document.links(i)
msg=msg & i+1 & "---" & lnk.href & vbcrlf
next
msgbox msg
=========frame 對象====================
frame對象包含在window對象中,但實(shí)際上又相當(dāng)于一個window對象,它可以使用窗口對象的各種屬性、方法和事件,也可以包含任何窗口所能包含的對象,包括在框架對象中嵌套的其他框架對象。
一個典型的frame嵌套的html源文件,將一個窗口分成上下兩部分,再將上部分成左右兩部分,再將上左分成上下兩部分:
<frameset cols="*,505" > 
<frameset rows="80,*" > 
<frame name="topframe" src="document.write-top.htm" >
<frame name="mainframe" src="document.write-main.htm">
</frameset>
<frame name="rightframe" src="document.write-right.htm">
</frameset >
從當(dāng)前frame訪問別的frame,用如下的形式:
parent.framename.document.write "cccccccc"
無論frame嵌套了幾層,都只需一個parent,而不必像目錄那樣一級一級地指定。
============限制文本框只能輸入數(shù)字===========
下面的程序處理文本框的onkeyup事件,如果按下的不是數(shù)字,將刪除最后鍵入的字符。
程序尚未解決的問題:
1.如果按下非數(shù)字鍵不放,將鍵入一串文本,而只會刪除最后一個字符。
2.如果不是在最后的位置鍵入非數(shù)字鍵,就不會糾正。
sub txta_onkeyup
dim a
a=right(txta.value,1)
if a < chr(48) or a > chr(57) then
txta.value=left(txta.value,len(txta.value)-1)
end if
end sub
================== window 對象的關(guān)系 =================
===================其他 ===================
  □如果在html中沒有指定腳本語言的類型,瀏覽器會默認(rèn)腳本語言為javascript。
  □表單<form>中的按鈕若設(shè)成submit類型,則不論其onclick程序中有何語句,最后總要跳轉(zhuǎn)到<form>中定義的<action>頁面,所以,submit類型的按鈕不宜做檢查表單填寫是否正確的按鈕,因?yàn)榧词箼z查出錯誤也會跳轉(zhuǎn)到下一個表單,檢查就失去意義了。可以將其移到<form>外作為獨(dú)立的按鈕,或者將其類型設(shè)置為<button>。
  □可以用msgbox顯示消息框來起到“斷點(diǎn)”的作用。
  □focus方法使焦點(diǎn)移到當(dāng)前元素。如 theform.txtphone.focus
  □select方法使相應(yīng)文本框中的全部文本處于被選中狀態(tài)。如 theform.txtphone.select
  □頁面中<body>與</body>之間的內(nèi)容表示為:document.body.innerhtml