1. 今天繼續ajax的一個學習,首先明確一個觀念,介面,什麼是介面,當使用ajax請求數據時,被請求的url就叫做數據介面也就是介面,註意每個介面必須有請求方式,這裡有一個介面的測試工具,postman自稱是全球最快的,反正使用起來沒多大毛病,使用這個軟體的時候有一個註意點就是在post請求的時候 ...
1.
今天繼續ajax的一個學習,首先明確一個觀念,介面,什麼是介面,當使用ajax請求數據時,被請求的url就叫做數據介面也就是介面,註意每個介面必須有請求方式,這裡有一個介面的測試工具,postman自稱是全球最快的,反正使用起來沒多大毛病,使用這個軟體的時候有一個註意點就是在post請求的時候,在body裡面輸入參數要選擇x-www-form-這個選項才行,然後是介面文檔,我們如果要調用介面,那肯定是要參照介面文檔的,裡面的包含這個介面的所有信息,一般一個介面文檔大致分為以下五個內容:
①介面名稱:能夠一眼看出這個介面是個什麼類型的介面
②url:這個不用多說,介面的調用地址
③調用方式:會給你說明這個介面要用get還是post
④參數格式:介面需傳遞的參數,每個參數必須包含參數名稱、參數類型以及參數說明
⑤響應格式:介面返回值的描述,一般包含數據名稱類型說明
2.
然後繼續看到一個普遍應用,表單,我們說的form表單一般是拿來收集數據的,然後再form裡面有一些屬性比如
action表示向何處發送表單數據,如果未指定就是當前頁面
target是在何處打開這個action,就跟a標簽的一樣
method是發送action的方式可以為get或者post預設是get,get適合用來提交一些簡單數據的,post適合提交複雜數據,我們在項目中用到post居多
enctype是規定發送表單數據前如何對數據進行編碼,一般預設是前面提到的x-www-form-urlencoded,但是這裡要註意下如果說是包含文件上傳的表單的話,這裡的值要改為multipart/form-data
繼續看到表單的同步提交,就是當你一點擊提交,頁面就會發生跳轉到action的地址上去,這樣的用戶體驗極差,而且頁面之前的數據和狀態都會丟失,怎麼來解決這一現象,我們只需要讓表單控制項負責採集數據,ajax來負責提交即可。
如果要用到ajax跟表單的一個配合,首先要知道一個事件也就是submit提交事件,然後在這裡面組織表單預設行為,因為每次一點提交就會刷新頁面,然後通過一個函數可快速獲取到表單的數據,。serialize()使用這個有個前提就是必須為表單裡面每個元素添加name屬性就像面這樣
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> </head> <body> <form action="/login"> <input type="text" name="uname"> <input type="password" name="password"> <input type="submit" value="提交"> </form> <script src="../day01/lib/jquery.js"></script> <script> $('form').on('submit', e => { console.log(11); e.preventDefault() // 這裡鬧了個大烏龍,剛開始我是用的$(this)我就說為什麼一直獲取不到數據思來想去也就是這裡的問題應該,後來才知道我這裡明明用的是 // 箭頭函數啊,箭頭函數的this是誰啊能亂用嗎? var str = $('form').serialize() console.log(str); }) </script> </body> </html>
案例:評論列表,頁面還是才去bootstrap,vscode可安裝bs3實現快速bootstrap編程,這個案例就是通過介面先獲取評論列表的數據,渲染到html上,然後通過介面發表評論
.
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <link rel="stylesheet" href="../day01/lib/bootstrap.css"> <script src="../day01/lib/jquery.js"></script> </head> <body style="padding: 15px;"> <div class="panel panel-primary"> <div class="panel-heading"> <h3 class="panel-title">發表評論</h3> </div> <div class="panel-body"> <form> <div>評論人</div> <input type="text" class="form-control" name="username"> <div>內容</div> <textarea class="form-control" name="content"></textarea> <button type="submit" class="btn btn-primary">發表評論</button> </form> </div> </div> <ul class="list-group"> </ul> <script> // 1.獲取評論列表數據 function getComment() { $.ajax({ type : 'get', url : 'http://www.liulongbin.top:3006/api/cmtlist', success : res => { console.log(res); if (res.status !== 200) { return alert('獲取評論列表失敗') } else { $('.list-group').empty() $.each(res.data, (i, item) => { $('.list-group').append(`<li class="list-group-item"> <span class="badge" style="background-color: #f0ad4e;">評論時間:${item.time}</span> <span class="badge" style="background-color: #5bc0de;">評論人:${item.username}</span> ${item.content} </li>`) }) } } }) } getComment() // 2.發表評論 $('form').on('submit', function(e) { e.preventDefault() var str = $('form').serialize() // console.log(str); $.post('http://www.liulongbin.top:3006/api/addcmt', str,res => { if (res.status !== 201) { return alert('發表評論失敗') } else { getComment() // 2.1 提交成功後應該將表單的內容清空,這裡有個快捷方法,直接將form用她的reset方法,但是要先將jq轉為原生對象 $('form')[0].reset() } }) }) </script> </body> </html>
3.
繼續看到一個概念叫做模板引擎,看過我之前的案例都知道,我們之前渲染ul的時候都是採取的字元串拼接的方式,對res裡面的數據進行遍歷,進行字元串拼接,而反覆的進行字元串拼接產生的影響就不多多說了吧,大量耗費記憶體資源,所以這個時候就產生了一種模板引擎就是程式員根據指定模板結構和數據,自動生成一個完整的html界面。
那麼當下比較優秀的模板引擎之一 art-template使用它有幾個步驟分為安裝、導入、定義數據、定義模板、調用template、渲染html,這裡面還有一些註意事項
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> </head> <body> <div></div> <script src="../day01/lib/jquery.js"></script> <!-- 1.首先第一步肯定是要導入下載的template模板版引擎js --> <script src="./template-web.js"></script> <script type="text/html" id="model"> <!-- // 3.然後第三步定義模板註意也是script來書寫,然後還有一個註意點因為平時寫的script基本上是text/JavaScript意思就是script裡面解析的 // 的是js代碼,但是這裡我們既然是html模板所以就不能憶原來那種方式來預設 --> <!-- 這樣一添加,連註釋都變了 --> <!-- 3.1這裡還有一個註意點,在template模板裡面變數的占位符是兩個花括弧 --> <!-- 3.2這裡裡面的變數寫什麼就寫數據裡面的屬性名即可 --> <span>{{name}}</span> </script> <script> // 2.導入後其實在js當中就存在了一個template的函數,你一輸的話它是有關鍵字出來的 // 第二步需要定義數據 var data = {name : '張三'} // 4.定義完後繼續在這裡調用template函數 // 4.1這個函數有兩個參數,也是為什麼前面要定義兩個東西的原因,第一個參數是模板的id(這個id添加在剛在定義模板的script中,而且並不用寫#),第二個參數是需要渲染的對象 // 4.2調用完後會有一個返回值註意用一個變數去存儲 var strHtml = template('model', data) // 5.都結束後就是最後的渲染到HTML中 console.log(strHtml); $('div').html(strHtml) </script> </body> </html>
關於模板引擎的使用記住上面我說的步驟就行了,在這個定義模板裡面我們用到了一個占位符{{}}這個裡面的寫法是有講究的,我們叫做標準語法
①正常輸出 可以在裡面寫{{value/obj.key/arr[0]/a ? a : b}} 這些簡單複雜數據都是可以寫在裡面的
②原義輸出 就是如果value是一個html結構那麼你要讓他在渲染的時候顯示出來就需要在前面添加一個@ {{@value}}
③條件輸出 {{if 條件}} 執行語句 {{/if}} 當然你可以在中間穿插{{else if 條件}}
④迴圈輸出 {{each 迴圈的變數}} 在這裡面有兩個值可以使用 {{$value}}當前鄉的值 {{$當前項的索引}} {{/each}}
⑤過濾器 就是當你對{{value}}的值不滿意的時候你可以{{value | filterName}} 然後再js代碼裡面template.defaults.imports.filterName = function(value) {}對這個值進行修改,註意return出這個處理結果,這個filtername是可以自定義的
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> </head> <body> <div></div> <script src="../day01/lib/jquery.js"></script> <!-- 1.首先第一步肯定是要導入下載的template模板版引擎js --> <script src="./template-web.js"></script> <script type="text/html" id="model"> <!-- // 3.然後第三步定義模板註意也是script來書寫,然後還有一個註意點因為平時寫的script基本上是text/JavaScript意思就是script裡面解析的 // 的是js代碼,但是這裡我們既然是html模板所以就不能憶原來那種方式來預設 --> <!-- 這樣一添加,連註釋都變了 --> <!-- 3.1這裡還有一個註意點,在template模板裡面變數的占位符是兩個花括弧 --> <!-- 3.2這裡裡面的變數寫什麼就寫數據裡面的屬性名即可 --> <span>{{name}}</span> <div>{{regTime | dateFormat}}</div> </script> <script> template.defaults.imports.dateFormat = function(date) { var y = date.getFullYear() var m = date.getMonth() + 1 var d = date.getDate() return y + '-' + m + '-' + d } // 2.導入後其實在js當中就存在了一個template的函數,你一輸的話它是有關鍵字出來的 // 第二步需要定義數據 var data = {name : '張三',regTime : new Date()} // 4.定義完後繼續在這裡調用template函數 // 4.1這個函數有兩個參數,也是為什麼前面要定義兩個東西的原因,第一個參數是模板的id(這個id添加在剛在定義模板的script中,而且並不用寫#),第二個參數是需要渲染的對象 // 4.2調用完後會有一個返回值註意用一個變數去存儲 var strHtml = template('model', data) // 5.都結束後就是最後的渲染到HTML中 console.log(strHtml); $('div').html(strHtml) </script> </body> </html>
4.
我們繼續看到正則與字元串的操作,其實解釋來看一下模板引擎的一個原理,首先明確一個正則的函數。exec()可以檢索字元串中滿足正則表達式的,有就返回,沒有就返回null。
然後是分組我們將正則裡面用括弧包起來的內容叫做一個分組,可以通過分組來提取想要的內容。
然後看到replace,其實這些包括正則前面都說過的也可以看前面的一個博文,replace就是字元串的替換方法,可以將參數裡面前面一個替換為後面一個。先說到這裡看一個代碼
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> </head> <body> <script> let str = '我是{{name}}' let reg = /{{([a-zA-Z]+)}}/ let regResult = reg.exec(str) console.log(regResult); </script> </body> </html>
多次replace
<!DOCTYPE html>