Ajax-模板引擎、案例(邮箱唯一性、搜索框内容自动提示、三级联动)、FormData(FormData使用、实例方法、二进制文件上传)

模板引擎的使用

作用:使用模板引擎提供的模板语法,可以将数据和 HTML 拼接起来。

使用步骤

<body>
<div id="container">123</div>
</body>
<!-- 1、将模板引擎的库文件引入到当前页面 -->
<script src="/js/template-web.js"></script>

<!-- 2、准备art-template模板、并且进行模板拼接 -->
<script type="text/html" id="tp1">
<h1>{{username}}{{age}}</h1>
</script>

<script type="text/javascript">
//3、匹配模板与数据拼接
var html = template('tp1', { username: 'xiaoli', age: 18 });

//4、把拼接好的html字符串传给获取的元素
document.querySelector('#container').innerHTML = html;
console.log(html);

</script>
   

案例

  • 验证邮箱地址唯一性
<script>
	<div class="container">
		<div class="form-group">
			<label>邮箱地址</label>
			<input type="email" class="form-control" placeholder="请输入邮箱地址" id="email">
		</div>
		<!-- 错误 bg-danger 正确 bg-success -->
		<p id="info"></p>
	</div>
	<script src="/js/ajax.js"></script>
   //1、获取文本框并为其添加离开焦点事件
		//获取元素
		var emailInp=document.querySelector('#email');
		var info=document.querySelector('#info');
    //2、离开焦点时,检测用户输入的邮箱地址是否符合规则
		  //提交文本框离开焦点事件onblur
		  emailInp.onblur=function(){
			  //获取用户输入的邮箱地址
			var email=this.value;
			//邮箱正则验证
			var reg = /^[A-Za-z\d]+([-_.][A-Za-z\d]+)*@([A-Za-z\d]+[-.])+[A-Za-z\d]{2,4}$/;
			  
	 //3、如果不符合规则,阻止程序向下执行并给出提示信息
			//如果输入的邮箱地址符合规则
			if(!reg.test(email)){
				info.innerHTML='请输入符合规则的邮箱';
				//改为提示信息的样式
				info.className='bg-danger'
				  //阻止程序向下执行
				  return; 
                    
			}
	//4、向服务器端发送请求,检测邮箱地址是否被别人注册		
	//5、根据服务器端返回值决定客户端显示何种提示信息
			//向服务器端发送请求
			ajax({
				type:'get',
				url:'http://localhost:3000/verifyEmailAdress',
				data:{
					email:email
				},
				//符合规则
				success:function(result){
					console.log(result);
					info.innerHTML=result.message;
					info.className='bg-success';
					
				},
				//通过状态码判断不符合规则进入到错误
				error:function(result){
					console.log(result);
					//错误信息
					info.innerHTML=result.message;
					info.className='bg-danger';
				}
			});
		}

	</script>
  • 搜索框内容自动提示
<body>
	<div class="container">
		<div class="form-group">
			<input type="text" class="form-control" placeholder="请输入搜索关键字" id="search">
			<ul class="list-group" id="list-box">

			</ul>
		</div>
	</div>
	<script src="/js/template-web.js"></script>
	<script src="/js/ajax.js"></script>
	<script type="text/html" id="tpl">
		{{each result}}
			<li class="list-group-item">{{$value}}</li>
		{{/each}}
	</script>
	<script>
		//获取元素 
		var searchInp = document.querySelector('#search');
		//获取提示文字的存放位置
		var listBox = document.querySelector('#list-box');
		//存储定时器的变量
		var timer = null;
		<!--1、获取搜索框并为其添加用户输入事件-->
		//用户输入事件(文本框的值改变时触发)
		searchInp.oninput = function () {
			//获取表单值停止发送请求
			clearTimeout(timer);
			//获取用户输入的内容
			  <!--2、获取用户输入的关键字-->
			var key = this.value;
			
			if(key.trim().length==0){
				//内容为空阻止程序向下执行
				listBox.style.display='none';
				return;
			}
			//先服务器端发送请求
			//需要服务器返回与用户输入内容相关的值
			<!--5、为了避免请求发送过于频繁需要添加定时器-->
		      timer = setTimeout(function () {
		      <!--3、向服务器端发送请求并携带关键字作为请求参数-->
				ajax({
					type: 'get',
					url: 'http://localhost:3000/searchAutoPrompt',
					data: {
						key: key
					},
					<!--4、将响应数据显示在搜索框底部-->
					success: function (result) {
						//使用模板引擎拼接字符串
						var html = template('tpl', { result: result });
						//将拼接好的字符串形式在页面中
						listBox.innerHTML = html;
						//显示ul容器
						listBox.style.display = 'block';
					}
				})
			}, 800)

		}
	</script>
</body>
  • 省市区三级联动
     //模板、其他一样
	<script type="type/text" id="provincetpl">
	  <!-- 省份模板 -->
	<option value="">请选择省份</option>
	{{each province}}
	<option value="{{$value.id}}">{{$value.name}}</option>
	{{/each}}
	
	</script>
		<script>
		<!-- 2、获取元素-->
		var province = document.querySelector("#province");
		//城市
		var city = document.querySelector("#city");
		//县城
		var area = document.querySelector("#area");

		//请求信息
		<!--1、通过接口获取省份信息-->
		ajax({
			type: 'get',
			url: 'http://localhost:3000/province',
			success: function (data) {
			<!--3、将服务器端返回的省份信息显示在下拉框中-->
				//console.log(data);
				//拼接模板
				var html = template('provincetpl', { province: data })
				//渲染页面
				province.innerHTML = html;
			}
		})
		<!--4、省份的下拉框添加值改变的事件-->
		province.onchange = function () {
		<!--5、当用户选择省份时,根据省份id获取城市信息-->
			//获取省份id
			var pid = this.value;
			//清空县城下拉框的数据
			var html = template('areatpl', { area: [] })
			//渲染页面
			area.innerHTML = html;

			ajax({
				type: 'get',
				url: 'http://localhost:3000/cities',
				data: {
					id: pid
				},
				success: function (data) {
					console.log(data);
					//拼接模板
					var html = template('citytpl', { city: data })
					//渲染页面
					city.innerHTML = html;
				}
			})
		}
        <!--6、当用户选择城市时,根据城市id获取县城信息-->
		//城市的下拉框添加值改变的事件
		city.onchange = function () {
			//获取省份id
			var cid = this.value;

			ajax({
				type: 'get',
				url: 'http://localhost:3000/areas',
				data: {
					id: cid
				},
				success: function (data) {
					console.log(data);
					//拼接模板
					var html = template('areatpl', { area: data })
					//渲染页面
					area.innerHTML = html;
				}
			})
		}

	</script>

FormData(表单对象)

FormData() 对象的作用

  1. 模拟HTML表单,相当于将HTML表单映射成表单对象,自动将表单对象中的数据拼接成请求参数的格式。
  2. 异步上传二进制文件
FormData() 对象的使用
	<!-- 1、创建普通的html表单 -->
	<form id="form">
		<input type="text" name="username">
		<input type="password" name="password">
		<input type="button" id="btn" value="提交">
	</form>
<script type="text/javascript">
		//获取元素
		var btn = document.querySelector('#btn');
		//获取表单
		var from =document.querySelector('#form');
		//点击事件
		btn.onclick=function(){
			<!--2、将普通表单转化为表单对象 不需要表单提交地址 不需要提交按钮 一定要有name属性-->
			var  formData=new FormData(form);

			//创建ajax对象
			var xhr=new XMLHttpRequest();
			//进行配置
			xhr.open('post','http://localhost:3000/formData');
			<!--3、提交表单对象-->
			//发送请求
			xhr.send(formData);
			//监听请求成功后的响应事件
			xhr.onload=function(){
				if(xhr.status==200){
					//打印服务器响应的值
					console.log(xhr.responseText);
					
				}
			}
		}

	</script>

//服务端路由
//创建路由
app.post('/formData',(req,res)=>{
	//创建formidable表单解析对象
	const form=new formidable.IncomingForm();
	//解析客户端传递过来的fromData对象
	  form.parse(req,(err,fields,files)=>{
		  res.send(fields);
	  })
})  

注意

  1. Formdata 对象不能用于 get 请求,因为对象需要被传递到 send 方法中,而 get 请求方式的请求参数只能放在请求地址的后面。
  2. 服务器端 bodyParser 模块不能解析 formData 对象表单数据,我们需要使用formidable模块进行解析。

FormData 对象的实例方法

1. 获取表单对象中属性的值
        formData.get('key');
2. 设置表单对象中属性的值
       formData.set('key', 'value');
3. 删除表单对象中属性的值
       formData.delete('key');
4. 向表单对象中追加属性值
       formData.append('key', 'value');
   注意:set 方法与 append 方法的区别是,
   在属性名已存在的情况下,set 会覆盖已有键名的值,append会保留两个值。

FormData 二进制文件上传

	<script type="text/javascript">
		//获取文件选择控件
		var file = document.querySelector('#file');
		//获取进度条元素
		var bar = document.querySelector('#bar');
		//获取图片的容器
		var box = document.querySelector('#box');
		//为文件选择控件添加onchanges事件
		//在用户选择文件时触发
	    //二进制文件上传
		file.onchange = function () {
			//创建空的fromData表单对象
			var formData = new FormData();
			//将用户选择的文件追加到formData表单对象中 
			formData.append('attrName', this.files[0]);
			//创建ajax对象
			var xhr = new XMLHttpRequest();
			//对ajax对象进行配置
			xhr.open('post', 'http://localhost:3000/upload');

			//在文件上传的过程中持续触发事件
			//文件上传进度
			xhr.upload.onprogress = function (ev) {
				//监听
				//console.log(ev);
				//ev.loaded 当前文件上传了多少
				//ev.total 文件上传的总大小
				var result = (ev.loaded / ev.total).toFixed(2) * 100 + '%';
				//设置进度条的宽度
				bar.style.width = result;
				//将百分比显示在进度条中
				bar.innerHTML = result;


			}
			//发送ajax请求
			xhr.send(formData);
			//监听服务器端响应给客户端的数据
			//在我们将图片上传到服务器端以后,服务器端通常都会将图片地址做为响应数据传递到客户端,
			//客户端可以从响应数据中获取图片地址,然后将图片再显示在页面中。
			//图片即时预览
			xhr.onload = function () {
				//如果状态码200
				if (xhr.status == 200) {
					//打印服务端响应数据
					//console.log(xhr.responseText);
					//传递的字符串类型转化为对象类型
					var result = JSON.parse(xhr.responseText);
					console.log(result);
					
					//创建图片元素
					var img = document.createElement('img');
					//给图片标签设置src属性
					img.src = result.path;
					//图片加载完响应
					img.onload=function(){
						//将图片显示在页面中
						box.appendChild(img);
					}
				}
			}
		}




    //服务端路由
    // 实现文件上传的路由
app.post('/upload', (req, res) => {
	//创建formidable表单解析对象
	const form=new formidable.IncomingForm();
	//设置客户端上传文件的存储路径
	form.uploadDir=path.join(__dirname,'public','uploads');
	//配置文件的后缀
	form.keepExtensions=true;
	//解析客户端传递过来的fromData对象
	form.parse(req,(err,fields,files)=>{
		//响应客户端传递过来的文件对象的文件地址
		res.send({
			path:files.attrName.path.split('public')[1]
		})
	  })
}); 
	</script>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章