-5

好的,所以我正在尝试使用 javascript HTTPRequest 来加载一个名为“chem_vocab.xml”的 XML 文档。但是,每当我尝试执行该功能时,什么都不会发生。我放置了几行 alert() ,这样我就可以看到我的故障发生在哪里。之间似乎存在一些问题:

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;

}

4

3 回答 3

4

你的代码:

xmlhttp.open("GET","chem_vocab.xml",true);
xmlhttp.send();
xmlDoc=xmlhttp.responseXML; 

您的 Ajax 请求是异步的。因此,您无法.responseXML在发送后立即读取该属性。(的值xmlDoc将为空/未定义。)您必须在readystatechange回调中执行此操作。

由于您似乎没有使用 Ajax 的经验,因此请考虑使用第三方 Ajax 库(例如 jQuery 或miniajax ,如果您不使用通用库)。

于 2012-08-16T18:21:23.053 回答
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,以便你有响应。这就是上面代码的作用

于 2012-08-16T18:21:35.550 回答
0

您异步调用并期望它同步返回。使用此代码使调用非阻塞,因此您永远不会加载响应。

xmlhttp.open("GET","chem_vocab.xml",true); // True means non-blocking, you need a listener

因此,这将始终为空。

xmlDoc=xmlhttp.responseXML; 

根据本文档进行快速而肮脏的修复。

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;
}
于 2012-08-16T18:24:58.637 回答