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状态 |
statusText | HTTP状态的说明 |
(1)readystate 数据响应的变化
值 | 状态 | 说明 |
---|---|---|
0 | 未初始化 | 尚未调用open()方法 |
1 | 启动 | 已经调用open()方法,但尚未调用send()方法 |
2 | 发送 | 已经调用send()方法,但尚未接受响应 |
3 | 接受 | 已经接受到部分响应数据 |
4 ★ | 完成 | 已经接受到全部响应数据,而且可以使用 |
0=未初始化
1=已经调用open方法,但未调用send方法
2=调用send方法,但未开始响应
3=响应部分响应
4=完全响应数据,且可以使用
(2)status 响应状态码
HTTP状态码 | 状态字符串 | 说明 |
---|---|---|
200 ★ | OK | 服务器成功返回了页面 |
400 | Bad Request | 语法错误导致服务器不识别 |
401 | Unauthorized | 请求需要用户认证 |
404 ★ | Not found | 指定的URL在服务器上找不到 |
500 ★ | Internal Server Error | 服务器遇到意外错误,无法完成请求 |
503 | ServiceUnavailable | 服务器过载或维护导致无法完成请求 |
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>
<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>
<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
如果是,判断是否响应成功 status200
如果是,则获取响应数据 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);
}
});