2011-08-05 28 views
1

我一直在寫這段代碼動態地加載從通過AJAX檢索XML文檔照片的鏈接。我有一個全局varibale xDoc,用於存儲響應XML,並在其他函數中使用,這樣我就不必每次都加載文檔。請記住,我對JavaScript很新,所以細節會很棒。的JavaScript的getElementsByTagName()不確定,IE故障,AJAX XML文件

我得到這個錯誤在Chrome:「遺漏的類型錯誤:無法調用未定義的方法‘的getElementsByTagName’」,而類似的錯誤信息在其他瀏覽器。不過,我的代碼仍然適用於FireFox,Chrome和Safari。但是,當涉及到IE時,每個版本都無法正常工作。我不明白什麼是錯的,爲什麼這個元素是未定義的。

錯誤線被清楚地標記在下面的代碼。這是「eProject.link = eProject.photo.getElementsByTagName(」edit「)[0] .firstChild.data;」

我的XML的數據結構如下:

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

那麼這是JavaScript:

// 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

我是正確,你有兩個迴路一個在另一個內部在他們兩個你使用「我」變量作爲迭代器?你不應該在第二個循環中使用「j」嗎?

+0

是的,但它完美地工作,因爲我將i重置爲0,如果ID匹配彼此。當if語句分支時,outer 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

這個改變確實有助於擺脫firefox,chrome和safari中的錯誤,謝謝。可悲的是,現在我在IE中遇到問題,圖像被放入src屬性中。 –

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