2019-11-30css
在作英雄管理器這個案例的時候,必定要先寫好需求分析:html
1、寫出要實現什麼功能,須要作什麼交互(也就是要作什麼事件)ajax
例如這個案例裏面 在首頁頁面要實現: 一、當頁面一加載後就查詢了全部的數據 二、點擊刪除按鈕事件 json
在添加數據的頁面要實現: 3.文件的預覽(固定格式) 4.點擊新增按鈕文件的提交上傳(固定格式)跳轉服務器
在編輯數據頁面要實現:5.點擊編輯按鈕編輯頁面上顯示對應的英雄數據信息 6.文件的預覽 7.點擊保存按鈕文件的提交上傳 保存跳轉session
2、實現這個交互事件後,具體要怎麼一步步實現 app
1.1 ajax發送請求,得到服務器返回回來的數據(JS對象)dom
1.2 將返回以後的數據 經過模板引擎渲染到頁面上post
2.1 爲這個刪除按鈕註冊點擊事件,這裏會遇到一個問題(注意點),咱們所點的這個刪除按鈕是經過ajax請求的回來動態添加,因此咱們要用 事件的委託:給這個點擊的按鈕的父級元素 註冊點擊事件,委託者爲這個按鈕($(‘點擊按鈕的父親元素’).on('click',‘點擊的按鈕’,function(){})this
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