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,

      URL: /^((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次に、形式とテスト対象の 2 つのパラメーターを指定してorを返す関数を作成しましたfalse(単なるtestRegExp オブジェクトのメソッドのラッパーです)。

valid.is = function(what, str) {
    フォーマットを返します[何].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 = ["email","phone","numeric","url"];

      変数エラー = {
        "email": "Debés ingresar una dirección de e-mail valida (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": "Web サイトにアクセスしてください (例: www.misitio.com.ar)."
      };

      for (var f = 0; f < allFields.length; f++) {

        var $field = $(allFields[f]);

        console.info($フィールド);
        console.info("--> フィールドにはクラスがあります: " + $field.attr("class"));

        for (var v = 0; v < validable.length; v++) {

          var validClass = 有効な [v];

          if ($field.hasClass(validableClass)) {

            console.info("--> " + validableClass + " 値 <<" + $field.val() + ">>" に対して検証中);
            console.info("--> テスト結果: valid.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 + " **");

        if (!isValid) {

          console.info("--> 無効なフィールドが検出されました");
          //vw.popoverError($field, "Error", errors[validableClass]);
          壊す;

        };

      };

      戻り値は有効です。

    };

それに関する問題は、フィールド値が有効でありisValid == trueisValid == isValid && ...操作を実行すると、 になってisValidしまうことfalseです。

true && true式がスローされる可能性はありますかfalse

目に見えない愚かさがあるに違いないことはわかっていますが、それを見つけることができないようです. 誰かこれに手を貸してくれませんか?

ありがとう!

更新 1

もともと、次の行:

isValid = isValid && (validy.is(validableClass, $field.val()) ? true : false);

だった

isValid &= validy.is(validableClass, $field.val();

更新 2

ある時点で、メソッドがorの代わりにortestを返しているようです。しかし、それが起こる正確な瞬間を特定することはできません。10truefalse

アップデート 3

&=そのため、コメントに記載されているように、演算子を誤用していたことがわかりました。しかし...

isValid = isValid && validy.is(validableClass, $field.val());

...falseいつ戻り、独立しisValid == trueて戻ります。validy.istrue

更新 4

validy.isCaffGeek の回答に従って定義を変更しました。

    valid.is = function(what, str) {

      return !!formats[what].test(str);

    };

残念ながら効果はありませんでした。

4

2 に答える 2

3

!!variable をよく使用して、変数が存在し、正の値であることを確認します。

未定義または false の場合、!!variable は false を返します。変数が定義されていて true または値 (0 以外) を持っている場合、true を返します。

于 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 に答える