Javascript 我的Ajax类不起作用

Javascript 我的Ajax类不起作用,javascript,ajax,Javascript,Ajax,我创建了一个JavaScript类,以简化Ajax请求 我的班级: var ajax = { method:"GET", action:"", data : "", result: "", setResult : function(re){this.result = re;}, setMethod : function(method){this.method = method.toUpperCase();}, setAction : fu

我创建了一个JavaScript类,以简化Ajax请求

我的班级:

var ajax =
{
    method:"GET",
    action:"",
    data : "",
    result: "",

    setResult : function(re){this.result = re;},
    setMethod : function(method){this.method = method.toUpperCase();},
    setAction : function(page){this.action = page;},
    addData : function(name,value){data_for_setting_data = name+"="+value+"&";this.data += data_for_setting_data;},

    send : function()
    {
        var XMLHttpRequestObject = false;
        if(window.XMLHttpRequest)
            XMLHttpRequestObject = new XMLHttpRequest();
        else if(window.ActiveXObject)
            XMLHttpRequestObject = new ActiveXObject("Microsoft.XMLHTTP");
        else
        {
            try
            {
                XMLHttpRequestObject = new ActiveXObject("Msxml2.XMLHTTP");
            }
            catch(e)
            {
                return false;
            }
        }
        if(XMLHttpRequestObject)
        {
            var resulter;
            datalength = this.data.length;
            datasender = this.data.substr(0,datalength-1);
            switch(this.method)
            {
                case "GET" :
                    XMLHttpRequestObject.open("GET",this.action+"?"+datasender,true);
                    XMLHttpRequestObject.onreadystatechange = function()
                    {
                        if(XMLHttpRequestObject.readyState == 4)
                        {
                            this.result = XMLHttpRequestObject.responseText;
                        }
                    }
                    XMLHttpRequestObject.send(null);
                ;
                break;
                case "POST" :
                    XMLHttpRequestObject.open("POST",this.action,true);
                    XMLHttpRequestObject.setRequestHeader("Content-type","application/x-www-form-urlencoded");
                    XMLHttpRequestObject.send(datasender);
                    XMLHttpRequestObject.onreadystatechange = function()
                    {
                        if(XMLHttpRequestObject.readyState == 4)
                        {
                            this.result = XMLHttpRequestObject.responseText;
                        }
                    }                   
                ;break;
            }
        }
    }
}
当我发送这样的数据时:

ajax.setAction("a.php");
ajax.setMethod("get");
ajax.addData("myname","mohsen");
ajax.send();
alert(ajax.result);
结果将一无所获

但例如,在第44行,如果我使用

alert(XMLHttpRequestObject.responseText)
而不是

this.result = XMLHttpRequestObject.responseText; 
它将正常工作

我该怎么解决这个问题


还有一个问题:它会降低加载速度吗?

问题在于
这个。结果
这个
不涉及
ajax
变量。要解决此问题,请更改为:

ajax.result = XMLHttpRequestObject.responseText;
或声明一个变量以保存当前上下文对象:

send : function()
    {
       var self = this;
然后像这样使用它:

self.result = XMLHttpRequestObject.responseText;
您的代码还有一个问题。因为ajax是asyn,当您调用
alert(ajax.result)时。来自服务器的响应可能尚未到达。要解决asyn问题,您可以通过将最终参数设置为
false
来使用syn request(虽然不建议使用此方法,因为它会阻塞浏览器,但如果请求需要很长时间才能完成,则应用程序将显示为挂起)

或者传入一个回调函数。当ajax响应到达时,调用它:

 send : function(callback){
  ....your code
      if(XMLHttpRequestObject.readyState == 4)
      {
            if (typeof callback === "function"){ 
                callback(XMLHttpRequestObject.responseText);
            }
      }
 }
像这样使用它:

ajax.send(function(result){
      alert(result);
});

有什么原因不能使用jQuery吗?是的。因为Ajax的目录对于客户端来说太重了,而仅仅用于Ajax并不是一个愚蠢的想法!当然,我的网站还有其他原因……在设置之前,您正试图访问
ajax.result
。Ajax是不同步的。这就是为什么必须将回调分配给
XMLHttpRequestObject.onreadystatechange
。了解同步代码和异步代码之间的区别,并处理Ajax调用的响应。你必须处理回拨。我的英语不好,你知道:((仍然不知道该怎么办。实际上,
这个
指的是
XMLHttpRequestObject
。但是,OP仍在尝试在设置之前访问该值。最好的方法是按您所说的那样回拨,这非常好:X@MohsenNemati:你很好。你不是一个好的选择。你掩盖了一个全局变量。
ajax.send(function(result){
      alert(result);
});