zoukankan      html  css  js  c++  java
  • Lotus开发之Lotus Notes中域的验证

    一:介绍

          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> 

    非计算域时候客户端生成的代码:
    <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

    如果文档的任何地方有一个附件,即使它不在所验证的域中,该代码也会工作.
    就说到这吧~~~

  • 相关阅读:
    POJ 1003 解题报告
    POJ 1004 解题报告
    POJ-1002 解题报告
    vi--文本编辑常用快捷键之光标移动
    常用图表工具
    September 05th 2017 Week 36th Tuesday
    September 04th 2017 Week 36th Monday
    September 03rd 2017 Week 36th Sunday
    September 02nd 2017 Week 35th Saturday
    September 01st 2017 Week 35th Friday
  • 原文地址:https://www.cnblogs.com/hannover/p/5180307.html
Copyright © 2011-2022 走看看