Моя проблема, кажется, лежит где-то между подфункцией вызова LoadXML. Кажется, что xml-данные становятся нулевыми по какой-то странной причине, и я не знаю, как это исправить. У Stackexchange, похоже, было много похожих вопросов, но многие остались без ответа или ответ, который они не помогли моему делу.Не удается прочитать свойство 'getElementsByTagName' из null, что происходит?
function load() {
var xmlhttp;
xmlhttp = new XMLHttpRequest();
var idname = document.getElementById("name").value;
xmlhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
console.log(this); //it obtains it here...
LoadXML(this, idname);
}
};
xmlhttp.open("GET", "helper_database.xml", false);
xmlhttp.overrideMimeType('text/xml');
xmlhttp.send();
}
function LoadXML(xml, name) {
var x, i, xmlDoc, nametxt, areEqual;
xmlDoc = xml.responseXML;
nametxt = name;
console.log("HERE \n" + xmlDoc); //...but it becomes null.
x = xmlDoc.getElementsByTagName("name"); //this returns the error of "Cannot read property 'getElementsByTagName' of null"
console.log("muuttujan x eka: " + x[0]);
for (i = 0; i < x.length; i++) {
if (areEqual = xmlDoc.getElementsByTagName("name").toUpperCase() === nametxt.toUpperCase()) {
document.getElementById("ComFocus").value = x[i];
}
}
}
Вот helper_database.xml
<Character>
<name>test</name>
<stats>
<Com>1</Com>
<Con>2</Con>
<Cun>3</Cun>
<Dex>4</Dex>
<Mag>5</Mag>
<Per>6</Per>
<Str>7</Str>
<Wil>8</wil>
</stats>
</Character>
Это просто опечатка (Я удивлен, что вы не получаете ошибка в веб-консоли, но я тоже): XML неверен: ' 'Обратите внимание, что конечный тег' wil', а не ''. Исправьте это, и он анализирует, и 'responseXML' заполняется. –
Вместо того, чтобы спотыкаться в темноте с помощью фонаря' console.log', я предлагаю включить свет, используя полнофункциональный отладчик, встроенный в ваш браузер. Используя это, вы можете посмотреть 'this' в обработчике' onreadystatechange' и увидеть, что его свойство 'responseXML' -' null'. –
Как T.J. Кроудер написал, что это тип в XML-файле. Кроме того, у вас возникнут проблемы с равной проверкой. 'xmlDoc.getElementsByTagName (" name ")' - это коллекция, поэтому не будет '.toUpperCase()'. Вы должны сделать что-то вроде этого: 'xmlDoc.getElementsByTagName (" name ") [i] .innerHTML.toUpperCase()' или shorter 'x [i] .innerHTML.toUpperCase()' –