我有两个文本框提示,我需要验证只接受数字或空字段,如果输入除数字以外的任何内容或空字段,则应禁用运行按钮。
oCR = cognos.Report.getReport('_THIS_');
var prompts;
var f1 = oCR.prompt.getControlByName('Prompt1');
var f2 = oCR.prompt.getControlByName('Prompt2');
prompts = [f1,f2];
for (var i=0; i < prompts.length; i++) {
prompts[i].setValidator(validate);
}
function validate() {
var result = false;
for (var i=0; i < prompts.length; i++) {
var x = prompts[i].getValues();
if(x.length == 0) { result = true;}
if(x.length == 1 && x['use'] == " ") {result = true};
if(x.length > 0) {
var sValue = x['use'];
var codeFormat = new RegExp("^\\d+$")
if(codeFormat.test(sValue)) {
result=true;
}
}
}
if(result == true) {
getLink("Runreport").css("background-color", "#005FA5").css("border-color", "#005FA5").css("pointer-events","auto");
} else {
getLink("Runreport").css("background-color", "#dddddd").css("border-color", "#cccccc").css("pointer-events","none");
}
return result;
}
这并不是我想要的方式。因为现在它会检查两个提示是否都检查为true。但如果一个提示是真的而另一个是假的,那么它应该是假的,而不是真的。任何人都知道如何解决这个问题?
答案 0 :(得分:1)
这是您的验证功能简化并重新构建了一点:
function validate(values) {
var result = true,currentresult = true,x;
if (values.length > 0) {
if (isNaN(values[0].use)) {
currentresult = false;
}
}
for (var i=0; i < prompts.length; i++) {
x = prompts[i].getValue();
if (x.length > 0) {
if (isNaN(x)) {
result = false;
break;
}
}
if (prompts[i] != this) {
prompts[i].checkData();
}
}
if (result) {
getLink("Runreport").css("background-color", "#005FA5").css("border-color", "#005FA5").css("pointer-events","auto");
} else {
getLink("Runreport").css("background-color", "#dddddd").css("border-color", "#cccccc").css("pointer-events","none");
}
return currentresult;
}
由于您希望两个提示之一失败导致失效,我们首先将结果设置为 true 。然后,我们查找提示无效的特殊情况。当提示的长度不为0(外部if),并且提示的内容不是数字(内部if)时,会出现这种特殊情况。我使用了isNaN()函数,因为如果传入的值不是数字,它将返回true,如果值是数字,则返回false。如果isNan()返回true,那么我们将结果设置为false并跳出for循环。结果是,如果任何提示返回false,则整个结果将为false。
有关文本提示验证的更多乐趣,请查看我的高级技巧Cognos Prompt Numeric Range Validation,其中演示了进行多提示验证的其他方法,以及Multi-prompt Validation,其中显示了如何将多个提示作为一组进行验证。