1

我正在处理 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

    };

然后我创建了一个函数,它给定两个参数,格式和测试主体,返回truefalse(仅仅是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());

...返回falseisValid == true并独立validy.is返回true

更新 4

validy.is根据 CaffGeek 的回答更改了定义:

    validy.is = 函数(什么,str){

      返回 !!formats[what].test(str);

    };

不幸的是,它没有效果。

4

2 回答 2

3

我经常使用 !!variable 来确保变量存在并且它具有正值。

如果未定义或为假,!!variable 将返回假,如果已定义且为真或有值(非 0),则返回真

于 2012-11-16T18:57:24.133 回答
1

尝试改变

validy.is = function(what, str) {
    return formats[what].test(str);
};

为此,以确保它是一个布尔结果。

validy.is = function(what, str) {
    return !!formats[what].test(str);
};

我没有对此进行测试,但是您不需要使用 jQuery 的所有循环。它是基于设置的。您可以通过这种方式简化您的代码。

formBuilder.validate = function() {
    console.info("=== STARTING VALIDATE ===");

    var isValid = true;
    var allFields = $(".field", formBuilder.form).toArray();
    var validable = ["email", "phone", "numeric", "url"];

    var errors = {
        "email": "Debés ingresar una dirección de e-mail válida (por ejemplo: juanperez@gmail.com).",
        "phone": "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 ejemplo: www.misitio.com.ar)."
    };

    var failedFields = $('EMPTYJQUERYSET');

    $.each(validable, function(index, className) {
        failedFields.add(
            allFields.filter('.' + className).filter(function(index) {
                return ! validy.is(validableClass, $(this).val());
            });
        );
    });

    isValid = !!(failedFields.length == 0);

    console.info("** Status of isValid: " + isValid + " **");

    if (!isValid) {
        console.info("--> Invalid field detected");
        //vw.popoverError($field, "Error", errors[validableClass]);
        break;
    };

    return isValid;
};
于 2012-11-16T18:59:00.040 回答