ajax发送异步请求
一、什么是ajax
也就是说ajax和我们在浏览器地址栏,或者通过form表单发送请求一样,ajax也可以发送请求,但是二者有很大的不同,ajax不用刷新界面,发送异步请求。
二、发送ajax get请求的步骤
var xhr =new XMLHttpRequest();
② 设置URL
xhr.open('get',"index.php",true);
// 参数1:发送请求方式
// 参数2:请求的url地址
// 参数3: 请求是同步还是异步。true为异步,默认为true
③ 发送请求
xhr.send();
xhr.onreadystatechange = function () {
// onreadystatechange 可以监听如下状态:
//0:请求未初始化 1:服务器连接已经建立 2:请求已接收 3:请求处理中 4:请求已完成,且响应已就绪
//判断当前状态是否已经响应完毕,处理响应
if(xhr.readyState ==4){
// 排除访问可能出现的问题,通过服务器返回的状态码来排除,304代表访问缓存
if (xhr.status >=200 && xhr.status <300 ||xhr.status==304){
console.log("请求成功!");
}
else {
console.log("请求失败!");
}
}
}
三、处理ie 发送ajax的兼容问题
处理方式:
//处理兼容问题
var xhr;
if(window.XMLHttpRequest){
xhr =new XMLHttpRequest();
}
else {
xhr = new ActiveXObject('Microsoft.XMLHTTP');
}
四、封装ajax的 get请求 (初级)
/*传参的格式 封装 将传入的对象,转为url 拼接的方式*/
function json2Str(data) {
//定义数组
var arr = [];
//遍历传入的对象
for (var key in data){
//将json转为数组
arr.push(key+'='+data[key]);
console.log(arr);
}
//将数组转为固定格式的字符串
return arr.join('&'); //取出数组中的每一项,然后用&符号连接
}
function ajaxGet(url,data,success,error) {
//封装get请求
var xhr;
if (XMLHttpRequest){
xhr = new XMLHttpRequest();
}
else {
xhr = new ActiveXObject("Microsoft.XMLHTTP");
}
xhr.open("get",url+'?'+data,true);
xhr.send();
xhr.onreadystatechange = function () {
if (xhr.readyState ==4){
if (xhr.status >=200 && xhr.status <300 ||xhr.status ==304){
success(xhr.response);
}
else {
error(xhr.status);
}
}
}
}
ajaxGet('01-get.php',json2Str(data),function (res) {
console.log(res);
},function (code) {
console.log("请求失败" + code);
})
五、封装ajax的 get请求 (进阶)
① 在ie浏览器下,如果发送一个相同url请求,它会通过本地缓存获取数据,即只有一个结果,不能获取到最新的数据
② 在ie中只能出现英文、数字、字母、下划线、ASIIC码,不能出现中文,韩文....它不会自动的进行编码,所有需要手动的编码
处理方案,对传入的参数进一步的进行处理
① 给传入的url添加一个随机因子,也可以通过加入时间戳的方式,这样不会出现相同的url请求
② 对传入的参数可能出现中文的地方进行 encodeURL编码
function json2Str(data) {
//添加一个随机因子, 处理方式也可以是添加时间戳
data.r = Math.random();
//定义数组
var arr = [];
//遍历传入的对象
for (var key in data){
//将json转为数组
arr.push(key+'='+encodeURI(data[key]));
console.log(arr);
}
//将数组转为固定格式的字符串
return arr.join('&'); //取出数组中的每一项,然后用&符号连接
}
六、封装ajax的 post请求的步骤
//1 创建异步请求对象
var xhr;
if(XMLHttpRequest){
xhr = new XMLHttpRequest();
}
else {
xhr = new ActiveXObject("Microsoft.XMLHTTP");
}
//2 设置url
xhr.open('post','post.php',true);
// 设置请求头,请求头的位置要放在open 和 send之间
xhr.setRequestHeader("Content-type",'application/x-www-form-urlencoded');
//3 发送请求
xhr.send("name=zhang&age=12");
//4 监听响应 -->处理响应数据
xhr.onreadystatechange = function () {
if (xhr.readyState ==4){
if (xhr.status >=200 && xhr.status <300 || xhr.status==304){
console.log(xhr.responseText);
}
else {
console.log(xhr.status);
}
}
}
② 设置请求头,请求头在open 和 send之间,这个位置是固定的 xhr.setRequestHeader("Content-type",'application/x-www-form-urlencoded');
七、封装ajax的 ajax请求(包括post 和 get)
//封装的ajax请求方法
function ajax(type,url,data,timeout,success,error) {
var xhr;
if(XMLHttpRequest){
xhr = new XMLHttpRequest();
}
else {
xhr = new ActiveXObject("Microsoft.XMLHTTP");
}
//处理参数
var str =json2Str(data);
//2 设置url
if (type =='get'){
xhr.open(type,url+'?'+str);
xhr.send();
}
else {
xhr.open('post',url,true);
// 设置请求头,请求头的位置要放在open 和 send之间
xhr.setRequestHeader("Content-type",'application/x-www-form-urlencoded');
//3 发送请求
xhr.send(str);
}
//4 监听响应 –>处理响应数据
xhr.onreadystatechange = function () {
if (xhr.readyState ==4){
clearTimeout(timer);
if (xhr.status >=200 && xhr.status <300 || xhr.status==304){
success(xhr.responseText);
}
else {
error(xhr.status);
}
}
}
//超时处理
if(timeout){
var timer = setTimeout(function () {
alert("请求超时");
xhr.abort();//中断请求
},timeout)
}
}
// 参入数据包装
function json2Str(data) {
//添加一个随机因子, 处理方式也可以是添加时间戳
data.r = Math.random();
//定义数组
var arr = [];
//遍历传入的对象
for (var key in data){
//将json转为数组
arr.push(key+'='+encodeURI(data[key]));
console.log(arr);
}
//将数组转为固定格式的字符串
return arr.join('&'); //取出数组中的每一项,然后用&符号连接
}
var data = {
"name":'zhang',
"age":21
}
//发送一个 ajax请求
ajax('post','01-get.php',data,2000,function (res) {
console.log(res);
},function (e) {
console.log(e);
})
八、封装ajax的 ajax请求(终极)
function json2str(json) {
// 0.给json添加随机因子
json.t = Math.random();
// 1.将json转换为数组
var arr = [];
for(var key in json){
arr.push(key+"="+encodeURIComponent(json[key]));
}
// 2.将数组转换为字符串返回
return arr.join("&");
}
function ajax(options) {
// 1.判断有没有传递option
options = options || {};
// 2.判断有没有url
if(!options.url){ //没传入url
return ;
}
// 3.设置默认值
options.type = options.type || "get";
options.timeout = options.timeout || 0;
options.data = options.data || {};
// 4.将参数转换为固定格式字符串
var str = json2str(options.data);
// 1.创建异步对象
if(window.XMLHttpRequest){
var xhr = new XMLHttpRequest()
}else{
var xhr = new ActiveXObject("Microsoft.XMLHTTP");
}
if(options.type == "get"){
// 2.设置URL
xhr.open(options.type, options.url+"?"+str, true);
// 3.发送请求
xhr.send();
}else{
// 2.设置URL
xhr.open(options.type, options.url, true);
// 设置请求头
xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
// 3.发送请求
xhr.send(str);
}
// 4.注册事件
xhr.onreadystatechange = function () {
// 5.处理返回数据
// 判断请求状态
if(xhr.readyState == 4){
clearTimeout(timer);
// 判断HTTP状态
if(xhr.status >= 200 && xhr.status < 300 || xhr.status == 304){
options.success(xhr.responseText);
}else{
options.error(xhr.status);
}
}
}
// 6.超时处理
if(options.timeout){
var timer = setTimeout(function () {
xhr.abort(); // 中断请求
}, options.timeout);
}
}
//调用 ajax发送请求
ajax({
"type":"post",
"url":'01-get.php',
"data":{
"name":"zhangsan",
"age":21
},
"timeout":0,
"success":function (res) {
console.log(res);
},
"error":function (e) {
console.log(e);
}
});