JavaScript getElementsByTagName () Не определено, ошибка IE, файл AJAX XML - PullRequest
1 голос
/ 05 августа 2011

Я писал этот код для динамической загрузки ссылок на фотографии из документа XML, полученного через AJAX. У меня есть глобальная переменная xDoc, в которой хранится XML-ответ и который я использую в других функциях, чтобы мне не приходилось каждый раз загружать документ. Пожалуйста, имейте в виду, что я довольно плохо знаком с JavaScript, поэтому детали были бы отличными.

Я получаю эту ошибку в Chrome: «Uncaught TypeError: Невозможно вызвать метод« 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;
    }
}

}

Ответы [ 3 ]

1 голос
/ 05 августа 2011

Я думаю, вы хотите это в цикле for for (i; i < pCount; i = i + 1) { (обратите внимание на i <) - в противном случае он просто проверяет, определено ли pCount и будет ли оно работать неограниченное время. Я подозреваю, что это ошибка, когда i становится больше, чем количество элементов, которые у вас есть в eProject.phot, в этот момент eProject.photo будет неопределенным.

1 голос
/ 05 августа 2011

Правильно ли, что у вас есть два цикла один внутри другого, и в обоих из них вы используете переменную "i" в качестве итератора? Вы не должны использовать «J» во втором цикле?

0 голосов
/ 10 декабря 2015
var t = quotes[i].getElementsByTagName("t")[0].childNodes[0].nodeValue;
...