ajax学习笔记(二 关于模板引擎和简单ajxa简单封装)

今天学习了ajax里面一个有用的知识点那就是模板引擎,这个在nodejs里面也常用,可以使用模板引擎提供的模板语法,将数据与HTML方便的拼接起来,以及简单的ajax函数封闭,一般我们在使用中,都会给一个接口文档,是封装好的包。
模板引擎
第一步 下载模板引擎
模板引擎官方地址
下载后是一个js文件。

第二步 引入入js文件
在这里插入图片描述
第三步 准备art-template 模板
在这里插入图片描述
这里是一个script标签 我们把type类型设为text/html 方便我们在里面输入HTML标签。记住给这个模板一个id名,后面要用到。

第四步 告诉模板引擎将那个模板和数据进行拼接
在这里插入图片描述
我们使用到了template这个函数方法,是模板引擎给与我们的,里面第一个参数就是我们上一步里面的模板的id名,第二个参数就是我们从服务器获取到的数据。
这个方法有一个返回值,我们用一个变量接收。

第五步 将拼接好的html字符串添加到页面中
在这里插入图片描述
这里我们获取到一个HTML里面的一个id值为container的div元素,将我们上一步获取到的模板引擎返回值添加到div元素中,这也正是我们的目的,将获取到的后台数据以我们想要的类型输入到页面中。

第六步 使用模板语法告诉模板引擎,数据和html字符串要如何拼接
在这里插入图片描述
如果没有这一步,你会发现你插入进去的模板没有如何东西,我们需要把数据显示在页面中前,先插入到模板中,这样才算是完整的步骤,我使用的这个模板引擎在模板中如何使用的语法我并没有说明,
具体给出链接查看学习:语法

例子:

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
	<!-- 1. 将模板引擎的库文件引入到当前页面 -->
	<script src="/js/template-web.js"></script>
</head>
<body>
	<div id="container"></div>
	<!-- 2.准备art-template模板 -->
	<script type="text/html" id="tpl">
		<h1>{{username}} {{age}}</h1>
	</script>
	<script type="text/javascript">
		// 3.告诉模板引擎将那个数据和哪个模板进行拼接
		// 1) 模板id 2)数据 对象类型
		// 方法的返回值就是拼接好的html字符串
		var html = template('tpl', {username: 'zhangsan', age: 30});
		document.getElementById('container').innerHTML = html;
	</script>
</body>
</html>

简单的ajax函数封包
先来一个最简单的:

		//封装函数
		function ajax (active){
			// 1.创建ajax对象
			var xhr = new XMLHttpRequest();
			// 2.告诉Ajax对象要向哪发送请求,以什么方式发送请求
			// 1)请求方式 2)请求地址
			xhr.open(active.type, active.url);
			// 3.发送请求
			xhr.send();
			// 4.获取服务器端响应到客户端的数据
			xhr.onload = function (){
				active.success(xhr.responseText);
			}
		}

这其实就是一次简单的封闭我们要调用也很简单:

		var btn = document.getElementById('btn');
		btn.onclick = function(){
			ajax({
				type:'get',
				url:'http://localhost:3000/first',
				success:function(value){
					alert(value);
				}
			})
		}

我们发现这个太简陋了有很多的问题:

			1.请求参数位置的问题

				将请求参数传递到ajax函数内部, 在函数内部根据请求方式的不同将请求参数放置在不同的位置

				get 放在请求地址的后面

				post 放在send方法中

			2.请求参数格式的问题

				application/x-www-form-urlencoded

					参数名称=参数值&参数名称=参数值

					name=zhangsan&age=20

				application/json

					{name: 'zhangsan', age: 20}

				1.传递对象数据类型对于函数的调用者更加友好
				2.在函数内部对象数据类型转换为字符串数据类型更加方便

	*/

于是我们按照问题开始改进函数:

我们先增加一个date对象,里面是放我们请求参数用params变量接收,还要将这个对象格式转换成name=zhangsan&age=20的格式,然后用到了一个方法循环拼接加裁剪。然后我们进行判断,如果请求方式是get,那么就讲值放在url后面,如果是post就放在send()里面。
进入post请求判断后我们还需要设置很多东西,首先我们要设置请求参数格式类型,但是我们不能把格式写固定,有可能传普通对象类型,还可能是json对象类型,然后我们就在设置了一个header对象。然后获取到类型并赋值给变量contentType。
注意:我们如果是传的json对象进去我们不能直接把对象传入send()中,我们要先把他转换成字符串类型。所以我们又进行了一次判断。
然后我们就进入到onload事件中了,我们不知道请求是否会成功,所以我们要进去判断如果http状态码为200,我们就调用success函数,否则就调用error函数,当然我们需要先添加这个请求失败的函数error。
大多时候服务器端返回给我们的是json对象,当是我们拿到后是json对象字符串,我们需要转换为json对象,我们将这部直接封装在函数里,但是我们要考虑到确认返回的是json数据。
服务器在返回数据时,会在响应头中设置数据的返回类型,我们获取到这个类型,然后进行判断就可以做到是否是json数据
我们使用xhr.getResponseHeader();这个方法就可以获取到响应头中的数据,我们只需要传入 ‘Content-Type’ 就可以了。
在判断中我们使用了字符串里面的 includes()这个方法,他可以判断当前字符串是否包含一字符,包含就返回true。
我们发现如果要调用函数要传递很多的参数,这样太麻烦,我们只需要传递必要的参数就可以了,没有传递的参数我们给一个默认值就可以了。
于是我们在函数里面内置一个对象,里面存储的都是默认的值,这个对象就是开头的 defaults 对象。然后将函数里面的其他值都默认使用这个对象里面的值,而我们只需要将用户传进来的对象来覆盖这个defaults对象就可以了。
这时我们就用到了 Object.assign()方法,他的作业就是对象覆盖,第一个参数是要被覆盖的对象 我们传入defaults对象,第二个参数就是覆盖的对象 也就是 options对象。

到此整体思路大致介绍完毕,下面是具体的代码:

 //调用函数
		ajax({
			type: 'post',
			// 请求地址
			url: 'http://localhost:3000/responseData',
			success: function (data) {
				console.log('这里是success函数');
				console.log(data)
			}
		})



//封装函数
function ajax (options) {
			// 存储的是默认值
			var defaults = {
				type: 'get',
				url: '',
				data: {},
				header: {
					'Content-Type': 'application/x-www-form-urlencoded'
				},
				success: function () {},
				error: function () {}
			};

			// 使用options对象中的属性覆盖defaults对象中的属性
			Object.assign(defaults, options);

			// 创建ajax对象
			var xhr = new XMLHttpRequest();
			// 拼接请求参数的变量
			var params = '';
			// 循环用户传递进来的对象格式参数
			for (var attr in defaults.data) {
				// 将参数转换为字符串格式
				params += attr + '=' + defaults.data[attr] + '&';
			}
			// 将参数最后面的&截取掉 
			// 将截取的结果重新赋值给params变量
			params = params.substr(0, params.length - 1);

			// 判断请求方式
			if (defaults.type == 'get') {
				defaults.url = defaults.url + '?' + params;
			}

			/*
				{
					name: 'zhangsan',
					age: 20
				}

				name=zhangsan&age=20

			 */

			// 配置ajax对象
			xhr.open(defaults.type, defaults.url);
			// 如果请求方式为post
			if (defaults.type == 'post') {
				// 用户希望的向服务器端传递的请求参数的类型
				var contentType = defaults.header['Content-Type']
				// 设置请求参数格式的类型
				xhr.setRequestHeader('Content-Type', contentType);
				// 判断用户希望的请求参数格式的类型
				// 如果类型为json
				if (contentType == 'application/json') {
					// 向服务器端传递json数据格式的参数
					xhr.send(JSON.stringify(defaults.data))
				}else {
					// 向服务器端传递普通类型的请求参数
					xhr.send(params);
				}

			}else {
				// 发送请求
				xhr.send();
			}
			// 监听xhr对象下面的onload事件
			// 当xhr对象接收完响应数据后触发
			xhr.onload = function () {

				// xhr.getResponseHeader()
				// 获取响应头中的数据
				var contentType = xhr.getResponseHeader('Content-Type');
				// 服务器端返回的数据
				var responseText = xhr.responseText;

				// 如果响应类型中包含applicaition/json
				if (contentType.includes('application/json')) {
					// 将json字符串转换为json对象
					responseText = JSON.parse(responseText)
				}

				// 当http状态码等于200的时候
				if (xhr.status == 200) {
					// 请求成功 调用处理成功情况的函数
					defaults.success(responseText, xhr);
				}else {
					// 请求失败 调用处理失败情况的函数
					defaults.error(responseText, xhr);
				}
			}
		}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值