我正在处理 JavaScript 中一个非常非常奇怪的问题。我正在开发一个验证器脚本,该脚本使用 jQuery 循环遍历字段列表。每个验证都与对象上的正则表达式相关联,如下所示:
var 格式 = {
电子邮件:/[a-z0-9!#$%&'*+\/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+ \/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\. )+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?/g,
电话:/(?!:\A|\s)(?!(\d{1,6}\s+\D)|(((\d{1,2}\s+){2,2}))( ((\+\d{1,3})|(\(\+\d{1,3}\)))\s*)?((\d{1,6})|(\(\d {1,6}\)))\/?(([ -.]?)\d{1,5}){1,5}((\s*(#|x|(ext)))\.? \s*)\d{1,5})?(?!:(\Z|\w|\b\s))/gm,
数字:/(\d+)(((.|,)\d+)+)?/g,
网址:/^((http\:\/\/|https\:\/\/|ftp\:\/\/)|(www.))+(([a-zA-Z0-9\.- ]+\.[a-zA-Z]{2,4})|([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1 ,3}\.[0-9]{1,3}))(\/[a-zA-Z0-9%:\/-_\\?\.'~]*)?$/gi
};
然后我创建了一个函数,它给定两个参数,格式和测试主体,返回true或false(仅仅是testRegExp 对象的方法的包装):
validy.is = 函数(什么,str){
返回格式[what].test(str);
};
在一个 jQuery 集合上,我的INPUT元素具有根据每种格式命名的类:
<input type="text" class="field email" id="field-1-1" /> <input type="text" class="field phone" id="field-1-2" /> ...
然后,我的验证功能是这样的:
formBuilder.validate = function() {
console.info("=== 开始验证 ===");
var isValid = true;
var allFields = $(".field", formBuilder.form).toArray();
var validable = ["电子邮件","电话","数字","url"];
变量错误 = {
"email": "Debés ingresar una dirección de e-mail válida (por ejemplo: juanperez@gmail.com)。",
"电话": "Debés ingresar un número de teléfono válido.",
"numeric": "Debés ingresar un número.",
"url": "Debés ingresar una dirección Web válida (por ejemlo: www.misitio.com.ar)。"
};
for (var f = 0; f < allFields.length; f++) {
var $field = $(allFields[f]);
控制台信息($字段);
console.info("--> 字段有类:" + $field.attr("class"));
for (var v = 0; v < validable.length; v++) {
var 有效类 = 有效[v];
if ($field.hasClass(validableClass)) {
console.info("--> 验证 " + validableClass + " 值 <<" + $field.val() + ">>");
console.info("--> 测试结果:validy.is(validableClass, $field.val()) = " + vw.validy.is(validableClass, $field.val()));
console.info("--> isValid 的最后一个值 = " + isValid);
isValid = isValid && (validy.is(validableClass, $field.val()) ? true : false);
console.info("--> isValid 的值现在是 = " + isValid);
休息;
};
}
console.info("** isValid 状态:" + isValid + " **");
如果(!isValid){
console.info("--> 检测到无效字段");
//vw.popoverError($field, "Error", errors[validableClass]);
休息;
};
};
返回是有效的;
};
它的问题是,即使字段值有效,并且isValid == true在执行isValid == isValid && ...操作时,isValid最终还是false.
表达式怎么可能true && true抛出false。
我知道一定有一些我看不到的愚蠢,但我似乎找不到。有人可以帮忙吗?
谢谢!
更新 1
最初,该行:
isValid = isValid && (validy.is(validableClass, $field.val()) ? true : false);
曾是
isValid &= validy.is(validableClass, $field.val();
更新 2
在某些时候,显然该test方法正在返回1or0而不是trueor false。但我无法确定它发生的确切时间。
更新 3
因此,事实证明我在滥用&=评论中提到的运算符。但...
isValid = isValid && validy.is(validableClass, $field.val());
...返回false时isValid == true并独立validy.is返回true。
更新 4
validy.is根据 CaffGeek 的回答更改了定义:
validy.is = 函数(什么,str){
返回 !!formats[what].test(str);
};
不幸的是,它没有效果。