一:介紹
Lotus中的域主要有以下的類型:文本,日期/時間,對話框清單,複選框,單選按鈕,RTF等等。Lotus中域的驗證方式有很多種公式,lotusscript,javascript等。如果你使用notes開發c/s的程式,使用公式,ls會很友善,但是如果你是一個b/S的程式員,你會發現notes所有的公式和ls都是運作在伺服器端的,此時你在使用公式,ls不但會占用server的資源,而且給使用者的體驗也是不好的,是以我們推薦使用js來做驗證.
二:Domino對域的解析
對于LotusScript,除了Rich-Text域外的元素,如文本、單選框、清單框、複選框等,你可以用幾乎相同的代碼取得它們的值。例如:如果有一個“Location”域,不論它是何種類型,你都可以用下面的LotusScript代碼取得它的值:
fieldVals = doc.Location
或者這樣:
fieldVals = doc.GetItemValue("Location")
在LotusScript中,域的類型對于你要取值(值數組)的代碼并不重要。但是在JavaScript中,不同類型的域除了顯示選項(比如單選框、複選框或者文本)外,并不像在Notes裡那樣,它們是不同的類型的對象,每一個都要用不同的方式去引用。其實,那也不是絕對的,有些對象是相似的,但是引用過程并不像在LotusScript裡那麼流暢。
在JavaScript中,沒有所謂的Rich-Text域,在HTML中更沒有。Notes裡提供了一個可以放在浏覽器裡的富文本Java(不是JavaScript)小程式,進而可以得到富文本的一些功能,但是你并不能用JavaScript來對它程式設計,而且它也不是一個真正的HTML對象類型。
更讓Notes開發人員驚訝的是,在Web上還沒有數字型或時間型的域。HTML的域都是文本型的。盡管你能用它們來收集數字資訊,如數量或單價,而儲存的資料依然是文本。為了像數字一樣使用它,你必須把它轉換成數字類型。另一個差別是在Web上沒有計算域,但并不意味着你不能在你的表單裡加入計算域。你可以加入計算域,計算值将會在Web頁中顯示,除非域是隐藏的。關鍵是即使域就在那裡顯示,而HTML通常的處理是沒有定義域。如果你把test域改成計算域而不是可編輯的,在測試時你會發現其值是取不到的,我們可以對比下計算域和可編輯域生成的html代碼:
計算域的時候生成的代碼(js是取不到值的):
<form method="post"
action="/weboa/ggxx/Dinner.nsf/test?OpenForm&amp;Seq=1" name="_test">
<input type="hidden" name="__Click" value="0">dddddddd
<br>
<input type="button" onclick="alert(document.forms[0].test.value);
" value="test">
</form>
非計算域時候用戶端生成的代碼:
action="/weboa/ggxx/Dinner.nsf/test?OpenForm&amp;Seq=1" name="_test">
<input type="hidden" name="__Click" value="0">
<input name="test" value="dddddddd">
" value="test"></form>
多值域
HTML的域沒有Notes的域那樣的多值屬性。可以試一下:在表單上加入第二個按鈕和第二個域。把域命名為“Letters”,類型為可編輯文本,選中“允許多值(Allow multiple values)”複選框。将預設值寫成如下的字母清單:
"A":"B":"C":"D":"E":"F":"G"
把按鈕命名為“Get multiple values”并鍵入如下的JavaScript代碼:
alert(document.forms[0].Letters.value);
你可以用不同的分隔符來改變此域的值,但是當你單擊按鈕時,你會注意到,不論你用什麼分隔符,提示你的總是域的所有值。這和在Notes用戶端中運作的@Formulas和LotusScript形成了對比。用@Prompt,你得到的提示隻是域的第一個值:“A”。你用LotusScript同樣也隻能顯示一個值,但是你要指定數組下标,否則将得到一個錯誤提示。公式和LotusScript都不能在提示語句中得到多值域的所有值。
原因就是,在Notes的語言中,确實有多個值在域中。對于HTML和JavaScript來說,隻有一個值。再次看Web頁面的源代碼你會發現和下面類似的代碼:
<input name="Letters" value="A;B;C;D;E;F;G">
注意它的值是用“一對”雙引号引起來的帶分隔符的值。
單選按鈕
另一個有趣的地方是單選按鈕,就Notes和Web頁面而言,Notes裡的單選按鈕是一個有多個值的單個域,在Web上是同名的輸入文本框的數組。為了了解以上所述,請看下面的例子:
在表單上,加入另一個新域,名字為“RadioButtn”。正像它的名字一樣,把它改成單選框類型的域。在域屬性視窗的第二個标簽中,輸入下列選項和别名
One | A
Two | B
Three | C
Four | D
把此域的預設值設成第一個選項的别名,也就是帶引号的字母“A”。現在在浏覽器裡預覽表單,再看源檔案,你會看到單選按鈕的代碼和正常域的代碼有很大差別。HTML代碼看起來将和下面的類似:
<input type="radio" name="RadioButtn" value="A" checked>One<br>
<input type="radio" name="RadioButtn" value="B">Two<br>
<input type="radio" name="RadioButtn" value="C">Three<br>
<input type="radio" name="RadioButtn" value="D">Four
在這裡你要注意一些要點。首先,所有的4個單選按鈕對象有同一個名字:RadioButtn,這樣一來,HTML和JavaScript就知道它們是同一個數組裡的對象。其次,每個選項的值是選項的别名,并不是看到的文字(例如“One”、“Two”等)。這和在Notes中儲存的是别名是一樣的,儲存的不是看到的文本(當然如果沒有别名的話,儲存的值和文本就是一樣的了)。 最後,你選中第一個選項的方法是在HTML語句中用的“checked”單詞,它被加在了第一個單選按鈕的語句裡。
如果你再加入另外的一個按鈕,用和取其他兩個域值同樣的方法來取RadioButtn的值的話,你會得到一個奇怪的錯誤,也就是用下面的代碼:
alert(document.forms[0].RadioButtn.value);
你将會看到一個提示“undefined”的錯誤對話框
這裡的問題并不是沒有定義它的值。畢竟如上面所示,單選按鈕的代碼中共有4個值。也就是說,問題出在RadioButtn本身,至少是現在用在這裡的那個。單選按鈕是一個輸入選項的數組,如果你想要知道其中一個元素的值,必須指定是哪一個,試試下面的代碼:
alert(document.forms[0].RadioButtn[0].value);
好,傳回的是目前域的值“A”,但是當你選擇其他的選項時再單擊按鈕,你得到的依然是“A”,而不是你所選擇的值,還是不太妙。
為了得到選擇的選項的值,首先要知道哪個選項被選中了,然後在alert語句中,用那個選中的選項的下标值來正确地引用目前選項的值。也就是說,如果第一個選項被選中,你應該取RadioButtn[0].value,如果第二個選項被選中,你就應該取RadioButtn[1].value,依此類推。
在JavaScript中,某些類型的域具有selectedIndex屬性,代表目前選中選項的數組下标值。然而單選按鈕并不是那麼幸運,同樣,複選框也沒能逃脫厄運。要想得到目前選中的單選按鈕的值,你必須在RadioButtn數組元素中查找“checked”屬性。和LotusScript相比,LotusScript就能像操作其他類型的域一樣來取得單選按鈕目前被選中的值。這是一件非常麻煩的事,但是,它就是那樣的。
下面是按鈕的代碼:
var doc = document.forms[0];
for(i = 0; i <
doc.RadioButtn.length; i++){
if(doc.RadioButtn[i].checked){
alert(doc.RadioButtn[i].value);
break;
}
複選框
複選框和單選按鈕類似。在此就不多做說明.
三:編寫通用函數來驗證
上面就是notes基本的域,也是使用頻率最高的域值,我們可以寫一個通用的函數來驗證這些域值,下面以驗證域的非空為例
function checkField(fieldType,fieldName,tip)
{
switch (fieldType){
case "radio":
var radionum=0;
var a = document.getElementsByName(fieldName);
for (var i=0; i<a.length; i++)
{
if ((a[i].type == "radio")&&(a[i].checked))
{
radionum++;
}
}
if (radionum==0)
{
alert(tip+'不能為空');
return false;
}
return true;
case "checkbox":
var checkboxNum=0;
if ((a[i].type == "checkbox") && (a[i].checked)==true)
checkboxNum++;
if (checkboxNum==0)
return true;
case "select":
var objcheck = document.getElementById(fieldName);
var selectedValue = objcheck[objcheck.selectedIndex].text;
if(selectedValue=="")
{
alert(tip+'不能為空');
return false;
}
case "text":
var objtext = document.getElementById(fieldName);
if(objtext.value=="")
default:
return false;
} //end switch
RTF文本
Lotus的域中是一個比較特殊的域,他可以包含附件,對象等等,自然他的驗證也就比較特殊,RTF域用js也是可以取到的,可以對其進行空的校驗,但是用js卻不能校驗其裡面有沒有附件,嵌入式對象,一般我用就使用ls來校驗
驗證的富文本中,隻包含一個附件、嵌入式對象或者連結的輸入是允許的,即使它不包含相應的文本。同樣,還是使用包含域的表單的 Querysave 事件:
Sub Querysave(Source As Notesuidocument, Continue As Variant)
Dim rtitem As NotesRichTextItem
Set doc = Source.Document
Set rtitem = doc.GetFirstItem( "rtfield" )
Dim text As String
text$ = Source.FieldGetText("rtfield")
trimmed$ = Trim(text)
If(doc.Hasembedded) Then
Continue = True
Elseif ( trimmed$ = "") Then
Msgbox "Please enter some text."
Continue = False
source.GotoField("rtfield")
source.Refresh(True)
Else
Continue = True
End If
End Sub
如果文檔的任何地方有一個附件,即使它不在所驗證的域中,該代碼也會工作.
就說到這吧~~~
本文轉自生魚片部落格園部落格,原文連結:http://www.cnblogs.com/carysun/archive/2008/03/10/1098444.html,如需轉載請自行聯系原作者