JavaScript에서 정말 이상한 문제를 다루고 있습니다. jQuery 필드 목록을 통해 루프를 검사하는 유효성 검사기 스크립트에서 일하고 있어요. 그럼 난 두 개의 매개 변수, 형식과 실험 대상을 제공하는 함수를 만들었습니다 루프에서 논리 연산자를 사용하면 모순이 발생합니다.
var formats = { email: /[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, phone: /(?!:\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, numeric: /(\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
또는
false
반환 (단지 래퍼 : 각각의 검증은 이렇게 가고 객체에 정규 표현식에 연결되어 정규 표현식 객체의 메소드
test
)으로 :
<input type="text" class="field email" id="field-1-1" /> <input type="text" class="field phone" id="field-1-2" /> ...012 : JQuery와 컬렉션
validy.is = function(what, str) { return formats[what].test(str); };
, I는 각 포맷에 따라서 클래스 이름을 가진 요소가 INPUT
3,516,
그런 다음 내 검증 기능은 다음과 같이 간다 : 그것으로
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: [email protected]).", "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)." }; for (var f = 0; f < allFields.length; f++) { var $field = $(allFields[f]); console.info($field); console.info("--> Field has classes: " + $field.attr("class")); for (var v = 0; v < validable.length; v++) { var validableClass = validable[v]; if ($field.hasClass(validableClass)) { console.info("--> Validating against " + validableClass + " with value <<" + $field.val() + ">>"); console.info("--> Test result: validy.is(validableClass, $field.val()) = " + vw.validy.is(validableClass, $field.val())); console.info("--> Last value of isValid = " + isValid); isValid = isValid && (validy.is(validableClass, $field.val()) ? true : false); console.info("--> Value of isValid is now = " + isValid); break; }; } console.info("** Status of isValid: " + isValid + " **"); if (!isValid) { console.info("--> Invalid field detected"); //vw.popoverError($field, "Error", errors[validableClass]); break; }; }; return isValid; };
문제는 필드 값이 유효하고 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
메서드는 true
또는 false
대신 1
또는 0
을 반환합니다. 그러나 정확한 순간을 정확히 지적 할 수는 없습니다.
업데이트 3
는 그래서 코멘트에서 언급 한 바와 같이 나는 &=
연산자를 잘못 사용 된 것으로 나타났다. 하지만 ...
isValid = isValid && validy.is(validableClass, $field.val());
은 ... false
때 isValid == true
및 validy.is
반환 true
독립적으로 반환합니다.
업데이트 4
가 CaffGeek으로 응답하도록 validy.is
정의있어서를 변경 :
validy.is = function(what, str) { return !!formats[what].test(str); };그것은 불행하게도 아무런 영향을 미치지 않습니다.
sidenote : 제 3의'variable = condition? true : false'는 불필요합니다. 그냥'variable = condition'이라고 쓰십시오. – jbabey
그 전에 저는 variable & = condition'을 사용하고있었습니다. –
실제 조건이'validy.is (validableClass, $ field.val()) 인 동안 console.log 문이'vw.validy.is (validableClass, $ field.val())'을 기록하는 특별한 이유가 있습니다. ? 'vw'는 무엇입니까? – jbabey