我正在处理 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
(仅仅是test
RegExp 对象的方法的包装):
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
方法正在返回1
or0
而不是true
or 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); };
不幸的是,它没有效果。