javascript - 为什么这个 ajax 调用不能在这个简单的 JavaScript 对象文字 ajax 框架中工作

标签 javascript

var ajax = {
xmlHTTP: function() {
    xml = new XMLHttpRequest();
    return xml;
},
xmlHTTPfunction: function() {
    if (xml.readyState == 4 && xml.status == 200)  {
        document.getElementById("te").innerHTML = xml.responseText; 
         alert(xml.status);
         alert(xml.responseText);
     }

},
xmlHTTPopen: function(url) {
    xml.open("POST", url, true);
},
xmlHTTPheader: function() {
    ajax.xmlHTTP().setRequestHeader("Content-type","application/x-www-form-urlencoded");
},
xmlHTTPsend: function(string) {
    xml.send(string);
},
ajaxCall: function() {
    ajax.xmlHTTP();
    ajax.xmlHTTPopen('testx.php');
    ajax.xmlHTTPsend('test');
    return 1;
}
}
   if(ajax.ajaxCall() == 1) {
document.getElementById("te").innerHTML = xml.responseText; 

}

最佳答案

大多数函数都引用作用域很差的xml变量。也就是说,当您调用 ajax.xmlHTTPopen 时,没有任何信息表明 xml 变量在该函数内具有任何值。

提供更好范围的最简单方法是将 xml 变量定义为 ajax 对象的属性;这是一个对代码进行最小更改的示例:

var ajax = {
    xmlHTTP: function() {
        this.xml = new XMLHttpRequest();
        this.xml.onreadystatechange = this.xmlHTTPfunction();
    },
    xmlHTTPfunction: function() {
        if (this.xml.readyState == 4 && this.xml.status == 200)  {
            document.getElementById("te").innerHTML = this.xml.responseText; 
             alert(this.xml.status);
             alert(this.xml.responseText);
         }
    },
    xmlHTTPopen: function(url) {
        this.xml.open("POST", url, true);
    },
    xmlHTTPheader: function() {
        this.xml.setRequestHeader("Content-type","application/x-www-form-urlencoded");
    },
    xmlHTTPsend: function(string) {
        this.xml.send(string);
    },
    ajaxCall: function() {
        ajax.xmlHTTP();
        ajax.xmlHTTPopen('testx.php');
        ajax.xmlHTTPsend('test');
        return 1;
    }
}

请注意,正如您所写,ajax.ajaxCall 是非阻塞的,因此它始终会立即返回 1,甚至在响应到达(或必须发送)之前 --为此,您必须为 XMLHtpRequest 对象的 onreadystatechange 事件分配一个回调函数,以便在响应最终返回时对其进行处理。

如果将 xml.open 的第三个参数更改为 false,则 xml.send 调用阻塞,直到响应到达,其中如果您不需要分配回调。替代实现可能如下所示:

var ajax = {
    xmlHTTP: function() {
        this.xml = new XMLHttpRequest();
    },
    xmlHTTPopen: function(url) {
        this.xml.open("POST", url, false);
    },
    xmlHTTPheader: function() {
        this.xml.setRequestHeader("Content-type","application/x-www-form-urlencoded");
    },
    xmlHTTPsend: function(string) {
        this.xml.send(string);
    },
    ajaxCall: function() {
        ajax.xmlHTTP();
        ajax.xmlHTTPopen('testx.php');
        ajax.xmlHTTPsend('test');
        return 1;
    }
}
if(ajax.ajaxCall() == 1) {
    document.getElementById("te").innerHTML = ajax.xml.responseText; 
}

但是根据我的经验,这在现实世界中几乎从未使用过。

另外:您的代码永远不会调用 xmlHTTPheader 函数,尽管这没有什么坏处。

鉴于您当前的代码,我想不出更好的建议;您看过 jQuery 及其 ajax 实现吗?

关于javascript - 为什么这个 ajax 调用不能在这个简单的 JavaScript 对象文字 ajax 框架中工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6244475/

相关文章:

javascript - == 与远程 JavaScript 文件中的===。哪一个更快?

javascript - iAd Producer-如何在Safari中打开YOUTUBE链接?

javascript - 如何从 onChange 事件获取非字母数字键的值是 JS/React

javascript - `Promise.all`是否受到浏览器施加的并发连接限制?

javascript - 这段代码用 javascript 移动 css 元素有什么问题?

javascript - 使用 Redux 迭代 JSON(我如何为此组织我的 reducer ?)

javascript - 如何重置最近的跨度对象的文本?

javascript - 如何检查一个元素是否是另一个元素的有效子/父元素

javascript - 传单中带有 geoJson 文件的 Font Awesome 图标

javascript - 删除jquery创建的内容