57、JavaScript AJAX

节省用户操作,事件,提高用户体验。减少数据请求,传输获取数据

ajax:异步的javascript和数据传输(传输格式:xml、json)

使用Ajax 使用ajax获取某一文件的内容

Ajax过程详解 创建对象XMLHttpRequest() ActiveXObject(‘Microsoft.XMLHTTP)

xml:数据传输格式(大型门户网站:新浪、网易、凤凰网)

优点:标签名和行间属性由用户自定义,种类丰富;传输量非常大

缺点:解析麻烦;不太适合轻量级数据

json数据传输格式(字符串):(95%移动端应用)

优点:1.轻量级数据 2.解析轻松

缺点:传输数量比较小;传输种类比较少

JSON.parse():字符串转成对象 JSON.stringfy() 对象转成字符串 。

异步与同步:

注:任何一个程序由很多个小程序组成的。每一个小程序都有不同的运行状态。

同步与异步用来描述一个程序运行的状态。

同步:阻塞,等待前一个程序运行完毕,在执行下一个程序

异步:非阻塞,当前程序运行和前面的程序是否运行完毕没有关系。

ajax:前后端数据交互的搬运工,都可以异步执行。

注:ajax请求服务,需要运行在服务器上,让文件暴露,其他用户可以访问本地磁盘文件
 
传输数据过程:

1、 创建ajax对象=>在浏览器打开新窗口;

2、 调用open=>在地址栏输入路径;

3、 调用send=>回车跳转;

4、 等待数据响应=>等待页面加载完成;

创建ajax对象:

XMLHttpRequest IE8以下不兼容。

ActiveXObject(‘Microsoft.XMLHTTP’) IE8以下

/* 1.创建ajax对象 */
/* 方式一 */
// var xhr=null;
// if(window.XMLHttpRequest){


// 	xhr=new XMLHttpRequest;
// }else{


// 	xhr=new ActiveXObject('Microsoft.XMLHTTP')
// }

/* 方式二 */
// var xhr=window.XMLHttpRequest?new XMLHttpRequest:new ActiveXObject('Microsoft.XMLHTTP')

/* 方式三 */
var xhr=null;
try{


    xhr=new XMLHttpRequest();
}catch(error){


    xhr=new ActiveXObject('Microsoft.XMLHTTP')

try_catch:

try{
   
     

​	尝试执行的代码

}catch(error){
   
     

error  错误对象,try括号中代码执行的异常信息;

补救代码;

}

执行过程:

1、 先去执行try中的代码;

2、 如果try中的代码执行正常,catch中的代码就不执行了;
 
3、 如果try中的代码执行异常,直接catch中的代码;
 
注:如果try中出现错误代码,不会在执行try中的后续代码,而是直接执行catch内的代码。

与if…else区别:

if…lese:不能判断是写在if…else的代码错误;程序中断

try…catch:查看该段程序是否执行异常;提示错误信息,执行补救代码。

作用:代码调试和后期维护。

升级版:try_throw_catch

try{
   
     

​	尝试执行的代码

​	throw new Error('异常信息文本')

}catch(error){
   
     

error  错误对象,throw括号中代码执行的异常信息文本;

}

 
 
 
作用:分段判断try中哪段代码出现错误,起到一个截断效果。加入try中的throw之前的代码正常运行,那么错误不在这段代码中,将throw代码往后挪动,就可以找代码错误出处。
open()方法

/* 第一个参数:请求方式  第二参数 请求地址  第三个参数:异步(true)、同步(false) */

表单的get、post方法

GET:

案例:  
提交方式:直接将数据拼接在url进行提交,通过?进行拼接(?username=122333&age=&password=122333),?后面称为查询字符串(username=122333&age=&password=122333)

好处:简单

缺点:不安全;地址栏数据有上限最多只能2kb,没法实现大数据上传。
POST:
 
enctype:提交数据格式的请求头,默认application/x-www-form-urlencoded

提交方式:浏览器内部进行提交

好处:安全,提交数量理论没有上限(但是存在一定的空间限制:网速、浏览器服务器空间大小)

缺点:提交比较复杂。
 

ajax的get和post:

get:

数据传输在url后面拼接

xhr.open('GET','GET_POST/get.php?username=dog&password=123456&age=18' ,'true')

 
 
post:

xhr.open('POST','GET_POST/post.php' ,'true')

/* 3.调用send 发送请求*/
/* 设置post请求头的格式 */
xhr.setRequestHeader('content-type','application/x-www-form-urlencoded')
xhr.send('username=dog&password=123456&age=18')

在send方法之前设置请求头的格式。

数据传输在send方法以传参的方式进行传输。

onreadystatechange事件 :请求状态监控

readystatechange 事件类型

readyState属性:请求状态, 发生变化的时候调用

0:调用open方法之前 (初始化)

1:已调用send方法,正在发送数据 (载入)

2:send()方法已完成,已收到全部响应内容(载入完成)

3:正在解析响应内容 (正在解析响应内容)

4:响应内容解析完成,可以在客户端调用了(完成)
 
status属性:服务器(请求资源)的状态 HTTP状态码
 
1**:请求收到,继续处理

2**:操作成功收到,分析、接受

3**:完成此请求必须进一步处理

4**:请求包含一个错误语法或不能完成

5**:服务器执行一个完全有效请求失败

100–客户必须继续发出请求

101–客户要求服务根据请求转换HTTP协议版本

200–交易成功

201–提示直到新文件的URL

202–接受和处理、但处理未完成

203–返回信息不确定或不完整

204–请求受到,但返回信息为空

205–服务器完成请求,用户代理必须复为当前已经浏览过的文件

206–服务器已经完成了部分用户的GET请求

300–请求额资源可在多处得到

301–删除请求数据

302–在其他地址发现请求数据

303–建议客户访问其他URL或访问方式

304–客户端已经执行GET,但文件未变化

305–请求的资源必须从服务器指定的地址得到

306–前一版本的HTTP中使用的代码,现行版本中不再使用

307–申明请求的资源临时性删除

400–错误请求,语法错误

401–请求授权失败

402–保留有效ChargeTo头响应

403–请求不允许

404–没有发现文件、查询或URL

405–用户在Request-line字段定义的方法不允许

406–根据用户发送的Accept,请求资源不可访问

408–客户端没有在用户指定的时间内完成请求

409–对当前资源状态,请求不能完成。

410–服务器不再有此资源且无法进一步的参考地址

411–服务器拒绝用户顶的Content-Length属性请求

412–一个或多个请求头字段在当前请求中错误

413–请求的资源大于服务器允许的大小

414–请求的资源URL长于服务器允许的长度

415–请求资源不支持请求项目的格式

416–请求包含Range氢气头字段,在当前资源范围内没有range指示值,请求也不包含If-Range请求头字段

417–服务器不满足请求Expect头字段指定的期望值,如果是代理服务器,可能时下以及服务器不能满足请求

500–服务器产生内部错误

501–服务器不支持请求的函数

502–服务器暂时不可用,又是为了防止发生系统过载

503–服务器过载或暂停维修

504–关口过载,服务器使用另一个关口来响应用户,等待事件设定值较长

505–服务器不支持或拒绝请求投中的指定HTTP版本

注:不管请求数据是否成功和失败,都会有响应值。

返回内容:
responseText:返回以文本形式存放的内容

responseXML:返回XML形式的内容

ajax函数封装:

function ajax_package({
   
     method='get',url,data}) {
   
     
	/* 1.创建ajax对象 */
	var xhr = null;
	try {
   
     
		xhr = new XMLHttpRequest();
	} catch (error) {
   
     
		xhr = new ActiveXObject('Microsoft.XMLHTTP')
	}
	
	if(method.toLowerCase()=='get'&&data){
   
     
		url+='?'+data;
	}
	//2.调用open
	xhr.open(method, url, 'true')
	//3.调用send,发送数据
	if(method.toLowerCase()==='get'){
   
     
		xhr.send()
	}else {
   
     
		xhr.setRequestHeader('content-type','application/x-www-form-urlencoded');
		xhr.send(data)
	}
	/* 4.等待数据响应 */
	xhr.onreadystatechange = function() {
   
     
		console.log(xhr.readyState)
		/* 响应内容是否解析完成 */
		if (xhr.readyState == 4) {
   
     
			/* 判断数据请求是否成功 */
			if (xhr.status == 200) {
   
     
				console.log('请求成功:', xhr.responseText)
			} else {
   
     
				console.log('请求失败:', xhr.status)
			}
	
		}
	}
}

示例:  
但是上述方式封装有个小bug

bug1:如果用户传输数据时都是以字符串形式传入的话,那么就会

比较麻烦,而且可读性差。所以我们要将在调用ajax封装函数时传入数据的形式从字符串转成对象形式,然后再在封装函数内部将对象转成字符串

优化:

function queryString(obj){
   
     
	let str=''
	for(let attr in obj){
   
     
		str+=attr+'='+obj[attr]+'&'
	}
	let newstr=str.substr(0,str.length-1)
	return newstr
}
function ajax_package({
   
     method='get',url,dataobj}) {
   
     
	var data=''
	/* 对象转字符串 */
	if(dataobj){
   
     
		var data=queryString(dataobj)
	}
	
	/* 1.创建ajax对象 */
	var xhr = null;
	try {
   
     
		xhr = new XMLHttpRequest();
	} catch (error) {
   
     
		xhr = new ActiveXObject('Microsoft.XMLHTTP')
	}
	if(method.toLowerCase()=='get'&&data){
   
     
		url+='?'+data;
	}
	xhr.open(method, url, 'true')
	if(method.toLowerCase()==='get'){
   
     
		xhr.send()
	}else {
   
     
		xhr.setRequestHeader('content-type','application/x-www-form-urlencoded');
		xhr.send(data)
	}
	/* 4.等待数据响应 */
	xhr.onreadystatechange = function() {
   
     
		/* 响应内容是否解析完成 */
		if (xhr.readyState == 4) {
   
     
			/* 判断数据请求是否成功 */
			if (xhr.status == 200) {
   
     
				console.log('请求成功:', xhr.responseText)
			} else {
   
     
				console.log('请求失败:', xhr.status)
			}
	
		}
	}
}

 
bug2:请求成功之后的数据处理不能永远是只输出数据。对于不同的请求,我们可能希望对数据处理的方式不同,此时我们可以传入回调函数方式进行对不同数据进行不同处理方式。

最终版:

function queryString(obj){


    var str=''
    for(let key in obj){


        str+=key+'='+obj[key]+'&'
    }
    return str;
}
function $ajax({

method='get',url,data,success,error}){


    if(data){


        /* 字符串转对象 */
        data=queryString(data)
    }
    /* 1.创建ajax对象 */
    /* 兼容性处理 */
    var xhr=null
    try{


        xhr=new XMLHttpRequest();
    }catch(error){


        xhr=new ActiveXObject('Microsoft.XMLHTTP')
    }
    /* 2.调用open */
    method=method.toLowerCase();
    if(method=='get'&&data){


        url+='?'+data
    }
    xhr.open(method,url,true);
    /* 3.调用send */
    if(method=='get'){


        xhr.send()
    }else{


        /*post 请求头格式 */
        xhr.setRequestHeader('content-type','application/x-www-form-urlencoded')
        xhr.send(data)
    }
    /* 4.等待请求数据响应 */
    xhr.onreadystatechange=function(){


        /* 判断响应数据是否请求完成 */
        if(xhr.readyState==4){


            if(xhr.status==200){


                /* 请求成功回调函数 */
                success(xhr.responseText)
            }else{


                /* 请求失败回调函数 */
                error(xhr.status)
            }
        }
    }
}