2012-08-05 2 views
1

나는 최신 버전의 Opera에서 일하고있다. 그것은 Microdata API를 지원하지만 다음 코드를 입력하면 작동하지 않습니다.왜이 자바 스크립트가 오류를 던지고 있습니까?

<head> 
<script type="text/javascript"> 
     var user = document.getItems('http://schema.org/Person')[0]; 
     alert('Hi there ' + user.properties['name'][0].textContent + '!'); 
     function supports_microdata_api() { 
      return !!document.getItems; 
     } 
     alert(supports_microdata_api()); 
     </script> 
    </head> 
<body> 
<div itemscope itemtype="http://schema.org/Person"> 
    <span itemprop="name">Fatima Zohra</span> 
    <img src="" itemprop="image" /> 
</div> 

누구든지 내가 뭘 잘못하고 있다고 말할 수 있습니까?

+2

질문을 편집하여 "작동하지 않음"대신 _actual_ 오류 메시지를 추가하면 매우 유용합니다. – Ben

+1

Opera Developer Tools 콘솔을 사용하면 * Uncaught 예외가 발생합니다. TypeError : 'user'를 오브젝트로 변환 할 수 없습니다. 30 행 8 열 *에 오류가 발생했습니다. –

+0

간단한 JS 오류, Microdata와 관련이 없음 –

답변

2

페이지가로드 될 때까지 기다려야합니다. 당신은 뭔가를 요구하고 있습니다 :

document.getItems('http://schema.org/Person')[0] 

그것은 아직 DOM의 일부가 아닙니다. DOM이 "아직 보이지 않는"요소를 인식하기 전에 코드가 실행됩니다.

을 사용하면 요소가 구문 분석 된 후 발생하는 onload 이벤트가 발생하기를 기다릴 수 있습니다.

http://jsfiddle.net/eY63s/2/

window.onload = function(){ 
    var user = document.getItems('http://schema.org/Person')[0]; 
    console.log(user); 
    console.log('user.properties Name: ' + user.properties['name'][0].textContent); 
    function supports_microdata_api() { 
     return !!document.getItems; 
    } 
    console.log(supports_microdata_api()); 
}; 
또는 교대, 페이지 순서에 DOM 요소 후 코드 을 넣어.

window.addEventListener('load', function(){ 
    var user = document.getItems('http://schema.org/Person')[0]; 
    console.log(user); 
    console.log('user.properties Name: ' + user.properties['name'][0].textContent); 
    function supports_microdata_api() { 
     return !!document.getItems; 
    } 
    console.log(supports_microdata_api()); 
}); 

http://jsfiddle.net/eY63s/3/

IE 지원 element.attachEvent 적어도 이전 버전 대신, IE9 or later 브라우저/element.addEventListener을 지원 않지만 :

더 현대적인 방법은 이벤트 위임을 사용하는 것입니다.

그리고이 방법 확인 및 통화 할 수있는 안전한 방법입니다

window.addEventListener('load', function(){ 
    var user; 

    function supports_microdata_api() { 
     return !!document.getItems; 
    } 

    console.log('Microdata support: ' + supports_microdata_api()); 

    if (supports_microdata_api()) { 
     user = document.getItems('http://schema.org/Person')[0]; 
     console.log(user); 
     console.log('user.properties Name: ' + user.properties['name'][0].textContent); 
    } 
}); 

http://jsfiddle.net/eY63s/4/

주 클로저를 만들고에 탈출 user을 방지 익명 함수 내부 var user의 사용을 글로벌 범위. 이것은 변수를 처리하는 "더 나은"방법으로, 전역 공유로 인해 실수로 덮어 쓰지 않도록 방지 할 수 있습니다. 반면에 해당 범위 외부에서는 user으로 전화를 걸 수 없습니다. 그렇지만 쉽지는 않을지 몰라도 나쁜 습관이 있으며 때로는 오류를 찾기가 어려울 수 있습니다.

+0

감사합니다. 작동합니다! :) –