私は、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 == 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を返しているようです。しかし、それが起こる正確な瞬間を特定することはできません。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);
};
残念ながら効果はありませんでした。