AJAX——核心XMLHttpRequest对象

原创 2013年12月04日 21:46:27

          AJAX大家已经都知道了,是为了实现异步通讯,提高用户体验度,而将很多旧知识(XML,DOM,JavaScript,HTML,Jquery,Css……)重新融合的一个新的知识框架。而,XMLHttpRequest对象则是其中的重重之中。这篇博客重点总结一下这个对象的使用。当然还是按照经典的五步法来学习,以后在实践中有更多更好的想法,会拿出来分享的!


           首先,需要先了解这个对象的属性和方法:


属性

说明

readyState

表示XMLHttpRequest对象的状态:0:未初始化。对象已创建,未调用open

1open方法成功调用,但Sendf方法未调用;

2send方法已经调用,尚未开始接受数据;

3:正在接受数据。Http响应头信息已经接受,但尚未接收完成;

4:完成,即响应数据接受完成。

Onreadystatechange

请求状态改变的事件触发器(readyState变化时会调用这个属性上注册的javascript函数)。

responseText

服务器响应的文本内容

responseXML

服务器响应的XML内容对应的DOM对象

Status

服务器返回的http状态码。200表示“成功”,404表示“未找到”,500表示“服务器内部错误”等。

statusText

服务器返回状态的文本信息。



方法

说明

Open(string method,string url,boolean asynch,

String username,string password)

指定和服务器端交互的HTTP方法,URL地址,即其他请求信息;

Method:表示http请求方法,一般使用"GET","POST".

url:表示请求的服务器的地址;

asynch:表示是否采用异步方法,true为异步,false为同步;

后边两个可以不指定,usernamepassword分别表示用户名和密码,提供http认证机制需要的用户名和密码。

Send(content)

向服务器发出请求,如果采用异步方式,该方法会立即返回。

content可以指定为null表示不发送数据,其内容可以是DOM对象,输入流或字符串。

SetRequestHeader(String header,String Value)

设置HTTP请求中的指定头部header的值为value.

此方法需在open方法以后调用,一般在post方式中使用。

getAllResponseHeaders()

返回包含Http的所有响应头信息,其中相应头包括Content-length,date,uri等内容。

返回值是一个字符串,包含所有头信息,其中每个键名和键值用冒号分开,每一组键之间用CRLF(回车加换行符)来分隔!

getResponseHeader(String header)

返回HTTP响应头中指定的键名header对应的值

Abort()

停止当前http请求。对应的XMLHttpRequest对象会复位到未初始化的状态。



          对这个对象有了静态了了解,知道它长的什么样子,有什么功能了,下边该我们使用它了,当然这里我也用五步法写出代码来:

第一步:创建XMLHttpRuquest对象:

 var xmlhttprequest;
    if(window.XMLHttpRequest){
        xmlhttprequest=new XMLHttpRequest();
        if(xmlhttprequest.overrideMimeType){
            xmlhttprequest.overrideMimeType("text/xml");
        }
    }else if(window.ActiveXObject){
        var activeName=["MSXML2.XMLHTTP","Microsoft.XMLHTTP"];
        for(var i=0;i<activeName.length;i++){
            try{
                xmlhttprequest=new ActiveXObject(activeName[i]);
                break;
            }catch(e){
                       
            }
        }
    }
    
    if(xmlhttprequest==undefined || xmlhttprequest==null){
        alert("XMLHttpRequest对象创建失败!!");
    }else{
        this.xmlhttp=xmlhttprequest;
    }


    第二步:注册回调方法


xmlhttp.onreadystatechange=callback;

    第三步:设置和服务器交互的相应参数

 xmlhttp.open("GET","ajax?name=" +userName,true);

    第四步:设置向服务器端发送的数据,启动和服务器端的交互


  xmlhttp.send(null);

    第五步:判断和服务器端的交互是否完成,还要判断服务器端是否返回正确的数据


//根基实际条件写callback的功能代码
function callback(){
	 if(xmlhttp.readState==4){
		 //表示服务器的相应代码是200;正确返回了数据 
		if(xmlhttp.status==200){ 
			//纯文本数据的接受方法 
			var message=xmlhttp.responseText; 
			//使用的前提是,服务器端需要设置content-type为text/xml 
			//var domXml=xmlhttp.responseXML; 
			//其它代码
		 } 
	}
 }

         通过这五步XMLHttpRequest基本上就创建好,可以正常使用了,但是这是需要非常多的代码的,总不能每次创建都写这么多吧?当然不是了,我们学习了面向对象,我们将其必要相同的部分都抽象出来,使之成为一个独立类,别的直接调用即可,在网上看了一个,感觉写的挺好:


//类的构建定义,主要职责就是新建XMLHttpRequest对象
var MyXMLHttpRequest=function(){
    var xmlhttprequest;
    if(window.XMLHttpRequest){
        xmlhttprequest=new XMLHttpRequest();
        if(xmlhttprequest.overrideMimeType){
            xmlhttprequest.overrideMimeType("text/xml");
        }
    }else if(window.ActiveXObject){
        var activeName=["MSXML2.XMLHTTP","Microsoft.XMLHTTP"];
        for(var i=0;i<activeName.length;i++){
            try{
                xmlhttprequest=new ActiveXObject(activeName[i]);
                break;
            }catch(e){
                       
            }
        }
    }
    
    if(xmlhttprequest == undefined || xmlhttprequest == null){
        alert("XMLHttpRequest对象创建失败!!");
    }else{
        this.xmlhttp=xmlhttprequest;
    }
    
    //用户发送请求的方法
    MyXMLHttpRequest.prototype.send=function(method,url,data,callback,failback){
        if(this.xmlhttp!=undefined && this.xmlhttp!=null){
            method=method.toUpperCase();
            if(method!="GET" && method!="POST"){
                alert("HTTP的请求方法必须为GET或POST!!!");
                return;
            }
            if(url==null || url==undefined){
                alert("HTTP的请求地址必须设置!");
                return ;
            }
            var tempxmlhttp=this.xmlhttp;
            this.xmlhttp.onreadystatechange=function(){
                if(tempxmlhttp.readyState==4){
                    if(temxmlhttp.status==200){
                        var responseText=temxmlhttp.responseText;
                        var responseXML=temxmlhttp.reponseXML;
                        if(callback==undefined || callback==null){
                            alert("没有设置处理数据正确返回的方法");
                            alert("返回的数据:" + responseText);
                        }else{
                            callback(responseText,responseXML);
                        }
                    }else{
                        if(failback==undefined ||failback==null){
                            alert("没有设置处理数据返回失败的处理方法!");
                            alert("HTTP的响应码:" + tempxmlhttp.status + ",响应码的文本信息:" + tempxmlhttp.statusText);
                        }else{
                            failback(tempxmlhttp.status,tempxmlhttp.statusText);
                        }
                    }
                }
            }
            
            //解决缓存的转换
            if(url.indexOf("?")>=0){
                url=url + "&t=" + (new Date()).valueOf();
            }else{
                url=url+"?+="+(new Date()).valueOf();
            }
            
            //解决跨域的问题
            if(url.indexOf("http://")>=0){
                url.replace("?","&");
                url="Proxy?url=" +url;
            }
            this.xmlhttp.open(method,url,true);
            
            //如果是POST方式,需要设置请求头
            if(method=="POST"){
                this.xmlhttp.setRequestHeader("Content-type","application/x-www-four-urlencoded");
            }
            this.xmlhttp.send(data);
    }else{
        alert("XMLHttpRequest对象创建失败,无法发送数据!");
    }
    MyXMLHttpRequest.prototype.abort=function(){
        this.xmlhttp.abort();
    }
  }
}

          当然这些都需要我们在实践中不断的摸索,使用,再总结属于自己的一套常用类,方法等。当然XMLHttpRequest还有“浏览器缓存问题”,“中文乱码问题”,“跨域访问问题”等等,因为都没有遇到过这些东西,所以这里先了解一下,以后遇到再认真研究!



相关文章推荐

XMLHttpRequest用法介绍

传统的Web应用请求服务器返回的一般是是完整的HTML页面,这样往往就需要页面进行刷新操作,不仅耗时而且用户体验度也不好。最典型的代表就是form表单登录操作了。如果登录失败往往是跳转到原网页重新登陆...

一个简单的例子教你明白XMLHTTPRequest的原理

一个简单的例子教你明白XMLHTTPRequest的原理首先先简单的介绍下XMLHTTPRequest对象,XMLHTTPRequest对象可以在不刷新整个页面的前提下,实现局部刷新网页,jQuery...

XMLHttpRequest 2级学习

XMLHttpRequest 2级学习总结

javascript中XMLHttpRequest对象同步获取XML数据

XMLHttpRequest对象是一个利器,通过它可以在不重新加载整个页面的情况下实现对网页数据的局部更新,XML是用来存储传输数据的可扩展标记语言,这两个又是AJAX的核心。弄了个小例子捋一捋。ne...
  • ZDX_Y
  • ZDX_Y
  • 2016年07月07日 11:36
  • 721

使用XMLHttpRequest 实现http 终止请求和超时

getXMLHttpRequest : function () { return new XMLHttpRequest(); },var httpGet = function (url, cb...
  • W_han__
  • W_han__
  • 2017年09月08日 16:18
  • 159

XMLHttpRequest对象的属性和方法

XMLHttpRequest对象的属性和方法 1.readyState属性 状态:0 代表未初始化。 1 代表准备发送。 2 已发送但还没收到响应 3 正在接收 4...

Ajax核心对象 XMLHTTPRequest 五步学会使用

首先还是先了解Ajax AJAX = Asynchronous JavaScript andXML(异步的 JavaScript 和 XML)。通过在后台与服务器进行少量数据交换,AJAX 可以使网...
  • akkzhjj
  • akkzhjj
  • 2013年12月19日 20:05
  • 8702

史上最全的AJAX之XMLHttpRequest方法和属性详解

转载请标明出处 本文出自HCY的博客 概述AJAX是“Asynchronous Javascript And XML”的缩写,中文译作“异步JavaScript和XML”。使用AJAX可以通...

Ajax(一) — Ajax的核心与异步原理

1、什么是浏览器的同步 步骤: 客户发出HTTP请求 -> 服务器接受客户的请求并处理客户的请求 -> 服务器将相应客户的请求,返回客户所需要的页面 缺点: 1.每一次客户提交请求的时候,提交的是整...

XMLHTTP使用详解

XMLHTTP对象是Microsoft的MSXML开发包中带的一个用HTTP,XML协议访问web资源的对象. 从MSXML3.0开始出现. 它在AJAX技术中主要用来从其他网络资源获取信息,然后由j...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:AJAX——核心XMLHttpRequest对象
举报原因:
原因补充:

(最多只允许输入30个字)