原生js实现Ajax的使用和封装函数

ajax定义

Ajax 即“Asynchronous Javascript And XML”(异步 JavaScript 和 XML),是指一种创建交互式网页应用的网页开发技术。(用来向后台数据库请求获取数据的技术)
 
传统的网页(不使用 Ajax)如果需要更新内容,必须重载整个网页页面。通过在后台与服务器进行少量数据交换,Ajax 可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。
	Ajax除了解决局部更新渲染页面的问题,解决了前后端分离的问题
	为什么要前后端分离
	用户的计算机中无法存储大量的数据,因此就需要将数据存储在后台数据库中,前端页面中需要使用数据的时候,就向后台数据库发送请求 获取数据 进而渲染数据显示页面

ajax数据交互过程

创建对象  var ajax = new XMLHTTPRequest()
建立前后端连接  ajax.open(‘请求方式’,’url地址’,是否异步)
发送请求  ajax.send();
监听通信状态码改变  ajax.onreadystatechange = function(){
	
}
	通信状态码  用来记录数据交互状态
		0:ajax对象还没有创建出来
		1:ajax对象调用了open建立了前后端之间的连接
		2:ajax对象调用了send 发送了请求
		3:后台服务器解析请求,分析请求中需要的数据
		4:后台服务器将数据响应给前端结束(货送到门口了)
	如果通信状态码为4 证明响应完成  我们就可以在前段获取响应数据了
	
	监测响应状态码
	响应状态码是 用来记录数据交互过程中是否出问题的标识
		200 请求响应成功,数据来源于后台数据库
		304:请求响应成功,数据来源于本地缓存
		403:请求响应失败,没有权限访问
		404:请求响应失败,访问地址找不到
		500及以上:后端服务器问题

Ajax书写

//=====示例========书写规范===========
/打电话  发请求
//1.装电话  js中有一个内置对象 专门用来处理ajax数据交互 XMLHttpRequest
//装电话的过程 其实就是创建 这个对象
var ajax = new XMLHttpRequest();//电话
//2.连电话线  建立前端和后台之间的连接
//建立连接的方法 是 ajax对象的一个方法 open  需要三个参数 method:请求方法(get post)  url地址   async是否异步(true表示异步(默认) false表示同步)
ajax.open('get','./data.txt',true);
 
//3.打电话  发送请求
//发送请求的方法 是ajax对象的一个方法 send  
ajax.send();//请求发送成功
 
//当电话打通之后 服务器会自动的解析请求中需要的数据  并发货,
//前端接下来需要监听物流 如果货已经送到门口了  就要开始卸货上货了
//4.监测物流 在ajax对象中有一个事件  onreadystatechange可以监测数据响应到什么程度
//on readystate(通信状态码) change(改变) 
//在数据交互的过程中 每当通信状态码改变的时候 就会触发这个事件
//通信状态码  0 1 2 3 4
ajax.onreadystatechange = function(){
	//判断  如果当前通信状态码为4 我就获取数据
	//ajax对象的 readyState属性就是通信状态码
	if(ajax.readyState==4){
		//监测在路上有没有翻车(或电话有没有打通)  监测请求和响应过程中是否出问题
		//我们通过响应状态码 监测这个状态  响应状态码成功的只有200和304
		//ajax对象可以通过是status属性获取到响应状态码
		if(ajax.status==200 || ajax.status==304){
			//响应成功 获取响应数据  响应数据就是ajax对象的responseText
			console.log(ajax.responseText);//卸货
		}
	}
}

Ajax的请求方式-get

提交数据:将要提交的数据写在url 地址后面
格式: url?属性名1=属性值&属性名2=属性值&属性名3=属性......
可以在浏览器的控制台 中network选项中查看
安全性不好:因为用户提交的数据都会显示在地址栏中,因此get不适用于登录注册页面
提交数据的量很小 大概只有4kb左右
优点:传输数据的速度比较快
//===示例=============
//提交form表单数据
//提交数据  get方法 我们将数据写在url地址后面进行提交
//url?键名1=键值&键名2=键值&键名3=键值。。。。。
var ajax = new XMLHttpRequest();//电话
 
ajax.open('get','./data.txt?name=gd&age=18&sex=boy',true);
 
ajax.send();//请求发送成功
 
ajax.onreadystatechange = function(){
	//判断  如果当前通信状态码为4 我就获取数据
	//ajax对象的 readyState属性就是通信状态码
	if(ajax.readyState==4){
		if(ajax.status==200 || ajax.status==304){
			//响应成功 获取响应数据  响应数据就是ajax对象的responseText
			console.log(ajax.responseText);//卸货
		}
	}
}
 

Ajax的请求方式-post

Post 方式发送请求需要设置请求头
	Ajax对象.setRequestHeader('Content-type','application/x-www-form-urlencoded');
提交数据
将要提交的数据作为 send 方法的参数传入
ajax对象.send('键名1=键值&键名2=键值&键名3=键值..');
post请求提交的数据不会显示在地址栏中因此安全性更好,一般用来提交表单数据
提交的数据大小大概有20Mb
//========示例=================
//提交form表单数据
var ajax = new XMLHttpRequest();//电话
 
ajax.open('post','./data.txt',true);
//post请求需要在open之后 send之前 设置请求头 请求报文(将请求发送的数据打包)
//请求报文中包含三部分内容 请求命令行 请求头 请求主体
//设置请求头的方法: ajax对象的一个方法 setRequestHeader
ajax.setRequestHeader('Content-type','application/x-www-form-urlencoded');
 
ajax.send('name=gd&age=18&sex=boy');//请求发送成功
 
ajax.onreadystatechange = function(){
	//判断  如果当前通信状态码为4 我就获取数据
	//ajax对象的 readyState属性就是通信状态码
	if(ajax.readyState==4){
		if(ajax.status==200 || ajax.status==304){
			//响应成功 获取响应数据  响应数据就是ajax对象的responseText
			console.log(ajax.responseText);//卸货
		}
	}
}

Ajax操作数组数据方法

使用eval方法即可
eval的用法: eval(字符串)
eval的作用:可以将字符串中的js代码执行 如果是js数据就直接返回出来
//=====示例==============
[1,2,3,4,5,6]
 
ajax('./data1.txt','post','',function(res){
	console.log(res,typeof res);
	//如何将字符串转换为数组  eval
	//res == '[1,2,3,4,5]'  eval('[1,2,3,4,5,6]')
	//
	var res1 = eval(res);
	console.log(res1);    //执行成数组
})

Ajax操作json数据方法

JSON.parse(json数据)
这样可以将json数据转换为js数据
//==========示例==================
{
    "name":"张老三",
    "age":"18"
}
 
ajax('./data.json','post','',function(res){
	console.log(res,typeof res);
	//json数据使用 JSON.parse(json数据) 将json数据转换为js的对象和数组
	console.log(JSON.parse(res));
})

奉送个小礼物--->ajax函数封装

//1.写入主题代码
//2.提出不确定的数据作为参数
//3.将参数代入函数中
//4.调用测试
var ajax = function (url,method,data,fn) {//请求方式和提交数据的方式不确定  url地址 提交的数据
	var xhr = new XMLHttpRequest(); //电话
	//判断 如果是get请求 就需要在url地址后面写入提交的数据 如果是post请求 则不用
	if(method == 'get'){
		xhr.open(method, url+'?'+data, true);
		xhr.send(); //请求发送成功
	}else if(method == 'post'){
		xhr.open(method, url, true);
		//如果是post 还需要设置请求头
		xhr.setRequestHeader('Content-type','application/x-www-form-urlencoded');
		xhr.send(data); //请求发送成功
	}
	//获取响应数据
	xhr.onreadystatechange = function () {
		//判断  如果当前通信状态码为4 我就获取数据
		//ajax对象的 readyState属性就是通信状态码
		if (xhr.readyState == 4 && (xhr.status == 200 || xhr.status == 304)) {
				//响应成功 获取响应数据  响应数据就是ajax对象的responseText
				//让外界能拿到响应数据   使用回调函数来实现
				//如果响应数据成功  就调动传入的回调函数fn
				fn(xhr.responseText);
		}
	}
}
 
//=============调用================
ajax('data.txt','get','',function(res){
       //形参res 就会接收到 响应的数据
       console.log(res);
})

奉送个小礼物--->ajax函数封装2

function ajax(options){
	// 1.处理默认参数
	var {type,url,success,error,data,timeout} = options;
	type = type || "get";
	data = data || {};
	timeout = timeout || 2000;

	// 2.解析要发送的数据
	var str = "";
	for(var i in data){
		str += `${i}=${data[i]}&`;
	}

	// 3.根据方式,决定是否处理url
	if(type == "get"){
		var d = new Date();
		url = url + "?" + str + "__qft=" + d.getTime();
	}

	// 4.开启ajax
	var xhr = new XMLHttpRequest();
	// 注意:open中的方式
	xhr.open(type,url,true);
	xhr.onreadystatechange = function(){
		if(xhr.readyState == 4 && xhr.status == 200){
			// 5.执行成功之前,先判断是否传入
			success && success(xhr.responseText);
			// 成功之后,不应有失败
			error = null;
		}else if(xhr.readyState == 4 && xhr.status != 200){
			// 6.执行失败之前,先判断是否传入
			error && error(xhr.status);
			// 失败之后,不应有成功
			success = null;
			// 且失败不应多次执行
			error = null;
		}
	}

	// 7.如果请求超时,执行失败
	setTimeout(() => {
		error && error("timeout");
		// 失败之后,不应有成功
		success = null;
	}, timeout);

	// 8.最后根据type的方式,决定send的发送内容和格式
	if(type == "post"){
		xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded");
		xhr.send(str)
	}else{
		xhr.send()
	}
}

//==========调用============
document.onclick = function(){
	ajax({
		// type:"get",                 //发送方式,可选,默认get
		url:"http://localhost/ajax/data/data.php",   //要请求的地址,必选
		success:function(res){         //请求成功之后的函数,必选
			console.log(res)
		},
		// data:{                      //要发送的数据,可选,默认不发
		//     user:"admin",
		//     pass:13123121123
		// },
		// error:function(res){         //请求失败之后的函数,可选,默认不处理
		//     console.log(res)
		// },
		// timeout:10                  //请求超时的时间,可选,默认2000
	})
}

 

posted @ 2023-08-14 11:28  JackieDYH  阅读(290)  评论(0编辑  收藏  举报  来源