Ajax基础知识

作者:日期:2018-03-18 18:23:58 点击:547

AJAX基础知识

什么是AJAX?
async javascript and xml,异步的JS和XML

xml:可扩大的标记语言

作用是用来存储数据的(通过自己扩大的标记名称清楚的展现出数据结构)

ajax之所以称为异步的js和xml,重要原因是:当初最开端用ajax实现客户端和服务器端数据通信的时候,传输的数据格式一般都是xml格式的数据,我们我们把它称之为异步js和xml(现在一般都是基于JSON格式来进行数据传输的)

<?xml version="1••。0" encoding="UTF-8"?><root>     <student>         <name>张三</name>         <age>25</age>         <score>             <english>90</english>             <math>100</math>             <chinese>98</chinese>         </score>     </student>     <student>         <name>李四</name>         <age>24</age>         <score>             <english>80</english>             <math>90</math>             <chinese>100</chinese>         </score>     </student></root>

异步的JS

这里的异步不是说ajax只能基于异步进行恳求(虽然建议都是应用异步编程),这里的异步特指的是 “局部刷新”

局部刷新 VS 全局刷新

在非完整前后端分别项目中,前端开发只需要完成页面的制作,并且把一些基础的人机交互效果应用js完成即可,页面中需要动态浮现内容的部分,都是交给后台开发工程师做数据绑定和基于服务器进行渲染的(服务器端渲染)

[优势]
1¶••⊿动态展现的数据在页面的原代码中可以看见,有利于SEO优化推广(有利于搜索引擎的收录和抓取)
2¶••⊿从服务器端获取的成果就已经是最后要浮现的成果了,不需要客户端做额外的事情,所以页面加载速度快(前提是服务器端处理的速度够快,能够处理过来),所以类似于京东¶••⊿淘宝这些网站,首屏数据一般都是经由服务器端渲染的

[弊病]
1¶••⊿如果页面中存在需要实时更新的数据,每一次想要展现最新的数据,页面都要重新的刷新一次,这样确定不行
2¶••⊿都交给服务器端做数据渲染,服务器端的压力太大,如果服务器处理不过来,页面浮现的速度更慢(所以京东淘宝这类网站,除了首屏是服务器端渲染的,其它屏一般都是客户端做数据渲染绑定)
3¶••⊿这种模式不利于开发(开发效率低)

目前市场上大部分项目都是前后端完整分别的项目(也有非完整前后端分别的)

前后端完整分别的项目,页面中需要动态绑定的数据是交给客户端完成渲染的
1¶••⊿向服务器端发送AJAX恳求
2¶••⊿把从服务器端获取的数据解析处理,拼接成为我们需要展现的HTML字符串
3¶••⊿把拼接好的字符串调换页面中某一部分的内容(局部刷新),页面整体不需要重新加载,局部渲染即可

[优势]
1¶••⊿我们可以根据需求,任意修正页面中某一部分的内容(例如实时刷新),整体页面不刷新,性能好,体验好(所有表单验证¶••⊿需要实时刷新的等需求都要基于AJAX实现)

2¶••⊿有利于开发,进步开发的效率
1)前后端的完整分别,后台不需要考虑前端如何实现,前端也不需要考虑后台用什么技巧,真正意义上实现了技巧的划分
2)可以同时进行开发:项目开发开端,首先制定前后端数据交互的接口文档(文档中包含了,调取哪个接口或者哪些数据等协议规范),后台把接口先写好(目前很多公司也需要前端自己拿NODE来模仿这些接口),客户端按照接口调取即可,后台再次去实现接口功效即可

[弊病]
1¶••⊿不利于SEO优化:第一次从服务器端获取的内容不包含需要动态绑定的数据,所以页面的源代码中没有这些内容,不利于SEO收录,后期通过JS添加到页面中的内容,并不会写在页面的源代码中(是源代码不是页面结构)
2¶••⊿交由客户端渲染,首先需要把页面浮现,然后再通过JS的异步AJAX恳求获取数据,然后数据绑定,浏览器在把动态增长的部分重新渲染,无形中糟蹋了一些时间,没有服务器端渲染页面浮现速度快

基于原生JS实现AJAX

//=>创立一个AJAX对象
let xhr=new XMLHttpRequest();
//=>不兼容IE6及更低版本浏览器(IE6:ActiveXObject)
//=>打开恳求地址(可以懂得为一些基础配置,但是并没有发送恳求呢)
xhr.open([method],[url],[async],[user name],[user password]);
//=>监听AJAX状态转变,获取响应
信息(获取响应头信息¶••⊿获取响应主体信息)
xhr.onreadystatechange=()=>{    
   if(xhr.readyState===4 && xhr.status===200){        
       let result=xhr.responseText;//=>获取响应主体中的内容    } };
//=>发送AJAX恳求(括号中传递的内容就是恳求主体的内容)
xhr.send(null);

分析第二步中的细节点

xhr.open([method],[url],[async],[user name],[user password])


[AJAX恳求方法]
1¶••⊿GET系列的恳求(获取)

  • get

  • delete:从服务器上删除某些资源文件

  • head:只想获取服务器返回的响应头信息(响应主体内容不需要获取)

2¶••⊿POST系列恳求(推送)

  • post

  • put:向服务器中增长指定的资源文件

不管哪一种恳求方法,客户端都可以把信息传递给服务器,服务器也可以把信息返回给客户端,只是GET系列一般以获取为主(给的少,拿回来的多),而POST系列一般以推送为主(给的多,拿回来的少)
1)我们想获取一些动态展现的信息,一般应用GET恳求,因为只需要向服务器端发送恳求,告诉服务器端我们想要什么,服务器端就会把需要的数据返回
2)在实现注册功效的时候,我们需要把客户输入的信息发送给服务器进行存储,服务器一般返回成功还是失败等状态,此时我们一般都是基于POST恳求完成

GET系列恳求和POST系列恳求,在项目实战中存在很多的差别
1¶••⊿GET恳求传递给服务器的内容一般没有POST恳求传递给服务器的内容多
原因:GET恳求传递给服务器内容一般都是基于url地址问号传递参数来实现的,而POST恳求一般都是基于设置恳求主体来实现的••。
各浏览器都有自己的关于URL最大长度的限制(谷歌:8KB¶••⊿火狐:7KB¶••⊿IE:2KB…)超过限制长度的部分,浏览器会主动截取掉,导致传递给服务器的数据缺失••。
理论上POST恳求通过恳求主体传递是没有大小限制的,真实项目中为了保证传输的速率,我们也会限制大小(例如:上传的材料或者图片我们会做大小的限制)

2¶••⊿GET恳求很容易涌现缓存(这个缓存不可控:一般我们都不需要),而POST不会涌现缓存(除非自己做特别处理);
原因:GET是通过URL问号传参传递给服务器信息,而POST是设置恳求主体;
设置恳求主体不会涌现缓存,但是URL传递参数就会了••。
```javascript
//=>每个一分钟从新恳求服务器端最新的数据,然后展现在页面中(页面中某些数据实时刷新)
setTimeout(()=>{
$.ajax({
url:’getList?lx=news’,

success:result=>{
//=>第一次恳求数据回来,间隔一分钟后,浏览器又发送一次恳求,但是新发送的恳求,不管是地址还是传递的参数都和第一次一样,浏览器很有可能会把上一次数据获取,而不是获取最新的数据
}
});
},60000);

//=>解决方案:每一次重新恳求的时候,在URL的末尾追加一个随机数,保证每一次恳求的地址不完整一致,就可以避免是从缓存中读取的数据
setTimeout(()=>{
$.ajax({
url:’getList?lx=news&_=’+Math••。random(),

success:result=>{}
});
},60000);


3¶••⊿GET恳求没有POST恳求安全(POST也并不是十分安全,只是相对安全) 原因:还是因为GET是URL传参给服务器  有一种比较简略的黑客技巧:URL劫持,也就是可以把客户端传递给服务器的数据劫持掉,导致信息泄漏 --- URL:恳求数据的地址(API地址),真实项目中,后台开发工程师会编写一个API文档,在API文档中汇总了获取哪些数据

需要应用哪些地址,我们按照文档操作即可   ASYNC:异步(SYNC同步),设置当前AJAX恳求是异步的还是同步的,不写默认是异步(TRUE),如果设置为FALSE,

则代表当前恳求是同步的   用户名和密码:这两个参数一般不用,如果你恳求的URL地址所在的服务器设定了访问权限,则需要我们供给可通行的用

户名和密码才可以(一般服务器都是可以容许匿名访问的)

 

**`第三部分细节研究`**
//=>监听AJAX状态转变,获取响应信息(获取响应头信息¶••⊿获取响应主体信息) xhr.onreadystatechange=()=>{    if(xhr.readyState===4 && xhr.status===200){        let result=xhr.responseText;//=>获取响应主体中的内容    } };

AJAX状态码:描写当前AJAX操作的状态的
xhr.readyState

0:UNSENT 未发送,只要创立一个AJAX对象,默认值就是零
1:OPENED 我们已经履行了xhr.open这个操作
2:HEADERS_RECEIVED 当前AJAX的恳求已经发送,并且已经吸收到服务器端返回的响应头信息了
3:LOADING 响应主体内容正在返回的路上
4:DONE 响应主体内容已经返回到客户端


HTTP网络状态码:记载了当前服务器返回信息的状态 xhr.status
200:成功,一个完整的HTTP事务完成(以2开头的状态码一般都是成功)

以3开头一般也是成功,只不过服务器端做了很多特别的处理
301:Moved Permanently 永久转移(永久重定向)一般利用于域名迁移
302:Move temporarily 临时转移(临时重定向,新的HTTP版本中任务307是临时重定向)一般用于服务器的负载均衡:当前服务器处理不了,我把当前恳求临时交给其他的服务器处理(一般图片恳求经常涌现302,很多公司都有单独的图片服务器)
304:Not Modified 从浏览器缓存中获取数据 把一些不经常更新的文件或者内容缓存到浏览器中,下一次从缓存中获取,减轻服务器压力,也进步页面加载速度

以4开头的,一般都是失败,而且客户端的问题偏大
400:恳求参数毛病
401:无权限访问
404:访问地址不存在

以5开头的,一般都是失败,而且服务器的问题偏大
500:Internal Server Error 未知的服务器毛病
503:Service Unavailable 服务器超负载

AJAX中其它常用的属性和方法

面试题:AJAX中总共支撑几个方法?

let xhr=new XMLHttpRequest();
console.dir(xhr);

[属性]

  • readyState:存储的是当前AJAX的状态码

  • response / responseText / responseXML :都是用来吸收服务器返回的响应主体中的内容,只是根据服务器返回内容的格式不一样,我们应用不同的属性吸收即可

    • responseText是最常用的,吸收到的成果是字符串格式的(一般服务器返回的数据都是JSON格式字符串)

    • responseXML偶尔会用到,如果服务器端返回的是XML文档数据,我们需要应用这个属性吸收

  • status:记载了服务器端返回的HTTP状态码

  • statusText:对返回状态码的描写

  • timeout:设置当前AJAX恳求的超时时间,假设我们设置时间为3000(MS),从AJAX恳求发送开端,3秒后响应主体内容还没有返回,浏览器会把当前AJAX恳求任务强制断开

[方法]

  • abort():强制中断AJAX恳求

  • getAllResponseHeaders():获取全部的响应头信息(获取的成果是一堆字符串文本)

  • getResponseHeader(key):获取指定属性名的响应头信息,例如:xhr.getResponseHeader(‘date’) 获取响应头中存储的服务器的时间

  • open():打开一个URL地址

  • overrideMimeType():重写数据的MIME类型

  • send():发送AJAX恳求(括号中书写的内容是客户端基于恳求主体把信息传递给服务器)

  • setRequestHeader(key,value):设置恳求头信息(可以是设置的自定义恳求头信息)

[事件]

  • onabort:当AJAX被中断恳求触发这个事件

  • onreadystatechange:AJAX状态产生转变,会触发这个事件

  • ontimeout:当AJAX恳求超时,会触发这个事件


  •  

    

let xhr = new XMLHttpRequest();
// xhr.setRequestHeader('aaa', 'xxx');
//=>Uncaught DOMException: Failed to execute 'setRequestHeader' on 'XMLHttpRequest': The object's state must be OPENED. 设置恳求头信息必须在OPEN之后和SEND之前
xhr.open('get', 'temp.xml?_=' + Math.random(), true);// xhr.setRequestHeader('cookie', '珠峰培训');//=>Uncaught DOMException: Failed to execute 'setRequestHeader' on 'XMLHttpRequest': '珠峰培训' is not a valid HTTP header field value. 设置的恳求头内容不是一个有效的值(恳求头部的内容中不得涌现中文汉字)xhr.setRequestHeader('aaa', 'xxx');//=>设置超时xhr.timeout = 100000; xhr.ontimeout = ()=> {    
   console.log('当前恳求已经超时');    xhr.abort(); }; xhr.onreadystatechange = ()=> {    
   let {readyState:state, status}=xhr;    
   //=>阐明恳求数据成功了    if (!/^(2|3)\d{2}$/.test(status)) return;    
   //=>在状态为2的时候就可以获取响应头信息    if (state === 2) {        
       let headerAll = xhr.getAllResponseHeaders(),            serverDate = xhr.getResponseHeader('date');
           //=>获取的服务器时间是格林尼治时间(相比于北京时间差了8小时),通过new Date可以把这个时间转换为北京时间            console.log(headerAll, new Date(serverDate));        
           return;    }    
   //=>在状态为4的时候响应主体内容就已经回来了    if (state === 4) {        
       let valueText = xhr.responseText,
           //=>获取到的成果一般都是JSON字符串(可以应用JSON.PARSE把其转换为JSON对象)            valueXML = xhr.responseXML;
           //=>获取到的成果是XML格式的数据(可以通过XML的一些惯例操作获取存储的指定信息)  如果服务器返回的是XML文档,responseText获取的成果是字符串而responseXML获取的是标准XML文档            console.log(valueText, valueXML);    } }; xhr.send('name=zxt&age=28&sex=man');

 

JS中常用的编码解码方法

正常的编码解码(非加密)
1¶••⊿escape / unescape:重要就是把中文汉字进行编码和解码的(一般只有JS语言支撑:也经常利用于前端页面通信时候的中文汉字编码)

2¶••⊿encodeURI / decodeURI:基础上所有的编程语言都支撑

3¶••⊿encodeURIComponent / decodeURIComponent:和第二种方法非常的类似,差别在于

也可以通过加密的方法进行编码解码
1¶••⊿可逆转加密(一般都是团队自己玩的规矩)
2¶••⊿不可逆转加密(一般都是基于MD5加密完成的,可能会把MD5加密后的成果二次加密)


需求:我们URL问号传递参数的时候,我们传递的参数值还是一个URL或者包含很多特别的字符,此时为了不影响重要的URL,我们需要把传递的参数值进行编码••。应用encodeURI不能编码一些特别字符,所以只能应用encodeURLComponent处理

let str = 'http://www.baidu.com/?',     obj = {         name:'珠峰培训',         age:9,         url:'http://yhea.net/?lx=1'     };
//=>把OBJ中的每一项属性名和属性值拼接到URL的末尾(问号传参方法)
for(let key in obj){    str+=`${key}=${encodeURIComponent(obj[key])}&`;    
   //=>不能应用encodeURI必须应用encodeURIComponent,原因是encodeURI不能编码特别的字符}
   console.log(str.replace(/&$/g,''));
   //=>后期获取URL问号参数的时候,我们把获取的值在依次的解码即可
   String.prototype.myQueryUrlParameter=function myQueryUrlParameter(){    
       let reg=/[?&]([^?&=]+)(?:=([^?&=]*))?/g,        obj={};    
       this.replace(reg,(...arg)=>{        
           let [,key,value]=arg;                    obj[key]=decodeURIComponent(value);//=>此处获取的时候可以进行解码            });    
   return obj; }

AJAX中的同步和异步

AJAX这个任务:发送恳求吸收到响应主体内容(完成一个完整的HTTP事务)
xhr.send():任务开端
xhr.readyState===4:任务结束

let xhr = new XMLHttpRequest(); xhr.open('get', 'temp••。json', false); xhr.onreadystatechange = ()=> {    console.log(xhr.readyState); }; xhr.send();//=>只输出一次成果是4

let xhr = new XMLHttpRequest(); xhr.open('get', 'temp••。json', false); xhr.send();
//=>[同步]开端发送AJAX恳求,开启AJAX任务,在任务没有完成之前,什么事情都做不了(下面绑定事件也做不了) => LOADING => 当readyState===4的时候AJAX任务完成,开端履行下面的操作//=>readyState===4

xhr.onreadystatechange = ()=> {    
   console.log(xhr.readyState); };
//=>绑定方法之前状态已经为4了,此时AJAX的状态不会在转变成其它值了,所以事件永远不会被触发,一次都没履行方法(应用AJAX同步编程,不要把SEND放在事件监听前,这样我们无法在绑定的方法中获取到响应主体的内容)
let xhr = new XMLHttpRequest(); xhr.open('get', 'temp••。json'); xhr.onreadystatechange = ()=> {    
   console.log(xhr.readyState); }; xhr.send();//=>输出3次,成果分辨是 2 3 4

let xhr = new XMLHttpRequest(); xhr.open('get', 'temp••。json'); xhr.send();
//=>xhr.readyState===1
xhr.onreadystatechange = ()=> {    
   console.log(xhr.readyState); };//=>2 3 4
let xhr = new XMLHttpRequest(); xhr.onreadystatechange = ()=> {    
   console.log(xhr.readyState); }; xhr.open('get', 'temp••。json'); xhr.send();//->1 2 3 4
let xhr = new XMLHttpRequest();//=>xhr.readyState===0
xhr.onreadystatechange = ()=> {    
   console.log(xhr.readyState); }; xhr.open('get', 'temp••。json', false);
//=>xhr.readyState===1 AJAX特别处理的一件事:履行OPEN状态变为1,会主动把之前监听的方法履行一次,然后再去履行SEND
xhr.send();
//=>xhr.readyState===4 AJAX任务结束,主任务队列完成//=>1 4

实战案例:倒计时抢购

~function () {    let box = document.getElementById('box'),         serverTime = null;    let fn = ()=> {        
       //=>1¶••⊿盘算当前时间和目标时间的差值        //=>new Date():获取的是客户端本机时间(会受到客户端自己调剂时间的影响),重要的时间参考不能基于这个完成,不管是哪一个客户端都需要基于雷同的服务器时间盘算        //=>每间隔1S中,我们需要把第一次获取的服务器时间进行累加        serverTime = serverTime + 1000;        
       let tarTime = new Date('2017/12/14 13:12:20').getTime(),            spanTime = tarTime - serverTime;        
           //=>2¶••⊿盘算差值中包含多少时分秒        if (spanTime < 0) {            
           //=>已经错过了抢购的时间(已经开抢了)            box.innerHTML = '开抢啦!!';            clearInterval(autoTimer);            
           return;        }        
       let hours = Math.floor(spanTime / (1000 * 60 * 60));        spanTime -= hours * 3600000;        
       let minus = Math.floor(spanTime / (1000 * 60));        spanTime -= minus * 60000;        
       let seconds = Math.floor(spanTime / 1000);        hours < 10 ? hours = '0' + hours : null;        minus < 10 ? minus = '0' + minus : null;        seconds < 10 ? seconds = '0' + seconds : null;        box.innerHTML = `距离开抢还剩下 ${hours}:${minus}:${seconds}`;    };    
   let autoTimer = setInterval(fn, 1000);    
   //=>从服务器端获取服务器时间    let getServerTime = ()=> {        
   let xhr = new XMLHttpRequest();        xhr.onreadystatechange = ()=> {            
       //console.log(xhr.readyState);
       //=>HEAD恳求方法,状态码中没有3(不需要等候响应主体内容)
           if (!/^(2|3)\d{2}$/.test(xhr.status)) return;            
               if (xhr.readyState === 2) {                serverTime = new Date(xhr.getResponseHeader('date')).getTime();                fn();            }        };        xhr.open('head', 'temp.xml', true);        xhr.send(null);        /*         * 获取服务器时间总会涌现时间差的问题:服务器端把时间记载好,到客户端获取到事件有延迟差(服务器返回的时候记载的是10:00,我们客户端获取的时候已经是10:01,但是我们获取的成果依然是10:00,这样就有1分钟时间差)         *         * [尽可能的减少时间差,是我们优化的全部目标]         *         * 1¶••⊿服务器返回的时间在响应头信息中就有,我们只需要获取响应头信息即可,没必要获取响应主体内容,所以恳求方法应用 HEAD 即可         * 2¶••⊿必须应用异步编程:同步编程我们无法在状态为2或者3的时候做一些处理,而我们获取响应头信息,在状态为2的时候就可以获取了,所以需要应用异步         * 3¶••⊿在状态为2的时候就把服务器时间获取到         * ...         */    };    getServerTime(); }();

AJAX类库的封装

JQ中的AJAX应用及每一个配置的作用(包含里面的一些细节知识)

$.ajax({     url:'xxx.txt',//=>恳求API地址     method:'get',//=>恳求方法GET/POST...在老版本JQ中应用的是type,应用type和method实现的是雷同的效果     dataType:'json',//=>dataType只是我们预设获取成果的类型,不会影响服务器的返回(服务器端一般给我们返回的都是JSON格式字符串),如果我们预设的是json,那么类库中将把服务器返回的字符串转换为json对象,如果我们预设的是text(默认值),我们把服务器获取的成果直接拿过来操作即可,我们预设的值还可以是xml等     cache:false,//=>设置是否扫除缓存,只对GET系列恳求有作用,默认是TRUE不清缓存,手动设置为FALSE,JQ类库会在恳求URL的末尾追加一个随机数来扫除缓存     data:null,//=>我们通过DATA可以把一些信息传递给服务器;GET系列恳求会把DATA中的内容拼接在URL的末尾通过问号传参的方法传递给服务器,POST系列恳求会把内容放在恳求主体中传递给服务器;DATA的值可以设置为两种格式:字符串¶••⊿对象,如果是字符串,设置的值是什么传递给服务器的就是什么,如果设置的是对象,JQ会把对象变为 xxx=xxx&xxx=xxx 这样的字符串传递给服务器     async:true,//=>设置同步或者异步,默认是TRUE代表异步,FALSE是同步     success:function(result){        //=>当AJAX恳求成功 (readyState===4 & status是以2或者3开头的)         //=>恳求成功后JQ会把传递的回调函数履行,并且把获取的成果当做实参传递给回调函数    (result就是我们从服务器端获取的成果)     },     error:function(msg){},//=>恳求毛病触发回调函数     complate:function(){},//=>不管恳求是毛病的还是正确的都会触发回调函数(它是完成的意思)     ... });

封装属于自己的AJAX类库

[支撑的参数]

url

method / type

data

dataType

async

cache

success


 

~function () {     class ajaxClass {         //=>SEND AJAX         init() {             //=>THIS:EXAMPLE             let xhr = new XMLHttpRequest();             xhr.onreadystatechange = ()=> {                 if (!/^[23]\d{2}$/.test(xhr.status)) return;                 if (xhr.readyState === 4) {                     let result = xhr.responseText;                     //=>DATA-TYPE                     try {                         switch (this.dataType.toUpperCase()) {                             case 'TEXT':                             case 'HTML':                                 break;                             case 'JSON':                                 result = JSON.parse(result);                                 break;                             case 'XML':                                 result = xhr.responseXML;                         }                     } catch (e) {                      }                     this.success(result);                 }             };              //=>DATA             if (this.data !== null) {                 this.formatData();                  if (this.isGET) {                     this.url += this.querySymbol() + this.data;                     this.data = null;                 }             }              //=>CACHE             this.isGET ? this.cacheFn() : null;              xhr.open(this.method, this.url, this.async);             xhr.send(this.data);         }          //=>CONVERT THE PASSED OBJECT DATA TO STRING DATA         formatData() {             //=>THIS:EXAMPLE             if (Object.prototype.toString.call(this.data) === '[object Object]') {                 let obj = this.data,                     str = ``;                 for (let key in obj) {                     if (obj.hasOwnProperty(key)) {                         str += `${key}=${obj[key]}&`;                     }                 }                 str = str.replace(/&$/g, '');                 this.data = str;             }         }          cacheFn() {             //=>THIS:EXAMPLE             !this.cache ? this.url += `${this.querySymbol()}_=${Math.random()}` : null;         }          querySymbol() {             //=>THIS:EXAMPLE             return this.url.indexOf('?') > -1 ? '&' : '?';         }     }      //=>INIT PARAMETERS     window.ajax = function ({         url = null,         method = 'GET',         type = null,         data = null,         dataType = 'JSON',         cache = true,         async = true,         success = null     }={}) {         let _this = new ajaxClass();         ['url', 'method', 'data', 'dataType', 'cache', 'async', 'success'].forEach((item)=> {             if (item === 'method') {                 _this.method = type === null ? method : type;                 return;             }             if (item === 'success') {                 _this.success = typeof success === 'function' ? success : new Function();                 return;             }             _this[item] = eval(item);         });         _this.isGET = /^(GET|DELETE|HEAD)$/i.test(_this.method);         _this.init();         return _this;     }; }();

上一篇: 关于React脚手架的一点研究

下一篇: 面向对象深入解读

75秒赛车投注网 快速飞艇投注官网 艾米彩票平台 qq分分彩投注官网 网易红彩彩票开奖走势图 金沙彩票平台 香港跑马官网开奖 75秒快3投注网站 快乐时时彩 玖玖网彩票官网