使用JavaScript和XHTML:如果在onreadystatechange之前,XMLHttpRequest的open / send不起作用

时间:2010-10-13 23:56:43

标签: javascript ajax xhtml

我不知道它是否“有效”,但我得出结论,因为这里发布的代码有效(除了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);
}

2 个答案:

答案 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或某些旧浏览器中不存在。