Ajax的使用

什么是Ajax

Ajax这一技术可以向服务器请求额外的数据而无需卸载页面,它改变了web的’点击,等待‘的交互模式,大大提高了用户的使用体验。

Ajax的核心

我们要使用Ajax向服务器请求数据,首先必须创建XHR对象,在IE7及以上版本以及其他浏览器中,XML对象的创建很容易:

var xhr = new XMLHttpRequest();

后续的操作就是在这个对象上完成。

Ajax的使用

1.创建XML对象

var xhr = new XMLHttpRequest();

2.xhr对象调用open方法,它接受三个参数:要发送的请求的类型('get','post'等),请求的url和是否异步发送的布尔值。需要说明的是,url可以使用相对路径和绝对路径,使用相对路径时,相对与当前页面的url,建议使用相对路径;调用open方法并不会真的发送请求,只是启动一个请求。

xhr.open('get','example.php',false);  //使用get 方法,同步获取example.php上的数据

注意:URL需要满足同源策略,也就是只能向同一个域中使用相同端口和协议的URL发送请求,如果三者有有一个不满足,都会引发安全错误,浏览器会拦截服务器的相应。

3. 发送请求,处理响应

3.1 如果发送的请求是同步的,只需要接着上一步,调用send方法,它接 收一个参数,也就是作为请求主体要发送的数据,如果使用的是'get'方法,只需要传入null,这个参数对有些浏览器来说是必要的,调用send方法后,请求就会被发送到服务器。
xhr.send(null);

发送完请求后,需要等待服务器的响应,响应到来后,会自动填充到xhr对象的属性上,常用的属性包括:
-responseText:作为响应主体被返回的文本,
-status:响应的HTTP状态,
-statusText:HTTP状态的说明

if((xhr.status>=200 && xhr.status<300) || xhr.status == 304) {
      //处理返回的响应文本,例如插入到文档某一节点
      //后面会介绍HTML状态码
    document.querySelector('div').innerHTML = xhr.responseText;
} else {
    alert('Request was unsuccessful: '+xhr.staus);//抛出错误信息;
}
3.2 在多数情况下,我们要发送异步请求,这样不至于让用户在等待响应到来的这段时间,什么也做不了。

发送异步请求时,我们可以检测xhr的readyState属性,当这个属性的值发生变化时,会触发ready-statechange事件,我们可以利用这个事件对响应进行处理。readyState属性的值如下:

  • 0:未初始化,尚未调用open方法。
  • 1:启动阶段,已经调用了open方法,还未调用send方法。
  • 2:发送阶段,已经调用了send方法,但尚未接收到响应。
  • 3:接收阶段,已经接收到部分响应数据。
  • 4:完成阶段,已经接收到全部响应数据,数据可以在客户端使用。
    很显然,我们更关注值为4的阶段,这时,所有的数据都可以使用了。
    我们需要为readystatechange事件绑定事件处理程序,考虑浏览器兼容性的问题,必须在我们调用open方法之前就指定该事件处理程序。代码如下:
xhr.onreadystatechange = function(){
  if(xhr.readyState === 4){
    if((xhr.status>=200&&xhr.status<300) || xhr.status == 304){
      alert(xhr.responseText);
  } else {
      alert('Request was unsunccessful: '+xhr.status);
    }
};  //这里使用DOM0级方法为事件添加监听器,DOM2级方法并非所有浏览器都支持。
    //这个监听器里直接使用xhr对象,而不是使用this,原因是在有的浏览器中会导致函数执行失败,使用xhr对象是最稳妥的方式。

到这里,Ajax常规的使用步骤已经说完了,下面给出一个完整的Ajax发送异步请求的代码。

var xhr = new XMLHttpRequest();
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.php',true);
xhr.send(null);

常用的HTTP状态码

  • 200 :表示客户端发送的请求被服务器成功处理。
  • 204:表示请求处理成功,但没有资源返回。
  • 301:表示永久重定向。
  • 302:临时重定向。
  • 304:客户端发送的是有条件的请求,服务器允许访问资源,但因资源不满足请求条件,服务器不返回请求的数据,客户端使用缓存。
  • 400:客户端(浏览器端)发生错误,需要修改请求。
  • 401:未授权,当前的请求需要用户验证。
  • 403:服务器拒绝了客户端的请求。
  • 404:服务器上不存在客户端请求的资源,也可以在服务端拒绝请求又不行说明原因时使用。
  • 500:服务器端发送错误。
  • 503:服务器暂时处于超负载或正在进行停机维护,无法处理请求。

了解了状态码后,对下面的代码也就不难理解了

//状态码在200到300范围内表示请求成功,当status=304表示可以使用浏览器的缓存
if((xhr.status>=200 && xhr.status>300) || xhr.status==304){
  
}

xhr对象的其他方法

1.setRequestHeader(),使用这个方法可以设置自定义的请求头部信息,它接受两个参数,头部字段的名称和值,要使用这个方法,需要在调用open方法之后,调用send方法之前调用setRequestHeader()。

  1. getResponseHeader(),调用这个方法并传入头部字段的名称,可以取得响应响应的头部信息,getAllResponseHeaders()方法则可以取得一个包含所有头部信息的长字符串。

  2. abort(),调用这个方法后,xhr对象会停止触发事件,也不在允许访问任何和响应有关的对象属性。

GET和POST方法的区别

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

推荐阅读更多精彩内容

  • 马上过年了,家家户户都忙着准备过年用的东西。人们都沉侵在这喜庆的日子里。 过年了,家家户户的晚上都...
    15098阅读 258评论 0 0
  • 1. 认识这个词(基础篇) 词:invite 英英释义:to do something that makes so...
    小小_d574阅读 208评论 0 0
  • 十年,难留住羞涩 十年,韶华已萧瑟 十年,水去沙留着 十年,雪上已灰落 . 算一算,人生若此短 几个十年,可留感叹...
    水摇绢阅读 317评论 0 2