单选按钮 另一个有趣的地方是单选按钮,就Notes和Web页面而言,Notes里的单选按钮是一个有多个值的单个域,在Web上是同名的输入文本框的数组。为了理解以上所述,请看下面的例子: 在表单上,加入另一个新域,名字为“RadioButtn”。正像它的名字一样,把它改成单选框类型的域。在域属性窗口的第二个标签中,输入下列选项和别名 One | A Two | B Three | C Four | D 把此域的缺省值设成第一个选项的别名,也就是带引号的字母“A”。现在在浏览器里预览表单,再看源文件,你会看到单选按钮的代码和正常域的代码有很大区别。HTML代码看起来将和下面的类似: One
Two
Three
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.checked){ alert(doc.RadioButtn[i].value); break; } }
[/i][i]复选框 复选框和单选按钮类似。在此就不多做说明.
三:编写通用函数来验证
上面就是notes基本的域,也是使用频率最高的域值,我们可以写一个通用的函数来验证这些域值,下面以验证域的非空为例 function checkField(fieldType,fieldName,tip) { switch (fieldType){ case "radio": var radionum=0; var a = document.getElementsByName(fieldName); for (var i=0; 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 { 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
Elseif ( trimmed$ = "") Then Msgbox "Please enter some text." Continue = False source.GotoField("rtfield") source.Refresh(True) Else Continue = True End If End Sub