2019-11-30
在做英雄管理器这个案例的时候,一定要先写好需求分析:
一、写出要实现什么功能,需要做什么交互(也就是要做什么事件)
例如这个案例里面 在首页页面要实现: 1、当页面一加载后就查询了所有的数据 2、点击删除按钮事件
在添加数据的页面要实现: 3.文件的预览(固定格式) 4.点击新增按钮文件的提交上传(固定格式)跳转
在编辑数据页面要实现:5.点击编辑按钮编辑页面上显示对应的英雄数据信息 6.文件的预览 7.点击保存按钮文件的提交上传 保存跳转
二、实现这个交互事件后,具体要怎么一步步实现
1.1 ajax发送请求,获得服务器返回回来的数据(JS对象)
1.2 将返回之后的数据 通过模板引擎渲染到页面上
2.1 为这个删除按钮注册点击事件,这里会遇到一个问题(注意点),我们所点的这个删除按钮是通过ajax请求的回来动态添加,所以我们要用 事件的委托:给这个点击的按钮的父级元素 注册点击事件,委托者为这个按钮($(‘点击按钮的父亲元素’).on('click',‘点击的按钮’,function(){})
2.2 获取这个所点击按钮对应的id: 这里也会遇到一个问题(注意点):ajax返回回来的数据里有对应的英雄的id名,我们要获取这个id的话,就要通过自定义属性data-id来存储这个id,把这个自定义类名写在模板引擎的英雄列表对应的编辑按钮里,让他的值 为{{ v.id }} 获取了ajax返回回来的id ,然后点击哪一个编辑按钮就能通过attr获取当前的id $(this).attr(‘data-id’) 这里要提醒一下:css操作的是css样式属性 ,attr操作的是html属性 和 自定义属性
2.3 ajax发送删除请求,发送id给服务器,服务器返回相应的数据 当状态码为204时 删除成功,刷新页面
if (backData.code == 204) {
alert('删除成功');
//刷新
window.location.reload();
}
文件预览: 3.1 给file表单注册 onchange事件 (只要用户选择了文件就会执行)
$('#heroIcon').change(function () {
//1.2 获取用户选择的图片
var file = this.files[0];
//1.3 将文件转为src路径
var url = URL.createObjectURL(file);
//1.4 将url路径赋值给img标签的src
$('.preview').attr('src', url);
});
文件提交上传: 4. ***文件上传一定要使用formData处理文件
$('.btn-add').on('click',function(e){
//禁用表单默认提交事件
e.preventDefault();
console.log('点击新增按钮');
//创建FormData对象:参数是表单dom对象($('form')[0]通常下标取第一个元素的)
var fd = new FormData($('form')[0])
$.ajax({
url:'http://127.0.0.1:4399/hero/add',
type:'post',
dataType:'json',
data:fd,
contentType: false,
processData: false,
success: function(backData){
console.log(backData);
if(backData.code==201)
alert('新增成功');
window.location.href = './index.html';
}
});
});
<button onclick="location.href='./edit.html?id={{ v.id}}'" class="btn btn-primary">编辑</button>
var id = window.location.href.split('=')[1];
5.2 ajax发送请求英雄详情 根据id获取点击的英雄信息
$.ajax({
url:'http://127.0.0.1:4399/hero/id',
type:'get',
dataType:'json',
data:{id:id},
success: function(backData){
console.log(backData);
//数据返回之后 渲染页面
$('#heroName').val(backData.data.name);
$('#skillName').val(backData.data.skill);
$('.preview').attr('src',backData.data.icon);// 添加图片预览
// $('#heroId').val(id);// input隐藏域 获取id
}
});
5.3 文件预览 格式跟过程3类似
//1.给file表单元素注册onchange事件
$('#heroIcon').change(function () {
//1.2 获取用户选择的图片
var file = this.files[0];
//1.3 将文件转为src路径
var url = URL.createObjectURL(file);
//1.4 将url路径赋值给img标签的src
$('.preview').attr('src', url);
});
5.4 文件提交上传
$('.btn-save').on('click',function(e){
//禁用表单默认提交事件
e.preventDefault();
//创建FormData对象:参数是表单dom对象 jq对象转成dom对象 通常取第一个元素的下标
var fd = new FormData($('form')[0]);
// 如果不传id的话会 出现400的错误 传参错误
// 通过 append 主动添加 id
fd.append('id',id);
$.ajax({
url:'http://127.0.0.1:4399/hero/update',
type:'post',
dataType:'json',
data:fd,
contentType: false,
processData: false,
success: function(backData){
console.log(backData);
if (backData.code==202) {
alert('修改成功,已保存');
window.location.href = './index.html';
}
}
});
});
这里我们会 遇到一个问题 (注意点): 服务器会提示有一个参数没有传,这样类似问题的解决方法: 分析原因: FormData只能获取表单元素,不能获取id值,所以解决问题方案从两方面入手:(1)要么手动主动添加一个参数, 使用append的主动给fd(FormData对象)添加 (这个最常用) fd.append('id',id); (2)要么就在表单中添加一个input隐藏域
<!-- 隐藏input : 用户看不见,但是formdata可以获取到 -->
<input type="hidden" id="heroId" name="id" /> //写在html表单中 $('heroId').val(id); //放在ajax请求英雄详情中渲染页面中 见5.2
<!-- 遮罩层 HTML结构 --> <div class="cover" style="display: none"> <img class="loading" src="./img/loading01.gif" alt="" /> </div>
// ajax数据返回之后 使用服务器返回的gif 替换 cover默认的gif $('.cover>img').attr('src',backData.data.skillGif);
// 点击遮罩栏 ,遮罩栏消失(淡出) $('.cover').click(function () { $(this).fadeOut(function () { // 将图片在修改成loading图片(gif) 这个要放在遮罩栏做完淡出的动画之后执行 // 所以放在fadeOut 的回调函数中 $('.cover>img').attr('src','./img/loading01.gif'); }); })
Leoragelovexer
浙公网安备 33010602011771号