JacaScript学习--Ajax

什么是Ajax?
  • Ajax 即“Asynchronous Javascript And XML”(异步 JavaScript 和 XML),是指一种创建交互式网页应用的网页开发技术。
  • Ajax 是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术。通过在后台与服务器进行少量数据交换,Ajax 可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新,会带来更好的用户体验。
  • Ajax的技术核心是XMLHttpRequest对象(简称XHR)。
  • Ajax通信与数据结构无关。
创建XMLHttpRequest对象

IE7+和FireFox、Chrome、Opera、Safari都支持原生的XMLHttpRequest对象。

function createXHR() {
    if (typeof XMLHttpRequest != "undefined") {
        return new XMLHttpRequest()''
    } else if (typeof ActiveXObject != "undefined") {
        if (typeof arguments.callee.activeXString != "string") {
            var version = ["MSXML2.XMLHttp.6.0","MSXML2.XMLHttp.3.0","MSXML2.XMLHttp"],
            i,len;
            for(i = 0,len = version.length; i < len; ++i) {
                try {
                    new ActiveXObject(version[i]);
                    arguments.callee.activeXString = version[i];
                    break;
                } catch (ex){
                    // 跳过
                }
            } 
        }
        return new ActiveXObject(arguments.callee.activeXString);
    } else {
        throw new Error("No XHR object available");
    }
}
XMLHttpRequest的用法
var xhr = createXHR();
xhr.open("get","example.txt",false);
xhr.send(null);

open()方法调用三个参数,第三个参数是表示是否异步发送请求的布尔值。需要注意:

  • URL相当于执行代码的当前页面(也可以是绝对路径)
  • 调用open()方法并不会真正地发送请求。
  • 如果不需要通过主体发送数据,则必须传入null,因为这个参数对某些浏览器来说是必须的。

只能向同一个域中使用相同端口和协议的URL发送请求。如果URL与启动请求的页面有任何差别,都会引起安全错误。

在收到响应之后,响应的数据会填充XMLHttpRequest对象的属性。属性如下:

  • responseTEXT:作为响应主体被返回的文本。
  • responseXML:如果响应的内容是“text/html”或“application/xml”,这个属性中将保存着响应数据的XML DOM文档。
  • status:响应的HTTP状态。
  • statusText:HTTP状态的说明。

接收到像一个之后,如果此时状态代码为304表示请求的资源并没有被修改,可以直接使用浏览器中缓存的版本;当然,也意味着响应是有效的。
请求状态即readyState属性:

  • 0:未初始化。尚未调用open()方法。
  • 1:启动。已经调用open()方法,但是没有调用send()方法。
  • 2:发送。已经发送send()方法,但尚未收到响应。
  • 3:接收。已经接收到部分数据了。
  • 4:完成。已经接收到全部响应数据,而且可以在客户端使用了。

onreadystatechange这个事件可以用来检测每次状态变化后readyState的值的情况

var xhr = new createXHR();
xhr.onreadystatechange = function() {
    if (xhr.readyState == 4) {
        if (xhr.status >= 200 && xhr.status < 300 || xhr.status == 304) {
            alert(xhr.responseText);
        } else {
            alert("Request was unsuccessful:" + xhr.status);
        }
    }
}
xhr.open("get","example.txt",true);
xhr.send(null);

在接收到响应之前可以用xhr.abort()来取消异步请求。由于内存原因,不建议重用XMLHttpRequest对象

Http头部信息

每个Http请求和响应都会带来相应的头部请求。
t默认情况下,在发送XMLHttpRequest请求时,也会发送下列头部信息。

  • Accept: 浏览器能够处理的内容类型。
  • Accept-Charse:浏览器能够显示的字符集。
  • Accept-Encoding:浏览器能够处理的压缩编码。
  • Accept-Language浏览器当前设置的语言。
  • Connection:浏览器与服务器之间链接的类型。
  • Cookie:当前页面设置的任何Cookie。
  • Host:发出请求的页面所在的域。
  • Referer:发出请求的页面的URL。

要成功发送请求头部信息。setRequestHeader()这个方法接受两个参数:头部字段的名称和头部字段的值。这个字段可以自定义。getRequestHeader()这个方法可以获取相应头部字段的值

GET请求
  • 对于XMLHttpRequest而言,位于open()方法内的URL末尾的查询字符串必须经过正确的编码才行。
  • 查询字符串的每个参数的名称和值都必须使用**encodeURIComponent()**进行编码,然后才能放到URL末尾,而且所有的名-值都必须用“&”分隔。

向现有的URL末尾添加查询字符串参数

function addURLParam(url,name,value) {
    url += (url.indexOf("?") == -1 ? "?" : "&");
    url += encodeURIComponent(name) + "=" + encodeURIComponent(value);
    return url;
}
POST请求

post请求的主体可以包含非常多的数据。
提交表单和一般的post请求是不一样的。

POST请求解析web表单

var xhr = new createXHR();
xhr.onreadystatechange = function() {
    if (xhr.readyState == 4) {
        if (xhr.status >= 200 && xhr.status < 300 || xhr.status == 304) {
            alert(xhr.responseText);
        } else {
            alert("Request was unsuccessful:" + xhr.status);
        }
    }
}
xhr.open("get","example.txt",true);
xhr.setRequestHeader("Content-type","application/x-wwww-form-urlencoded");
var form = document.getElementById("user-info");
xhr.send(serialize(form));

表单序列化:

function serialize(form) {
    var parts = [],
    field = null,
    i,len,j,optLen,option,optValue;
    for (i = 0,len = form.elements.length; i < len; ++i) {
        field = form.elements[i];
        switch(field.type) {
            case "select-one":
            case "selece-multiple":
            if (field.name.length) {
                for (j = 0,optLen = field.options.length; j < optLen; ++j) {
                    option = field.options[j];
                    if (option.selected) {
                        optValue = "";
                        if (option.hasAttribute) {
                            optValue = (option.hasAttribute("value") ? option.value:option.text);
                        } else {
                            optValue = (option.hasAttribute("value").specified ? option.value:option.text);
                        }
                        parts.push(encodeURIComponent(field.name) + "=" + encodeURIComponent(optValue));
                    }
                }
            }
            break;
            case undefined:
            case "file":
            case "submit":
            case "reset":
            case "button":
                break;
            case "radio":
            case "checkbox":
                if (!field.checked) {
                    break;
                }
                // 执行默认操作
            default: 
                // 不包含没有名字的表单字段
                if (field.name.length) {
                    parts.push(encodeURIComponent(field.name) + "=" + encodeURIComponent(field.name));
                }
        }
    }
} 
XMLHttpRequest2级

XMLHttpRequest级只是进行了基本实现,而XMLHttpRequest2级对其进行了扩展。
FormData

var data = FormData();
data.append("name","Nicholas");

可以将data直接传给send函数。
超时设定
设置了一个timeout属性,表示请求在等待响应多少毫秒之后就终止,仅适用于IE8+。

xhr.open("get","example.txt",true);
xhr.timeout = 1000;
shr.ontimeout  = function () {
	alert("request did not return in a second");
}
xhr.send(null);

overrideMimeType
用于重写XMLHttpRequest的MIME类型。

xhr.overrideMimeType("text/xml")保证响应当作XML文档而非纯文本来处理。

参考:
《JavaScript高级程序设计(第3版)》

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值