2013-07-23 4 views
0

내가 얻을 오류 : 다음과 같은 자바 스크립트 코드와catch되지 않은 형식 오류 자바 스크립트

Uncaught TypeError: Cannot read property 'length' of undefined

: varId있을 수 있습니다 또는에 있지 않을 수 있습니다 입력 요소의 ID입니다

var varId = $("#someInputId"); 
if (typeof varId !== "undefined" && varId.val().length == 0) 

HTML 페이지

요소가 정의되지 않은 경우 두 번째 절이 계산되지 않는다고 가정합니다.

왜 그런 오류가 발생합니까?

+4

'underfined'을 다음과 같이 그러니까 기본적으로

, 당신은 식을 다시 작성할 수 있습니다? '정의되지 않았다 '는 뜻입니까? –

+0

varId.length가 varId.val()이 아닙니다. 길이가 –

+1

입니다. Roger Goodell이 개발 한 새로운 NFL 앱입니까? 충분한 벌금을 받았는지 또는 '과소 평가'를 받았는지 여부를 결정하는 곳입니까? –

답변

0

undefined (즉, undefined.length)의 길이를 사용하려고합니다. '잡히지 않은 TypeError'오류가 발생합니다.

분명히 $("#someInputId")이 정의되지 않았거나 결과를 반환하지 않습니다. 대체로 $("#someInputId")은 결과를 반환하지 않으며 빈 세트의 값은 정의되지 않습니다.

$()은 항상 jQuery 객체를 인스턴스화하기 때문에 조건부 검사는 두 번째 절에 도달합니다. 그러나 jQuery 객체가 비어 있으면 값은 정의되지 않습니다.

가이 오류를 방지하려면, 당신은 당신의 쿼리 결과를 반환하는지 확인해야합니다

var varId = $("#someInputId"); 
if (varId.length > 0 && varId.val().length === 0) { 

을 그 #someInputId가 존재에 onlu이 0

+0

어? '$()'는 jQuery 객체를 반환하므로'varId' *는 jQuery 객체입니다. –

+0

@FelixKling, OP는 게시 된 후 몇 분 후에 질문을 편집했습니다.내 편집 내용이 수정 사항을 반영합니다. 방금 중간에서 대화에 참여했습니다. ;) –

+0

아, 이제 알겠습니다. 죄송합니다! –

-1

의 값이 있으면 true가됩니다 조건 jQuery는 val() 함수입니다.

<script type="text/javascript" src="http://code.jquery.com/jquery-2.0.3.min.js"></script> 
<input id="varId" value="varIdValue" /> 
<p id="output"></p> 
<script type="text/javascript"> 
    var varId = $("#varId"); 
    var output = $("#output"); 
    output.html((typeof varId == "undefined") + ' ' + varId.val() + ' ' + varId.val().length); 
</script> 

출력은 다음과 같습니다

var varId = document.getElementById('varId'); 
var output = document.getElementById('output'); 
output.innerHTML = (typeof varId == "undefined") + ' ' + varId.value + ' ' + varId.value.length; 

그리고 출력은 동일 줘야 : false varIdValue 10

당신이 jQuery를 사용하지 않으면 다음과 같은 value 속성을 사용해야합니다 false varIdValue 10

수정

var varId = document.getElementById('doesntExist'); 
var varIdIsObject = (typeof varId == "object"); 

varIdnull되며 varIdIsObject

그러나 jQuery를에 true가됩니다 :

var varId = $('#doesntExist'); 

varId 2 개 필드의 jQuery 객체가 될 것입니다 : context (HTMLDocument의)와 selector (우리의 변종 인에 '#doesntExist').경우에도

if (varId.length && ...) { 

$항상 jQuery를 개체를 반환합니다 : (가) 요소가 존재하지 않음을 할 수있는 경우

0

Where varId is id of input element that may be or not in the ntml page.

, 당신은 jQuery 오브젝트 요소가 하나라도 있는지 확인해야 어떤 요소도 선택하지 않았습니다. 그러므로 절대로 undefined이 아닙니다. 그러나 빈 선택에 .val을 호출하면 undefined가 반환됩니다.

DOM을 준비한 후에도 코드를 실행하고 있는지 확인하십시오. 이 작업을 수행하는 방법은 jQuery tutorial "How jQuery Works"을 참조하십시오.

0

는 jQuery 오브젝트 아마 비어 있기 때문에 이런 일이

if ($("#someInputId").val()!= undefined && 
      $("#someInputId").val().length == 0) 
2

을보십시오.

그냥 단계에서 코드 단계를 통해 가자 :

var varId = $("#someInputId"); 

그래서이 후, 당신은 varId 참조하는 jQuery를 개체가 있습니다. 이 요소는 반환 된 요소의 수에 관계없이 개체 인입니다. 여기

if (typeof varId !== "undefined" && varId.val().length == 0) 

우선,이 질문에 그냥 오타가 있다면 확실하지 ==해야 = 지금 당신은 이렇게!.

어쨌든 typeof varId != "undefined" 부분을 생각해보십시오. varId가 객체이고 정의되지 않았으므로 true를 반환합니다. 이것이 사실이므로 조건 평가는 다음 부분으로 이동합니다. 따라서 varId.val().length == 0을 평가하는 중에 오류 Uncaught TypeError: Cannot read property 'length' of undefined이 표시됩니다. 무언가가 length 속성을 갖기 위해서는 문자열이나 배열이어야하고, jQuery에서 val()은 문자열을 반환하거나 다중 선택 입력의 경우 배열을 반환합니다. 그러나 jQuery 객체가 비어 있으면 val()은 길이 속성이없는 undefined을 반환합니다.

if (varId.length && varId.val().length === 0) { 
    // Do something 
} 
+1

다음은 사실이 아닙니다 :'! =='는'! ='이어야합니다. 사실, 완전한 동등 함을 테스트하지 않는 * 아주 좋은 이유가 없다면 항상'==='와'! =='를 사용하는 습관이 있어야합니다. –

+0

Noted, 답을 제거하십시오. – godfrzero

+0

쿼리가 객체를 반환하지 않아도 'varId.length'가 여전히 정의되어 있으므로 테스트가 작동하지 않습니다. –

관련 문제