2009-05-19 5 views
1

배경 : Google 웹 앱은 jquery.constrain.js 플러그인을 사용하여 일부 텍스트 상자의 데이터 입력을 처리하여 유효한 문자 만 추가 할 수 있도록합니다. 이 플러그인은 정규 표현식, 화이트리스트/블랙리스트 문자 등을 사용하여 데이터에 대한 다양한 제약을 허용합니다. 오늘까지는이 플러그인의 1.0 릴리스를 수정하지 않았습니다.JQuery "Constrain"플러그인 - 이상한 자바 스크립트 오류

몇일 전에 일부 텍스트 상자에 잘못된 데이터 입력이 허용되었음을 알았습니다. 예를 들어 숫자 전용 텍스트 상자에는 알파 문자 등이 허용됩니다. 또한 "개체가이 속성 또는 메서드를 지원하지 않습니다."라는 자바 스크립트 오류가 표시되었습니다. 나는 jquery.constrain 플러그인의 다음 함수를 추적했다. 문자정규식

  • item.chars :

    • 항목 개의 문자열 속성 목적 : 코드 블록을 통해

      function match(item, input, e) { 
           var arr = item.chars.split(""); 
           for (var i in arr) { 
            var token = arr[i]; 
            if (token.charCodeAt(0) == e.which) { 
             return true; 
            } 
           } 
           if (item.regex) { 
            var re = new RegExp(item.regex); 
            if (re.test(String.fromCharCode(e.which))) { 
             return true; 
            } 
           } 
      
           return false; 
          }; 
      

      디버깅, I는 다음의 결정은 실패시 빈 문자열 ("")입니다.

    • arr, 결과는 입니다. item.chars.split ("")은 예상대로 빈 배열입니다.

    여기가 이상합니다. arr이 빈 배열 인 경우에도 for 루프는 에 유효한 값을 할당합니다. 값은 "제거"입니다. 그래서 우리는 그 고리에 빠져 들었습니다. 토큰은 분명히 null입니다. 왜냐하면 arr [ "remove"]가 null이기 때문입니다. 그래서 token.charCodeAt (0)이 던졌습니다. 다음과 같이

    내가 루프에 대한 주위의 경우 문을 추가하여 오류를 수정 : 그러나

     if (arr.length > 0) { 
          for (var i in arr) { 
           var token = arr[i]; 
           if (token.charCodeAt(0) == e.which) { 
            return true; 
           } 
          } 
         } 
    

    , 나는 완전히이도 필요이었다 이유에 당황하고있어 -이 IE의 버그입니다 , 플러그인의 버그, 또는 내가 방금 앱을 컴파일 할 때 잘못 숨 쉬고 있습니까?

  • 답변

    1

    배열을 반복 할 때 (i in arr)를 사용하지 마십시오. 스크립트가 Array 프로토 타입에 메소드를 추가하면 for (i in arr) 루프를 사용하여 반복됩니다. 이것은 아마도 당신의 오류를 일으키는 원인 일 것입니다. 아마 Array.prototype 체인을 수정하는 스크립트를 추가했을 것입니다. "당신이 반복하는 ...의 사용을 중지하지 (또는 결코 그것을 차지)해야하는 이유"

    는 또한 아래에 여기 읽을
    http://www.prototypejs.org/api/array

    +0

    네, 그건 그 것이었다. JQuery는 Array.prototype을 수정 한 다음 좀 더 추가했습니다. 나는 플러그인 작성자에게 알려주고 로컬 버전도 수정하도록 할 것이다. – GalacticCowboy