我不知道它是否“有效”,但我得出结论,因为这里发布的代码有效(除了for循环中的内容(愚蠢的DOM),但这不是焦点)仅在两个之后点击。我假设这是因为它没有获取XML文档,直到它被创建,这是在第一次点击结束时。
但是,如果我在onreadystatechange函数之前放置XMLhttpRequest.open和XMLHttpRequest.send方法,则代码将不会在嵌套的if语句(检查readystate / status的语句)中执行。我用alert或document.write测试了这个。
任何想法出了什么问题?
if (window.XMLHttpRequest)
{
var xmlhttp = new XMLHttpRequest();
}
function lessonList()
{
var xmldoc = xmlhttp.responseXML;
xmlhttp.onreadystatechange = function()
{
if (xmlhttp.readyState == 4 && xmlhttp.status == 200)
{
var getTitle = xmldoc.getElementsByTagName('title');
var lessonList = document.getElementById('lesson-list');
for (i = 0; i < getTitle.length; i++)
{
var lessonTitle = document.createElement('li');
lessonTitle.nodeValue = getTitle[i].childNodes[0].nodeValue;
lessonList.appendChild(lessonTitle);
}
}
};
xmlhttp.open("GET", 'file.xml', true);
xmlhttp.send(null);
}
答案 0 :(得分:3)
发生的事情是,第二次单击按钮时,它会“成功”,因为它使用第一次单击时的响应。它第一次不起作用,因为代码在加载之前尝试获取对XML文档的引用,因此xmldoc
实际上是null而不是您想要的服务器响应。您需要将行var xmldoc = xmlhttp.responseXML;
移动到内部函数中。
答案 1 :(得分:3)
+1 idealmachine的答案。为了澄清,没有一个Document
实例与单个XMLHttpRequest
相关联,其中从响应中加载XML只会更新文档的内容。这与调用Document.load()
不一样。
相反,当发送请求时,XMLHttpRequest
对象会丢弃其Document
引用的旧responseXML
,并且当收到响应时,它会创建一个新的Document
1}}响应的实例。如果您保留对responseXML
的旧值仍然有效Document
的引用,但它是上一个响应中的旧XML文档,而不是新的。
另外请记住for循环中的var i
以避免意外全局。在nodeValue
节点上设置Element
毫无意义;你需要document.createTextNode(string)
并附加它。
您通常会使用辅助函数来获取/设置Element的文本内容,因为传统的DOM会让它变得如此痛苦。 DOM Level 3 Core的element.textContent
属性是一种简单的方法,但它在IE或某些旧浏览器中不存在。