JavaScript中的Ajax

4 篇文章 0 订阅

JavaScript中的Ajax

一.AJAX

是一种异步通信无刷新技术

1.核心对象

XMLHttpRequest对象

1)获取XMLHttpRequest对象

var xhr=new XMLHttpRequest();

属性名说明
onreadystatechange ★监听readystate值的变化
readystate ★数据响应的变化
status ★响应状态码
statusText ★状态码的说明
responseText ★响应的数据

当请求发送到服务器端,收到响应后,响应的数据会自动填充XHR对象的属性。

属性名说明
responseText作为响应主体被返回的文本
responseXML如果响应主体内容类型是"text/xml"或"application/xml",则返回包含响应数据的XML DOM文档
status响应的HTTP状态
statusTextHTTP状态的说明
(1)readystate 数据响应的变化
状态说明
0未初始化尚未调用open()方法
1启动已经调用open()方法,但尚未调用send()方法
2发送已经调用send()方法,但尚未接受响应
3接受已经接受到部分响应数据
4 ★完成已经接受到全部响应数据,而且可以使用

0=未初始化
1=已经调用open方法,但未调用send方法
2=调用send方法,但未开始响应
3=响应部分响应
4=完全响应数据,且可以使用

(2)status 响应状态码
HTTP状态码状态字符串说明
200 ★OK服务器成功返回了页面
400Bad Request语法错误导致服务器不识别
401Unauthorized请求需要用户认证
404 ★Not found指定的URL在服务器上找不到
500 ★Internal Server Error服务器遇到意外错误,无法完成请求
503ServiceUnavailable服务器过载或维护导致无法完成请求

200=响应成功
500=服务器异常(报错)
404=未找到资源

2.Ajax的实现流程

1)创建XMLHTTPRequest对象

var xhr=new XMLHttpRequest();

2)打开请求/发送请求

xhr.open(参数1,参数2,参数3)

​ 参数1:请求的方式 (GET|POST)

​ 参数2:请求的路径 (请求地址:如果是GET方请求,参数直接拼在地址栏后面)

​ 参数3:是否异步 (true|false; 默认是true,表示异步)

3)发送请求

xhr.send(参数)

​ 参数: 要传递的数据(参数)

​ 如果是GET请求: send(null);

​ 如果是POST请求: 有参数,则设置参数;无参数则设置为null

4)接收响应

如果响应成功,则接收数据,即status==200

​ xhr.responseText

5)简单实现流程

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>Ajax的实现流程</title>
	</head>
	<body>
	</body>
<script type="text/javascript">
		// 1、创建XMLHttpRequest对象
		var xhr = new  XMLHttpRequest();
		//console.log(xhr);
		// 2、打开请求/准备请求     xhr.open("请求类型GET|POST","请求路径","是否异步true|false")
		xhr.open("GET","js/data.json",false); // 同步请求
		
		// 3、发送请求     xhr.send(参数)
		xhr.send(null);
		
		// 4、接收响应    xhr.responseText
		if (xhr.status == 200) {
			// 如果响应成功,接收数据
			console.log(xhr.responseText);
		}
	</script>
</html>

3.Ajax的请求

1)get的同步和异步

GET请求是最常见的请求类型,最常用于向服务器查询某些信息。

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>GET请求</title>
	</head>
	<body>	
		<button onclick="ajaxGet1()">同步请求</button> &nbsp; &nbsp; &nbsp;
		<button onclick="ajaxGet2()">异步请求</button>
	</body>	
	<script type="text/javascript">
		// GET的同步请求
		function ajaxGet1() {
			// 1、创建XMLHttpRequest对象
			var xhr = new XMLHttpRequest();
			// 2、打开请求/准备请求
			xhr.open("GET","js/data.json?uname=zhangsan&upwd=1234",false); // 同步请求
			// 3、发送请求
			xhr.send(null);
			// 4、接收响应
			if(xhr.status == 200) {
				console.log(xhr.responseText);
			}
		}
		// GET的异步请求
		function ajaxGet2() {
			// 1、创建XMLHttpRequest对象
			var xhr = new XMLHttpRequest();
			// 2、打开请求/准备请求
			xhr.open("GET","js/data.json?uname=zhangsan&upwd=1234",true); // 异步请求
			// 3、发送请求
			xhr.send(null);
			// 4、接收响应
			// 监听数据是否完全响应  readystate
			xhr.onreadystatechange = function(){
				// 判断readyState的值是否为4(数据已经完全响应)
				if (xhr.readyState == 4) {
					if(xhr.status == 200) {
						console.log(xhr.responseText);
					} else {
						console.log("失败状态码:" + xhr.status + ",错误原因:" + xhr.statusText);
					}
				}
			}	
		}
		var obj = {
			url:"js/data.json?aa=1", // 请求路径
			async:true, // 是否异步
			data:{	// 请求的参数数据   uname=zhangsan&upwd=1234
				uname:"zhangsan",
				upwd:"1234"
			}
		}
		// 调用ajax的get请求
		ajaxGet(obj);	
		/**
		 * 封装GET请求
		 */
		function ajaxGet(obj) {
			// 默认GET请求
			// 1、创建XMLHttpRequest对象
			var xhr = new XMLHttpRequest();
			// 得到请求的参数     uname=zhangsan&upwd=1234
			var params = formatParams(obj.data);	
			// 判断参数是否为空,不为空则拼接到地址后面
			if (params != null) {
				obj.url += (obj.url).indexOf("?") != -1  ?  "&" + params  : "?" + params;
			}
			// 2、打开请求/准备请求
			xhr.open("GET",obj.url,obj.async); 
			// 3、发送请求
			xhr.send(null);
			// 4、接收响应
			// 判断是否是异步请求
			if (obj.async) { // 异步请求
				// 监听数据是否完全响应  readystate
				xhr.onreadystatechange = function(){
					// 判断readyState的值是否为4(数据已经完全响应)
					if (xhr.readyState == 4) {
						// 4、接收响应
						callback();
					}
				}
			} else { // 同步请求
				// 4、接收响应
				callback();
			}	
			/**
			 * 响应成功处理的结果
			 */
			function callback() {
				if(xhr.status == 200) {
					console.log(xhr.responseText);
				} else {
					console.log("失败状态码:" + xhr.status + ",错误原因:" + xhr.statusText);
				}
			}
		}
		/**
		 * 格式化参数数据,并返回给调用者
		 * @param {Object} data
		 */
		function formatParams(data){
			// 得到格式化好的参数数据
			var params = null;
			
			if (data != null  && data.length > 0) {
				// 定义数组,接收每个参数键值对
				var arr = [];
				// 遍历对象,得到对象中的键和值
				for (var k in data) {
					var name = k;
					var value = data[k];
					// 拼接键和值
					var param = name+"="+value;
					// 将键值对设置到数组中
					arr.push(param);
				}
				// 将数组转换成以指定符号分隔的字符串
				params = arr.join("&");
				console.log(params);
			}
			return params
		}
	</script>
</html>

2)post的同步和异步

POST请求可以包含非常多的数据,我们在使用表单提交的时候,很多就是使用的POST传输方式。

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>POST请求</title>
</head>
<body>	 
	 <button onclick="ajaxPost1()">同步请求</button> &nbsp; &nbsp; &nbsp;
	 <button onclick="ajaxPost2()">异步请求</button>	 
</body>
<script type="text/javascript">
	/**
		Ajax Post请求  同步请求
	 */
	function ajaxPost1() {
		// 1、创建XMLHttpRequest对象
		var xhr = new XMLHttpRequest();
		// 2、打开请求/准备请求
		xhr.open("POST","js/data.json",false); // 同步请求 
		// 向服务器发送POST请求由于解析机制的原因,需要进行特别的处理。因为POST请求和Web表单提交是不同的,需要使用XHR来模仿表单提交。
		xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
		// 3、发送请求
		xhr.send("uname=zhangsan&upwd=1234");
		// 4、接收响应
		if(xhr.status == 200) {
			console.log(xhr.responseText);
		}
	}
	/**
		Ajax Post请求  异步请求
	 */
	function ajaxPost2() {
		// 1、创建XMLHttpRequest对象
		var xhr = new XMLHttpRequest();
		// 2、打开请求/准备请求
		xhr.open("POST","js/data.json",true); // 异步请求 
		// 向服务器发送POST请求由于解析机制的原因,需要进行特别的处理。因为POST请求和Web表单提交是不同的,需要使用XHR来模仿表单提交。
		xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
		// 3、发送请求
		xhr.send("uname=zhangsan&upwd=1234");
		// 4、接收响应
		// 监听数据是否完全响应  readystate
		xhr.onreadystatechange = function(){
			// 判断readyState的值是否为4(数据已经完全响应)
			if (xhr.readyState == 4) {
				if(xhr.status == 200) {
					console.log(xhr.responseText);
				} else {
					console.log("失败状态码:" + xhr.status + ",错误原因:" + xhr.statusText);
				}
			}
		}
	}
	var obj = {
			url:"js/data.json", // 请求路径
			async:true, // 是否异步
			data:{	// 请求的参数数据   uname=zhangsan&upwd=1234
				uname:"zhangsan",
				upwd:"1234"
			}
		}
	// 调用ajax的post方法
	ajaxPost(obj);
	/*
		封装Ajax的Post请求
	*/
	function ajaxPost(obj) {
		// 默认POST请求
		// 1、创建XMLHttpRequest对象
		var xhr = new XMLHttpRequest();
		// 2、打开请求/准备请求
		xhr.open("POST",obj.url,obj.async); 
		// 向服务器发送POST请求由于解析机制的原因,需要进行特别的处理。因为POST请求和Web表单提交是不同的,需要使用XHR来模仿表单提交。
		xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
		// 得到格式化后的参数
		var params = formatParams(obj.data);
		// 3、发送请求
		// 判断是否存在参数
		if (params != null) {
			xhr.send(params);
		} else {
			xhr.send(null);
		}
		// 判断是否是异步请求
		if (obj.async) { // 异步请求
			// 监听数据是否完全响应  readystate
			xhr.onreadystatechange = function(){
				// 判断readyState的值是否为4(数据已经完全响应)
				if (xhr.readyState == 4) {
					// 4、接收响应
					callback();
				}
			}
		} else { // 同步请求
			// 4、接收响应
			callback();
		}
		/**
		 * 响应成功处理的结果
		 */
		function callback() {
			if(xhr.status == 200) {
				console.log(xhr.responseText);
			} else {
				console.log("失败状态码:" + xhr.status + ",错误原因:" + xhr.statusText);
			}
		}
		
	}
	/**
	 * 格式化参数数据,并返回给调用者
	 	{	   
			uname:"zhangsan",
			upwd:"1234"
		}	
		uname=zhangsan&upwd=1234
	 * @param {Object} data
	 */
	function formatParams(data){
		// 得到格式化好的参数数据
		var params = null;
		if (data != null  && data.length > 0) {
			// 定义数组,接收每个参数键值对
			var arr = [];
			// 遍历对象,得到对象中的键和值
			for (var k in data) {
				var name = k;
				var value = data[k];
				// 拼接键和值
				var param = name+"="+value;
				// 将键值对设置到数组中
				arr.push(param);
			}
			// 将数组转换成以指定符号分隔的字符串
			params = arr.join("&");
			console.log(params);
		}
		return params
	}
</script>
</html>

3)Ajax请求功能的封装

Ajax实现流程
1、创建XMLHttpRequest对象
var xhr = new XMLHttpRequest();
2、准备请求/打开请求
xhr.open(参数1,参数2,参数3)
参数1:请求的方式 (GET|POST)
参数2:请求的路径 (请求地址;如果是GET请求,参数直接拼接在地址栏后面)
参数3:是否异步 (true|false。默认是true,表示异步)
3、发送请求
xhr.send(参数);
如果是GET请求,则send(null); 参数会直接设置在请求的地址后面;
如果是POST
向服务器发送POST请求由于解析机制的原因,需要进行特别的处理。因为POST请求和Web表单提交是不同的,需要使用XHR来模仿表单提交。
xhr.setRequestHeader(‘Content-Type’,‘application/x-www-form-urlencoded’);
如果有参数,则send(参数);如果没有参数,则send(null)
4、接收响应
如果是同步请求
判断是否响应成功 status200
如果是,则获取响应数据 xhr.responseText
如果是异步请求
通过onreadystatechange事件监听readyState的值变化,当数据完全响应成功时,readyState的值为4
判断readyState的值是否为4
如果是,判断是否响应成功 status
200
如果是,则获取响应数据 xhr.responseText

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>封装Ajax</title>
</head>
<body> 
</body>
<script type="text/javascript">
	var obj = {
		url:"js/data.json",
		type:"GET", // 请求类型 GET|POST
		async:true, // 是否异步请求  true|false
		data:{
			uname:"zhangsan",
			upwd:"123"
		},
		success:function(result){
			alert(result);
		}
	};
	ajax(obj);
	var obj2 = {
			url:"js/data.json",
			type:"GET", // 请求类型 GET|POST
			async:false, // 是否异步请求  true|false
			data:{
				uname:"zhangsan",
				upwd:"123"
			},
			success:function(result){
				console.log(result);
			}
		};	
	ajax(obj2);
	ajax({
		url:"js/data.json",
		type:"GET", // 请求类型 GET|POST
		async:false, // 是否异步请求  true|false
		data:{
			uname:"zhangsan",
			upwd:"123"
		},
		success:function(result){
			console.log(result);
		}
	});
	/**
		封装Ajax
	 */
	function ajax(obj) {
		// 1、创建XMLHttpRequest对象
		var xhr = new XMLHttpRequest();
		// 将对象格式的参数转换成键值对的字符串格式   
		var params = formatParams(obj.data);
		// 判断是否是GET请求
		if ((obj.type).toUpperCase() == "GET") {
			// 将参数拼接到地址后面
			obj.url += (obj.url).indexOf("?") != -1  ? "&"+params : "?"+params;
		}
		// 2、准备请求/打开请求
		xhr.open(obj.type,obj.url,obj.async);
		// 3、发送请求  xhr.send(参数);
		if ((obj.type).toUpperCase() == "GET") {
			// GET请求,参数设置为null
			xhr.send(null);
		} else {
			// 如果是POST请求
			// 向服务器发送POST请求由于解析机制的原因,需要进行特别的处理。因为POST请求和Web表单提交是不同的,需要使用XHR来模仿表单提交。
			xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
			// 如果有参数,则send(参数);如果没有参数,则send(null)
			xhr.send(params);
		}
		// 4、接收响应
		if (obj.async) { // 如果是异步请求
			// 如果是异步请求
			// 	通过onreadystatechange事件监听readyState的值变化,当数据完全响应成功时,readyState的值为4
			xhr.onreadystatechange = function() {
				//	判断readyState的值是否为4
				if (xhr.readyState == 4) {
					// 判断是否响应成功 status==200;如果是,则获取响应数据  xhr.responseText
					callback();
				}
			}
		} else { // 如果是同步请求
			// 判断是否响应成功 status==200;如果是,则获取响应数据  xhr.responseText
			callback();
		}
		//回调函数
		function callback() {
			// 判断是否响应成功 status==200;如果是,则获取响应数据  xhr.responseText
			if (xhr.status == 200) {
				// console.log(xhr.responseText);
				obj.success(xhr.responseText);
			}
		}
	}
	/**
	 * 格式化参数数据,并返回给调用者
	 * @param {Object} data
	 */
	function formatParams(data){
		// 得到格式化好的参数数据
		var params = null;
		if (data != null  && data.length > 0) {
			// 定义数组,接收每个参数键值对
			var arr = [];
			// 遍历对象,得到对象中的键和值
			for (var k in data) {
				// 拼接键和值
				var param = k + "=" + data[k];
				// 将键值对设置到数组中
				arr.push(param);
			}
			// 将数组转换成以指定符号分隔的字符串
			params = arr.join("&");
		}
		return params;
	}
</script>
</html>

4.JQuery-Ajax

jquery调用ajax方法

1) $.ajax()

格式:$.ajax({});
参数:
type:请求方式GET/POST ★
url:请求地址url ★
async:是否异步,默认是true表示异步
data:发送到服务器的数据
dataType:预期服务器返回的数据类型 ★
contentType:设置请求头
success:请求成功时调用此函数 ★
error:请求失败时调用此函数

//主代码
$.ajax({
	type:"get",		//请求类型 GET|POST
	url:"data.txt",		//请求地址
	data:{	//请求传递给后台的参数数据
	
	},
	dataType:"json",	//预期服务器返回的数据类型是JSON格式,浏览器接收后会自动封装为JSON对象
	success:function(result){	//回调函数:用来接收ajax请求后返回的结果
		console.log(result);
		//将JSON格式的字符串转换为JSON对象
		//var json = JSON.parse(result);console.log(json);
		var ul=$("<ul></ul>");
		//遍历
		for(var i=0;i<result.length;i++){
			var li = "<li>"+ result[i].uname +"</li>";
			//将li追加到ul中
			ul.append(li);
		}
		//将ul追加到body中
		$("body").append(ul);
	}
});

2)$.get()

这是一个简单的 GET 请求功能以取代复杂 $.ajax()

请求成功时可调用回调函数。如果需要在出错时执行函数,请使用 $.ajax


//有请求地址,无参数,无返回值
$.get("data.json");

//有请求地址,有参数,无返回值
$.get(uname:"zhangsan",upwd:"123");

//有请求地址,无参数,有返回值
$.get("data.json",function(result){
	console.log(result);
});

//有请求地址有参数,有返回值
$.get("data,json",{uname:"zhangsan",upwd:"123"},function(result){
	console.log(result);
})

3)$.post()

这是一个简单的 POST 请求功能以取代复杂 $.ajax()

请求成功时可调用回调函数。如果需要在出错时执行函数,请使用 $.ajax


//有请求地址,无参数,无返回值
$.post("data.json");

//有请求地址,有参数,无返回值
$.post(uname:"zhangsan",upwd:"123");

//有请求地址,无参数,有返回值
$.post("data.json",function(result){
	console.log(result);
});

//有请求地址有参数,有返回值
$.post("data,json",{uname:"zhangsan",upwd:"123"},function(result){
	console.log(result);
})

4)$.getJSON()

表示请求返回的数据类型是JSON格式的ajax请求

//有请求地址,无参数,无返回值
$.getJSON("data.json");

//有请求地址,有参数,无返回值
$.getJSON(uname:"zhangsan",upwd:"123");

//有请求地址,无参数,有返回值
$.getJSON("data.json",function(result){
	console.log(result);
});

//有请求地址有参数,有返回值
$.getJSON("data,json",{uname:"zhangsan",upwd:"123"},function(result){
	console.log(result);
})

5) jsonp

​ 远程跨域时,如果有两个域名,从其中一个域名去访问另一个域名时,使用普通的ajax方法是获取不到数据的,那么就可以使用jsonp方式发送请求。

添加属性:
jsonp:’callback’
dataType:’jsonp’

$.ajax({
		type:"get", 
		url:"http://iservice.itshsxt.com/restaurant/find",
		dataType:"jsonp", // 允许跨域请求   (服务器也需要设置允许请求跨域)
		success:function(result){
			console.log(result);
		}
	});
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值