Ajax的深入理解及使用

我们在学习一个东西的时候首先要知道,学习的东西是什么,他可以干什么,为什么使用它?

那么到底什么是ajax呢?

AJAX 不是 JavaScript 的规范,他是一个老伙计自创的名字 : Asynchronous JavaScript and XML,意思就是用JavaScript执行异步网络请求。

他可以干什么呢?

在整个网页不重新加载的情况下,更新部分页面的内容。

为什么要使用它呢?

根据业务需求,发送http请求,拿到服务端数据,在页面上渲染数据。

好,言归正传,让我们开始学习AJAX

什么是xhr

ajax技术的核心就在于 XMLHttpRequest 对象(简称xhr),首先由微软引用,随后,其他浏览器也支持啦该对象, xhr为向服务器发送请求和解析服务器响应提供啦流畅的接口。

IE5中xhr对象,是通过ActiveX对象实现的,IE7+即其他浏览器都支持xhr对象,所以需要写一个兼容

// 创建一个xhr对象(带兼容处理)
function create(){
    var xhr = null;
    if(window.XMLHttpRequest){
        xhr = new XMLHttpRequest();
    }else{
        xhr = new ActiveXObject('Microsoft.XMLHTTP')
    }
    return xhr;
}

注意,如果需要多个请求,就创建多个xhr对象,当然也可以使用同一个xhr对象,但是这回终止xhr对象之前的异步请求

xhr对象的方法

open()

在使用xhr对象,第一个要调的方法是open(method,ull,async)

该方法是向服务器发送之前做一些设置,比如你打电话,输入电话号,然后看看是用卡一还是卡二,

xhr.open('GET','http://www.example.com/api',true)
/*
    第一个参数表示使用哪种http请求方法,不区分大小写,一般还是写大写的,常用的两个方法:get()、post()
      get方法用于常规请求,一般从服务器读取数据使用该方法
      post方法常用语HTML表单请求,一般向服务器发送数据使用该方法
    第二个参数表示url,要请求的资源地址
    第三个参数表示是否异步,true\false
/*

send()

send方法接受一个参数,即要作为请求主体发送的数据,调用send的方法,请求发送到服务器,该方法等于按下拨打按钮

如果是GET方法,send()无参数或为null;如果是POST方法参数是要发送的数据

xhr.send('a=1&b=2');

xhr对象的事件

xhr.onerror

xhr.onerror = function(e){
    console.log(e)
}
// 该事件当请求失败时触发

xhr.ontimeout

xhr.timeout = 1000; // 设置请求时间的限制,毫秒为单位,默认为0,
xhr.ontimeout = function(){
    alert('请求超时')
}
// 当请求超过指定的时间时触发

xhr.onprogress

// 监听进度事件,如果请求的资源很小,直接就100%
xhr.onprogress = function(e){
    console.log((e.loaded / e.total) * 100 + '%');
}

接收响应

先检测XHR对象的readyState属性,该属性表示请求/响应过程的当前活动阶段。这个属性可取的值如下:

0(UNSENT):未初始化。尚未调用open()方法
1(OPENED):启动。已经调用open()方法,但尚未调用send()方法
2(HEADERS_RECEIVED):发送。己经调用send()方法,且接收到头信息
3(LOADING):接收。已经接收到部分响应主体信息
4(DONE):完成。已经接收到全部响应数据,而且已经可以在客户端使用了

在XHR对象的 readyState 属性改变的话会触发XHR对象的 onreadystatechange 事件,所以我们通常使用onreadystatechange事件监听状态的变化

注意:一定要在open之前设置 onreadystatechange 事件,才能确保跨浏览器兼容性,否则将无法接收readyState属性为0和1的情况

xhr.onreadystatecahnge = function (){
    if(xhr.readyState){
        // another code
    }
}

单单上边的处理还是不够的,因为xhr.readyState是指运行ajax所经历的几种状态,所以还需要判断ajax是否请求成功

一个完整的HTTP响应由状态码、响应头集合和响应主体组成。在收到响应后,这些都可以通过XHR对象的属性和方法使用,主要有以下4个属性

responseText: 作为响应主体被返回的文本(文本形式)
responseXML: 如果响应的内容类型是'text/xml'或'application/xml',这个属性中将保存着响应数据的XML DOM文档(document形式)
status: HTTP状态码(数字形式)
statusText: HTTP状态说明(文本形式)
xhr.onreadystatechange = function(){
    if(xhr.readyState){
        if(xhr.status>= 200 && xhr.status < 300 || xhr.status == 304){
           
        }
    }
}

关于xhr.status的解释 : https://baike.baidu.com/item/HTTP%E7%8A%B6%E6%80%81%E7%A0%81/5053660?fr=aladdin

最后上一篇我自己封装的ajax吧

const ajax = (json) => {
    let xhr = null,
        type = json.type.toUpperCase() || 'GET'; // 设置请求的默认方法
    // 兼容处理
    if(window.XMLHttpRequest){
        xhr = new XMLHttpRequest();
    }else{
        xhr = new ActiveXObject('Microsoft.XMLHTTP')
    }
    // 设置请求时间的限制
    xhr.timeout = json.time ? json.time : 0;
    // 设置请求找过指定时间的时间
    xhr.ontimeout = json.timeout ? json.timeout : null;
    // 监听xhr对象额状态
    xhr.onreadystatechange = function(){
        if(xhr.readyState == 4){
            if(xhr.status >= 200 && xhr.status < 300 || xhr.status == 304){
                json.success(xhr.responseText) // 如果成功 即调用成功的回调函数
            }else{
                json.error&&json.error() // 失败调用失败的回调函数
            }
        }
    }
    if(type.toUpperCase() == 'GET'){
        xhr.open('GET',json.url+'?'+toStr(json.data),true); 
        xhr.send()
    }else if(type.toUpperCase() == 'POST'){
        xhr.open('POST',json.url,true);
        xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded");
        xhr.send(toStr(json.data))
    }
}
// 将对象的属性和value转换为 a:1&b:2
const toStr = json => {
    var arr = [];
    for(var i in json){
        arr.push(i+'='+json[i])
    }
    return arr.join('&')
} 
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,039评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,223评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,916评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,009评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,030评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,011评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,934评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,754评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,202评论 1 309
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,433评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,590评论 1 346
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,321评论 5 342
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,917评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,568评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,738评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,583评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,482评论 2 352

推荐阅读更多精彩内容