私は、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
(単なるtest
RegExp オブジェクトのメソッドのラッパーです)。
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 == 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
ある時点で、メソッドがorの代わりにortest
を返しているようです。しかし、それが起こる正確な瞬間を特定することはできません。1
0
true
false
アップデート 3
&=
そのため、コメントに記載されているように、演算子を誤用していたことがわかりました。しかし...
isValid = isValid && validy.is(validableClass, $field.val());
...false
いつ戻り、独立しisValid == true
て戻ります。validy.is
true
更新 4
validy.is
CaffGeek の回答に従って定義を変更しました。
valid.is = function(what, str) { return !!formats[what].test(str); };
残念ながら効果はありませんでした。