Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/458.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 无法读取属性';getElementsByTagName';如果为空,发生了什么?_Javascript_Xml_Xmlhttprequest - Fatal编程技术网

Javascript 无法读取属性';getElementsByTagName';如果为空,发生了什么?

Javascript 无法读取属性';getElementsByTagName';如果为空,发生了什么?,javascript,xml,xmlhttprequest,Javascript,Xml,Xmlhttprequest,我的问题似乎介于LoadXML的子函数调用之间。由于某种奇怪的原因,xml数据似乎变为null,我不知道如何修复它。Stackexchange似乎有很多类似的问题,但很多问题都没有答案,或者他们的答案对我的情况没有帮助 function load() { var xmlhttp; xmlhttp = new XMLHttpRequest(); var idname = document.getElementById("name").value; xmlhttp.o

我的问题似乎介于LoadXML的子函数调用之间。由于某种奇怪的原因,xml数据似乎变为null,我不知道如何修复它。Stackexchange似乎有很多类似的问题,但很多问题都没有答案,或者他们的答案对我的情况没有帮助

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];
        }
    }
}
函数加载(){
var-xmlhttp;
xmlhttp=新的XMLHttpRequest();
var idname=document.getElementById(“name”).value;
xmlhttp.onreadystatechange=函数(){
if(this.readyState==4&&this.status==200){
console.log(this);//它在这里获得它。。。
LoadXML(this,idname);
}
};
open(“GET”,“helper_database.xml”,false);
overrideMimeType('text/xml');
xmlhttp.send();
}
函数LoadXML(xml,名称){
变量x、i、xmlDoc、nametxt、areEqual;
xmlDoc=xml.responseXML;
nametxt=名称;
log(“HERE\n”+xmlDoc);/…但它变为null。
x=xmlDoc.getElementsByTagName(“名称”);//返回“无法读取null的属性'getElementsByTagName'的错误”
console.log(“muuttujan x eka:+x[0]);
对于(i=0;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>

测试
1.
2.
3.
4.
5.
6.
7.
8.

您有一些typeo以及一些解析错误。
请注意:

  • getElementsByTagName().toUpperCase
    无效,因为gEBTN返回对象数组。因此,您必须使用
    getElementsByTagName()[i].innerHTML.toUpperCase()
  • 而不是使用
    console.log(“muuttujan x eka:+x[0])
    ,使用
    console.log(“muuttujan x eka:+x[0].innerHTML)
函数加载(){
var-xmlhttp;
xmlhttp=新的XMLHttpRequest();
var idname=document.getElementById(“name”).value;
xmlhttp.onreadystatechange=函数(){
if(xmlhttp.readyState==4&&xmlhttp.status==200){
console.log(xmlhttp);//它在这里获得它。。。
LoadXML(xmlhttp,idname);
}
};
open(“GET”,“helper_database.xml”,false);
//overrideMimeType('text/xml');
xmlhttp.send();
}
函数LoadXML(xml,名称){
变量x、i、xmlDoc、nametxt、areEqual;
xmlDoc=xml.responseXML;
nametxt=名称;
log(“HERE\n”+xmlDoc);/…但它变为null。
x=xmlDoc.getElementsByTagName(“名称”);//返回“无法读取null的属性'getElementsByTagName'的错误”
log(“muuttujan x eka:+x[0].innerHTML);
对于(i=0;i


这只是一个输入错误(我很惊讶您在web控制台中没有收到错误,但我也没有):XML格式不正确:
8
请注意,结束标记是
wil
,而不是
。修复这个问题,它会解析并填充
responseXML
。与其在黑暗中用
console.log
torch蹒跚而行,我建议使用浏览器内置的功能齐全的调试器打开指示灯。使用它,您可以查看
onreadystatechange
处理程序中的
this
,看到它的
responseXML
属性是
null
。就像T.J.Crowder写的那样,它是XML文件中的一种类型。此外,您将在平等检查中遇到问题
xmlDoc.getElementsByTagName(“名称”)
是一个集合,因此不会有
.toUpperCase()
。除了其他注释外,还必须执行类似于
xmlDoc.getElementsByTagName(“名称”)[i].innerHTML.toUpperCase()
或更短的
x[i].innerHTML.toUpperCase()
的操作,给定
xmlhttp.open(“GET”,“helper\u database.xml”,false)
执行同步请求,根本不需要设置
onreadystatechange
事件处理程序,您还可以尝试在
send()
调用后处理响应。一般来说,您应该尝试使用
xmlhttp.open(“GET”,“helper\u database.xml”,true)
来使用异步请求,那么onreadystatechange处理程序至少是有意义的。我非常感谢所有这些评论和反馈。我不知道xml标记区分大小写。