Lotus中的域主要有如下的類型:文本,日期/時間,對話框列表,複選框,單選按鈕,RTF等等。Lotus中域的驗證方式有不少種公式,lotusscript,javascript等。若是你使用notes開發c/s的程序,使用公式,ls會很方便,可是若是你是一個b/S的程序員,你會發現notes全部的公式和ls都是運行在服務器端的,此時你在使用公式,ls不但會佔用server的資源,並且給用戶的體驗也是很差的,因此咱們推薦使用js來作驗證.javascript
二: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&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>
非計算域時候客戶端生成的代碼:
<form method="post"
action="/weboa/ggxx/Dinner.nsf/test?OpenForm&Seq=1" name="_test">
<input type="hidden" name="__Click" value="0">
<input name="test" value="dddddddd">
<br>
<input type="button" onclick="alert(document.forms[0].test.value);
" 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;
var a = document.getElementsByName(fieldName);
for (var i=0; i<a.length; i++)
{
if ((a[i].type == "checkbox") && (a[i].checked)==true)
{
checkboxNum++;
}
}
if (checkboxNum==0)
{
alert(tip+'不能爲空');
return false;
}
return true;
case "select":
var objcheck = document.getElementById(fieldName);
var selectedValue = objcheck[objcheck.selectedIndex].text;
if(selectedValue=="")
{
alert(tip+'不能爲空');
return false;
}
return true;
case "text":
var objtext = document.getElementById(fieldName);
if(objtext.value=="")
{
alert(tip+'不能爲空');
return false;
}
return true;
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
若是文檔的任何地方有一個附件,即便它不在所驗證的域中,該代碼也會工做.
就說到這吧~~~html