2012-11-16 2 views
1

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 && ... 작업을 수행 할 때, isValidfalse되는 끝나는 것입니다.

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());

은 ... falseisValid == truevalidy.is 반환 true 독립적으로 반환합니다.

업데이트 4

가 CaffGeek으로 응답하도록 validy.is 정의있어서를 변경 :

 
    validy.is = function(what, str) { 

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

    }; 

그것은 불행하게도 아무런 영향을 미치지 않습니다.

+2

sidenote : 제 3의'variable = condition? true : false'는 불필요합니다. 그냥'variable = condition'이라고 쓰십시오. – jbabey

+0

그 전에 저는 variable & = condition'을 사용하고있었습니다. –

+0

실제 조건이'validy.is (validableClass, $ field.val()) 인 동안 console.log 문이'vw.validy.is (validableClass, $ field.val())'을 기록하는 특별한 이유가 있습니다. ? 'vw'는 무엇입니까? – jbabey

답변

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: [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)." 
    }; 

    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; 
}; 
+0

지금 당장 귀하의 솔루션을 테스트하고 있습니다. –

3

나는 variable을 많이 사용하여 변수가 존재하고 양수 값을 갖고 있는지 확인합니다.

이 정의 또는 거짓 인 경우는 정의 true 또는 값이 0이 아닌 사실

관련 문제