2011-08-05 5 views
1

AJAX를 통해 검색된 XML 문서에서 사진 링크를 동적으로로드하기 위해이 코드를 작성했습니다. 응답 XML을 저장하는 전역 varibale xDoc이 있으며 매번 문서를로드 할 필요가 없도록 다른 함수에서 사용합니다. JavaScript에 대해서는 상당히 익숙하지 않으므로 자세한 내용은 훌륭합니다.JavaScript getElementsByTagName() 정의되지 않음, IE 실패, AJAX XML 파일

Chrome에서이 오류가 발생합니다. '잡히지 않은 TypeError :'getElementsByTagName '이 (가) 정의되지 않은'getElementsByTagName '을 호출 할 수 없으며 다른 브라우저에서도 유사한 오류 메시지가 표시됩니다. 그러나 내 코드는 여전히 FireFox, Chrome, Safari에서 작동합니다. 그러나 IE의 경우 모든 버전이 작동하지 않습니다. 나는 무엇이 잘못되었는지, 왜 그 요소가 정의되지 않은지 이해할 수 없다.

오류 코드는 아래 코드에 명확하게 표시되어 있습니다. 이것은 "eProject.link = eProject.photo.getElementsByTagName ("edit ") [0] .firstChild.data;"

<project> 
    <stuff> 
    <stuff> 
    <photos> 
    <photo> 
     <stuff> 
     <edit> 
    </photo> 
    </photos> 
</project> 

그런 다음이 자바 스크립트입니다 : 다음과 같이

내 XML의 데이터 구조는

// Initialize 
function init() { 
    // Set the xml file 
    loadXMLDoc("../xml/featured.xml"); 
} 
window.onload = init; 

// Define xDoc global variable 
var xDoc; 
var proImages = new Array(); 

// Retrieve XML document as document object 
function loadXMLDoc(url) { 
    var req = null; 
    try { 
     req = new XMLHttpRequest(); 
     req.overrideMimeType("text/xml"); 
    } 
    catch(e) { 
     req = null; 
    } 
    if (req) { 
     xDoc = null; 
     req.open("GET", url, true); 
     req.onreadystatechange = function() { 
      if (req.readyState == 4) { 
       if (req.status == 200) { 
        xDoc = req.responseXML; 
        if (xDoc && typeof xDoc.childNodes != "undefined" && xDoc.childNodes.length == 0) { 
         xDoc = null; 
        } 
        else { 
         eProject = xDoc.getElementsByTagName("project")[0]; 
         eProject.id = eProject.getElementsByTagName("id")[0].firstChild.data; 
         getProject(eProject.id); 
        } 
       } 
      } 
     } 
     req.send(null); 
    } 
} 



function getProject(id) { 
count = xDoc.childNodes.length; 
i = 0; 
for (i; count; i = i + 1) { 
    eProject = xDoc.getElementsByTagName("project")[i]; 
    eProject.id = eProject.getElementsByTagName("id")[0].firstChild.data; 
    if (eProject.id == id) { 

     // Remove old numbers 
     cImages = document.getElementById("cImages"); 
     if (cImages.firstChild) { 
      while (cImages.firstChild) 
      { 
       cImages.removeChild(cImages.firstChild); 
      } 
     } 

     // Reset Array 
     proImages.length = 0; 

     eProject.photos = eProject.getElementsByTagName("photos")[0]; 
     eProject.phot = eProject.photos.getElementsByTagName("photo"); 
     pCount = eProject.phot.length; 
     i = 0; 
     for (i; pCount; i = i + 1) { 
      /* 
      * THIS IS WHERE THE ERROR IS 
      */ 

      eProject.photo = eProject.phot[i]; 
      // This is the line of code that generates the error message 
      eProject.link = eProject.photo.getElementsByTagName("edit")[0].firstChild.data; 
      proImages[i] = eProject.link; 
      dynamImg = document.getElementById('dynamImg'); 
      dynamImg.src = proImages[0]; 
      dynamImg.setAttribute('onclick', 'getNumImg(1)'); 
      nButton = document.createElement('button'); 
      nButtonTxt = document.createTextNode(i + 1); 
      nButton.appendChild(nButtonTxt); 
      nButton.type = "button"; 
      nButton.value = i; 
      if (nButton.value == '0') { 
       nButton.setAttribute('id', 'nButtonSelect'); 
      } 
      nButton.setAttribute('onclick', 'getNumImg(' + i + ')'); 
      cImages.appendChild(nButton); 
     } 
     break; 
    } 
} 

}

+0

이것은 jQuery와 같은 것을 사용하면 훨씬 쉬울 것입니다. – Dutchie432

+0

XML을 초기화 한 방법을 추가했습니다. –

답변

1

난 당신이 다른 내부 두 개의 루프를 가지고 수정 있습니까 그리고 둘 다 iterator로 "i"변수를 사용합니까? 두 번째 루프에서 "j"를 사용하지 않아야합니까?

+0

네,하지만 id가 서로 일치하면 i를 0으로 재설정하므로 완벽하게 작동합니다. 해당 if 문이 분기 될 때 외부 for 루프는 다시 실행할 필요가 없으므로 "break;" 거기에. –

+0

은 (i; pCount; i = i + 1)에 대해 과 함께 모든 것이 있습니다. 은 mkk

1

나는 당신의 for 루프에서 이것을 원한다고 생각한다. for (i; i < pCount; i = i + 1) { (주의 : i <에 주목하라.) 그렇지 않으면 pCount가 정의되어 있는지, 무한히 실행되는지를 확인하는 것이다. ieProject.phot에있는 요소의 수보다 커지면 eProject.photo이 정의되지 않을 것이라고 생각합니다.

+0

그 변화는 파이어 폭스, 크롬 및 사파리의 오류를 제거하는 데 도움이되었습니다. 감사합니다. 안타깝게도 src 속성에 이미지가 삽입되어 IE에서 문제가 발생했습니다. –

-2
var t = quotes[i].getElementsByTagName("t")[0].childNodes[0].nodeValue;