Lotus开发之Lotus Notes中域的验证

一:介绍

      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&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> 

非计算域时候客户端生成的代码:
<form method="post"
action="/weboa/ggxx/Dinner.nsf/test?OpenForm&amp;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

相关文章
相关标签/搜索