使用JavaScript和XHTML:XMLHttpRequest';如果在onreadystatechange之前打开/发送不起作用

使用JavaScript和XHTML:XMLHttpRequest';如果在onreadystatechange之前打开/发送不起作用,javascript,ajax,xhtml,Javascript,Ajax,Xhtml,我不知道它是否“有效”,但我总结这一点是因为这里发布的代码只有在两次单击后才有效(除了for循环中的内容(愚蠢的DOM),但这不是重点)。我假设这是因为在第一次单击结束时创建XML文档之前,它不会获取XML文档 但是,如果我将XMLhttpRequest.open和XMLhttpRequest.send方法放在onreadystatechange函数之前,代码将不会在嵌套的if语句(检查readystate/status的语句)中执行。我已经用alert或document.write对此进行了测

我不知道它是否“有效”,但我总结这一点是因为这里发布的代码只有在两次单击后才有效(除了for循环中的内容(愚蠢的DOM),但这不是重点)。我假设这是因为在第一次单击结束时创建XML文档之前,它不会获取XML文档

但是,如果我将XMLhttpRequest.open和XMLhttpRequest.send方法放在onreadystatechange函数之前,代码将不会在嵌套的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);
}
if(window.XMLHttpRequest)
{
var xmlhttp=new XMLHttpRequest();
}
函数lessonList()
{   
var xmldoc=xmlhttp.responseXML;
xmlhttp.onreadystatechange=函数()
{
if(xmlhttp.readyState==4&&xmlhttp.status==200)
{
var getTitle=xmldoc.getElementsByTagName('title');
var lessonList=document.getElementById('lesson-list');
for(i=0;i
发生的情况是,第二次单击按钮时,它“成功”,因为它使用了第一次单击时的响应。它第一次不起作用,因为代码试图在加载XML文档之前获取对它的引用,所以
xmldoc
实际上是空的,而不是您想要的服务器响应。您需要移动行
var xmldoc=xmlhttp.responseXML编码到内部函数中。

+1 idealmachine的答案。要澄清的是,没有一个
文档
实例与单个
XMLHttpRequest
关联,从响应加载XML只会更新文档的内容。这不像调用
Document.load()

相反,当发送请求时,
XMLHttpRequest
对象会删除其
responseXML
引用的旧
文档
,当收到响应时,它会使用响应创建一个新的
文档
实例。如果保留了对
responseXML
旧值的引用,则仍然是有效的
文档
,但它是前一个响应中的旧XML文档,而不是新文档

另外,请记住for循环中的
var i
,以避免意外的全局错误。并且在
元素
节点上设置
节点值
是无意义的;您需要
document.createTextNode(string)
并附加它


您通常会使用一个helper函数来获取/设置元素的文本内容,因为传统的DOM让它非常麻烦。DOM Level 3 Core的
元素。textContent
属性是一种简单的方法,但它在IE或一些旧浏览器中不存在。

感谢您回答我甚至没有问过的问题。我认为DOM问题太常见了,我总是花几个小时自己解决。。。但我转向了你的建议,在一次保存中,一切都起作用了,起作用了,起作用了!它可能需要几个小时才能工作,尤其是因为大多数在线示例都使用innerHTML。非常感谢你!