js之AJAX

AJAX = Asynchronous JavaScript and XML(异步的 JavaScript 和 XML)。
AJAX 不是新的编程语言,而是一种使用现有标准的新方法。
AJAX 是与服务器交换数据并更新部分网页的艺术,在不重新加载整个页面的情况下。
AJAX的核心是JavaScript对象XmlHttpRequest。
由于ie7-XmlHttpRequest是通过ActiveXObject实现的,所以特殊处理才能兼容

function createXHR() {
    if (typeof XMLHttpRequest != "undefined") {
        return new XMLHttpRequest();
    } else if (typeof ActiveXObject != "undefined") {
        var version = ["MSXML2.XMLHttp.6.0", "MSXML2.XMLHttp.3.0", "MSXML2.XMLHttp"];
        var i;
        var len = version.length;

        for (i = 0; i < len; i++) {
            try {
                return new ActiveXObject(version[i]);
                break;
            } catch(e) {
            }
        }
    }
    return new Error("此浏览器不支持Ajax");
}

1 同步请求

//1 先创建xhr对象
var xhr = createXHR();

//2 调用open方法,分别传入请求类型,url,是否异步
//由于ie的get请求会被缓存,所以需要传个随机参数,防止缓存
//请求的参数名和参数值最好使用encodeURIComponent进行编码处理
xhr.open("get", "test.ashx?_r=" + Math.random(), false);

//3 发送请求
//如果是get请求,则send方法为null,如果是post,则参数写在这里
xhr.send(null);

//通过判断xhr的状态处理,对请求回来的数据进行处理
//ie低版本会把204设置为1223,高版本会把204变成200,opera会把204设置为0,204的响应中没有body,而且Content-Length=0。
if((xhr.status >= 200 && xhr.status < 300)||xhr.status === 304 || xhr.status === 1223 || xhr.status === 0) {
    //由于xhr.responseXML只有在返回xml才有效,所以一般使用xhr.responseText
    alert(xhr.responseText);
}
//一般情况下xhr对象不进行重用
xhr = null;

2 异步请求

//1 先创建xhr对象
var xhr = createXHR();

//2 由于异步请求会在整个请求阶段都触发onreadystatechange,所以在这个事件里对结果进行处理
//  跟其他事件不同,onreadystatechange不会传入event对象
xhr.onreadystatechange = function () {
    //这里使用xhr,而不是this,有资料说使用this会在某些浏览器上报错(但我没遇到过)
    //readState为4表示请求结束
    if (xhr.readyState == 4) {
        if ((xhr.status >= 200 && xhr.status < 300) || xhr.status === 304 || xhr.status === 1223 || xhr.status === 0) {
            alert(xhr.responseText);
        }
    }
};

//3 调用open方法,由于post请求不会缓存,所以不需要随机参数来防止缓存
xhr.open("post", "test.ashx", true);

//4 设置请求头部,post请求需要模拟表单提交,服务器才能得到请求过来的参数
//  这一步必须在open和send中间

xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");

//5 发送请求
//请求的参数名和参数值最好使用encodeURIComponent进行编码处理
xhr.send("name=mu&age=27");

注意:
1 get请求处理的速度比post快,如果数据量不大建议优先get请求
2 xhr.abort()可以中断请求,必须放在send后面
3 xhr中的请求头信息只能设置,回复头信息只能读取

posted on 2013-10-29 16:56  穆穆  阅读(914)  评论(0编辑  收藏  举报