Ajax

原文地址:Ajax

Ajax全称为“Asynchronous Javascript and XML”(异步javascript和XML),它并不是指一种单一的技术,而是有机地利用了一系列交互式网页相关的技术所形成的结合体,它的出现结束了“单击,等待”的传统交互模式,开启了无刷新更新页面的新时代。

Ajax的优点

  1. 不需要插件支持
    ajax不需要任何浏览器插件,就可以被绝大多数的主流浏览器所支持,用户只需要允许javascript在浏览器上执行即可。
  2. 优秀的用户体验
    这是ajax技术的最大优点,能在不刷新整个页面的前提下更新数据,这使得web应用程序能更为迅速地回应用户的操作。
  3. 提高web程序的性能
    与传统模式相比,ajax模式在性能上的最大区别就在于传输数据的方式,在传统模式中,数据是通过提交表单来实现的,而数据获取是靠全页面刷新来重新获取整页的内容。ajax模式只是通过XMLHttpRequest对象向服务器提交希望提交的数据,即按需发送。
  4. 减轻服务器和带宽的负担
    ajax的工作原理相当于在用户和服务器之间加了一个中间层,使用户操作与服务器响应异步化。它在客户端创建ajax引擎,把传统方式下的一些服务器负担的工作转移到客户端,便于客户端资源来处理,减轻服务器和带宽的负担。

Ajax的缺点

  1. 破坏浏览器 “后退”按钮的正常功能
    在ajax中,“前进”和“后退”按钮的功能都会失效。用户经常会遇到这情况,当单击一个按钮触发一个ajax交互后,如果点击“后退”按钮,浏览器会直接后退到前一个页面,而不是仅仅是回退到ajax交互操作前。
  2. 需要处理浏览器兼容性问题

创建XMLHttpRequest对象

XMLHttpRequest对象简称XHR对象,它是ajax技术的核心,发送异步请求、接收响应及执行回调都是通过它来完成的。ie7+、firefox、opera、chrome和safari都支持原生的XHR对象,在这些现代浏览器中这样创建:

var xhr = new XMLHttpRequest();

在ie5和ie6中,是以ActiveXObject的方式引入XHR对象的:

var xhr=new ActiveXObject("Microsoft.XMLHTTP");

如果你既想支持现代浏览器又不想放弃ie5和ie6,那么你需要做一个逻辑判断:

    var xhr
    if(window.ActiveXObject){
    xhr = new ActiveXObject("Microsoft.XMLHTTP")
    }else if (window.XMLHttpRequest){
        xhr = new XMLHttpRequest();
    }

XMLHttpRequest对象的属性

readyState

该属性表示请求/响应过程中的当前活动阶段。该属性可取的值如下:

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

只要readyState属性的值发生变化,就会触发readystatechange事件,可以利用这个事件来检测每次变化后的readyState的值。通常我们只对readyState值为4的阶段感兴趣,因为这个时候所有的数据都已经就绪。

responseText

作为响应主体被返回的文本。无论内容类型是什么,响应主体的内容都会保存在这里,如果响应包含了为响应体指定字符编码的头部,就使用该编码。否则,假定使用 Unicode UTF-8。如果 readyState 小于 3,这个属性就是一个空字符串。当 readyState 为 3,这个属性返回目前已经接收的响应部分。如果 readyState 为 4,这个属性保存了完整的响应体。

responseXML

如果响应的内容类型是“text/xml”或“application/xml”,这个属性中将保存包含着响应数据的XML DOM文档。对于非XML数据而言,responseXML属性值将为null。

status

响应的http状态。检查status属性可以确定响应是否已成功返回(在readyState>3时才可以读取)。

  • http状态码200是响应成功返回的标志,此时responseText属性的内容已经就绪,而且在内容类型正确的情况下(XML类型),responseXML属性也能够访问了。
  • http状态码304表示请求的资源没有被修改,可以直接使用浏览器中缓存的版本,当然也意味着响应式有效的。
  • http状态码404表示请求错误。
    ······

statusText

http状态的说明。比如在状态码为200时,statusText的值为“OK”。

XMLHttpRequest对象的方法

open()

在使用XHR对象时,要调用的第一个方法是open(),它接受三个参数:

  1. 要发送的请求类型,如“get”“post”等。
  2. 请求要访问的URL。
  3. 选择同步或异步的布尔值。true表执行异步操作,false表示同步。
  • 同步:客户端发出一个请求后,需要等待服务器响应结束后,才能发出第二个请求。
  • 异步:客户端发出一个请求后,无需等待服务器响应结束后,就能发出第二个请求。

send()

send方法接收一个参数,将被写入到请求报文里面传递,即要做为请求主体发送的数据。调用send()之后,请求就会被分派到服务器。

  • 如果不需要通过请求主体发送数据,比如请求类型是“get”时,参数是直接写到url里面,则必须传入null,因为这个参数对于某些浏览器来说是必须的。
  • 请求类型是“post”时,请求参数需要写入到send方法里。

abort()

调用这个方法后,XHR对象会停止触发事件,而且也不再允许访问与响应有关的对象属性。

http头部信息

默认情况下,在发送XHR请求的同时,还会发送头部信息,虽然不同的浏览器实际发送的头部信息会有所不同,但是基本上是所有浏览器都会发送的有以下这些:

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

getResponseHeader()

这个方法可以设置自定义的请求头部信息,它接收两个参数:

  1. 头部字段的名称
  2. 头部字段的值

要想成功发送请求头部信息,getResponseHeader()方法必须在open()与send()之间调用。

getAllResponseHeaders()

这个方法可以取得一个包含所有头部信息的长字符串。

GET请求

GET是最常见的请求类型,常用于向服务器查询某些信息。使用GET请求时常用到encodeURIComponent()方法。查询字符串中每个参数的名称和值都必须使用encodeURIComponent()进行编码,才能放到URL末尾。完整的函数如下:

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

POST请求

POST请求通常用于向服务器发送应该被保存的数据。
虽然大部分情况下都能用更简单、更快的GET请求,但在以下情况中,请使用POST请求:

  • 无法使用缓存文件(更新服务器上的文件或数据库)
  • 向服务器发送大量数据(POST 没有数据量限制)
  • 发送包含未知字符的用户输入时,POST 比 GET 更稳定也更可靠

默认情况下,服务器对POST请求和提交表单的请求并不会一视同仁,不过我们可以使用XHR来模仿表单提交。

    xhr.open("POST","example.php",true);
    xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded");   //设置表单提交时的内容类型
    var form = document.getElementById("#test");   //得到表单中的数据
    xhr.send(serialize(form));   //表单中的数据序列化后发送给服务器

实例

下面看一个完整的栗子:
html代码段

<input type="button" value="ajax提交" onclick="Ajax();">
<div id="resText"></div>

javascript代码段:

function Ajax() {
    var xhr;              //声明一个对象用来装入XMLHttpRequest
    if(window.ActiveXObject){          //IE5 IE6实例化XHR对象
        xhr = new ActiveXObject("Microsoft.XMLHTTP");
    }else if (window.XMLHttpRequest){  //现代浏览器实例化XHR对象
        xhr = new XMLHttpRequest();
    }
    xhr.open("get","test.php",true);  //启动请求
    xhr.onreadystatechange=fun;       //触发回调函数
    xhr.send(null);                   //发送请求
    function fun() {                  //定义回调函数
        if(xhr.readyState == 4){
            if(xhr.status == 200){
                document.getElementById("resText").innerHTML=xhr.responseText;
            }
        }
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,236评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,867评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,715评论 0 340
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,899评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,895评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,733评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,085评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,722评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,025评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,696评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,816评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,447评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,057评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,009评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,254评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,204评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,561评论 2 343

推荐阅读更多精彩内容