好的,所以我正在尝试使用javascript HTTPRequest来加载名为“chem_vocab.xml”的XML文档。但是,每当我尝试执行该功能时,都不会发生任何事情。我放置了几条警报()线,这样我就可以看到我的故障发生在哪里。似乎在:
之间存在一些问题alert("Beginning Loading");
和
alert("XML Loaded");
页面将正确警告“开始加载...”,但不会警告“已加载XML”。我的问题在哪里?
function load_vocab(){
alert("Beginning Loading...");
var xmlhttp=new XMLHttpRequest();
xmlhttp.open("GET","chem_vocab.xml",true);
xmlhttp.send();
xmlDoc=xmlhttp.responseXML;
alert("XML loaded");
var x=xmlDoc.getElementsByTagName("wordlist")[0];
x= x.getElementsByTagName("word")[0];
word = x.getElementsByTagName("spelling")[0].childNodes[0].nodeValue;
definition = x.getElementsByTagName("definition")[0].childNodes[0].nodeValue;
alert("XML parsing successful");
document.getElementById('spelling').innerHTML = word;
document.getElementById('definition').innerHTML = definition;
}
答案 0 :(得分:4)
您的代码:
xmlhttp.open("GET","chem_vocab.xml",true);
xmlhttp.send();
xmlDoc=xmlhttp.responseXML;
您的Ajax请求是异步的。因此,在发送后无法立即读取.responseXML
属性。 (xmlDoc
的值将为null / undefined。)您必须在readystatechange
回调中执行此操作。
由于您似乎对使用Ajax缺乏经验,请考虑使用第三方Ajax库(例如jQuery,或miniajax,如果您不使用通用库)。
答案 1 :(得分:1)
xmlhttp.onreadystatechange=function()
{
if (xmlhttp.readyState==4 && xmlhttp.status==200)
{
xmlDoc=xmlhttp.responseXML;
alert("XML loaded");
var x=xmlDoc.getElementsByTagName("wordlist")[0];
x= x.getElementsByTagName("word")[0];
word = x.getElementsByTagName("spelling")[0].childNodes[0].nodeValue;
definition = x.getElementsByTagName("definition")[0].childNodes[0].nodeValue;
alert("XML parsing successful");
document.getElementById('spelling').innerHTML = word;
document.getElementById('definition').innerHTML = definition;
}
}
您的代码是异步的。您必须等待响应才能执行xmlDoc=xmlhttp.responseXML;
。因此,您需要为onreadystatechange
事件添加事件处理程序,以便获得响应。这就是上面代码的作用
答案 2 :(得分:0)
您的异步调用并期望它同步返回。使用此代码可使调用无阻塞,因此您永远不会加载响应。
xmlhttp.open("GET","chem_vocab.xml",true); // True means non-blocking, you need a listener
因此,这将始终为空。
xmlDoc=xmlhttp.responseXML;
快速而肮脏的修复according to this document.
xmlhttp.open('GET', 'chem_vocab.xml', false);
xmlhttp.send(); // because of "false" above, will block until the request is done
// and status is available. Not recommended, however it works for simple cases.
if (xmlhttp.status === 200) {
console.log(request.responseText);
xmlDoc=xmlhttp.responseXML;
}