Ajax — 第三天

Ajax-03

模板引擎原理

正則回顧

  • 區分正則方法和字符串方法
    • 正則方法
      • test()
      • exec()
    • 字符串方法
      • match()
      • replace()
      • split()
      • search()

正則方法由正則表達式調用;字符串方法由字符串調用;

  • exec方法

    • 功能:使用正則表達式匹配字符串,返回值中包含匹配的結果
    • 特點:
      • 一次只能匹配一個結果
      • 再次調用將匹配下一個結果
      • 沒有更多匹配則返回null
      • 如果正則表達式中有捕獲(小括號),則返回值中包括捕獲的結果
  • replace方法

    • 功能:字符串替換
    • 特點:
      • 可以使用正則表達式進行匹配搜索
      • 可以使用函數完成高級的替換
<script>/*// 正則對象的方法正則表達式.test(字符串);正則表達式.exec(字符串);// 字符串方法字符串.match();字符串.replace();字符串.split();字符串.search();*/// let str = 'this is a ES6 that is a H5';// let reg = /xxxx/g;// -------------------------------------- test -------------------------------------// 正則表達式.test(字符串); -- 檢查字符串是否和正則表達式匹配。返回值是true或者false// let str = 'this is a ES6 that is a H5';// let reg = /[a-z]/g;// console.log(reg.test(str)); // 檢查字符串中是否包含小寫字母,true// -------------------------------------- exec -------------------------------------// 正則表達式.exec(字符串); // -- 完成正則匹配,并且把匹配的結果取出來。如果不匹配,則返回null// -- 特點是一次只匹配一個結果。如果想匹配下一個結果,則需要再次調用exec方法// let str = '2345 1122 5678 8990';// let reg = /\d\d\d\d/g;  //  /\d{4}/g;//  /[0-9]{4}/g;// console.log(reg.exec(str)); // ["2345", index: 0, ....]// console.log(reg.exec(str)); // ["1122", index: 5, ....]// console.log(reg.exec(str)); // ["5678", index: 10, ....]// console.log(reg.exec(str)); // ["8990", index: 15, ....]// console.log(reg.exec(str)); // null// -------------------------------------- 分組捕獲 -------------------------------------// 分組也叫做捕獲。正則表達式中的小括號表示捕獲// let str = '1313 1122 4949 8899 7789';// // let reg = /(\d)\1\d\d/g;  // 希望第1個數字和第2個數字相同// // let reg = /(\d)\1(\d)\2/g; // 希望第1個數字和第2個數字相同。并且第3個數字和第4個數字相同// let reg = /(\d)(\d)\1\2/g; // 希望第1個數字和第3個數字相同。并且第2個數字和第4個數字相同// console.log(str.match(reg));// -------------------------------------- exec+分組 -------------------------------------// let str = '1234 2344 6767 8899';// let reg = /\d\d(\d)\d/g;// console.log(reg.exec(str)); // ['1234', '3' ....]  // 數組的第一個元素是匹配的結果。第二個元素是分組的結果// console.log(reg.exec(str)); // ['2344', '4' ....]// console.log(reg.exec(str)); // ['6767', '6' ....]// console.log(reg.exec(str)); // ['8899', '9' ....]// console.log(reg.exec(str)); // null// -------------------------------------- replace -------------------------------------let str = 'ES6 and H5';let reg = /\d/g;// 把字符串中的數字換成 x // console.log(str.replace(reg, 'x'));/*使用函數來完成復雜的替換如下:函數的形參x,表示每次匹配到的結果函數中return的值,就是替換后的結果*/let result = str.replace(reg, function (x) {return parseInt(x) + 1;});console.log(result);</script>

實現模板引擎

<script type="text/html" id="test"><p>{{title}}</p><p>{{content}}</p>
</script><script>let data = {title: '錦瑟',content: '錦瑟無端五十弦,一弦一柱思華年。'}// 自定義函數,實現模板引擎的功能。體會一下真實的模板引擎的實現原理function template (tplId, data) {// 1. 根據模板的id,找到元素,并獲取元素里面的HTMLlet html = document.getElementById(tplId).innerHTML;// console.log(html);// 2. 替換HTML中的  {{xxx}} 為真實的數據// html = html.replace('{{title}}', data.title);// html = html.replace('{{content}}', data.content);let reg = /{{(\w+)}}/g; // \w 表示大小寫字母、數字、下劃線let result = '';while (result = reg.exec(html)) {html = html.replace(result[0], data[result[1]]);}// 3. 將替換好的結果返回即可return html;}// 使用template函數,完成模板引擎功能let str = template('test', data);console.log(str);
</script>

新聞列表案例

略,參見代碼

原生XHR對象

發送GET方式的請求

// 使用 xhr 對象發送GET方式的請求
/*1. 創建 xhr 對象2. 調用 xhr.open() 函數。設置請求方式和url3. 調用 xhr.send() 函數。發送請求4. 監聽 xhr.onreadystatechange 事件。只要ajax的狀態改變就會觸發> 第4步,可以放到第3步或者第2步之前> ajax的狀態,后續講解*/let xhr = new XMLHttpRequest();
xhr.open('GET', 'http://www.liulongbin.top:3006/api/getbooks');
xhr.send();
xhr.onreadystatechange = function () {// console.log(111);// 這個事件觸發了多次,因為輸出看到,有三次結果// xhr.responseText; // 接收響應結果if (xhr.readyState === 4) {console.log(xhr.responseText);}
};

Ajax的狀態

在這里插入圖片描述

  • 上圖中ajax的狀態,一共有5個,分別用數字 0、1、2、3、4表示。
  • 我們只需要關系最后一個狀態即可,因為此時,我們可以接收到完整的結果
  • 代碼中,我們使用 xhr.readyState 屬性表示ajax的狀態

關于onreadystatechange事件的觸發時機:

  • 很明顯的,ajax的狀態值發生了改變,比如從0變化到1、或者從1變化到2…的時候,會觸發
  • 如果服務器返回大量的數據,瀏覽器是分塊接收數據的,當接收到的數據量發生變化的時候,也會觸發

xhr發送帶參數的GET請求

  • GET方式的請求參數,叫做查詢字符串,英文 querystring
  • 查詢字符串的格式 key=value&key=value....
  • 發送get請求的時候,查詢字符串和接口之間,使用 ? 隔開
xhr.open('GET', 'http://www.liulongbin.top:3006/api/getbooks?id=1&bookname=西游記');

之前,$.ajax里面的請求參數,之所以可以寫對象形式,是因為函數內部,把對象轉成了查詢字符串格式。

xhr發起POST方式的請求

和GET方式的兩個區別:

  • 必須在open和send之間,加一個請求頭
  • 查詢字符串的位置變化為send的參數
// 1. 創建 xhr 對象
let xhr = new XMLHttpRequest();
// 2. 注冊 onreadystatechange 事件
xhr.onreadystatechange = function () {if (this.readyState === 4 && this.status === 200) {let res = JSON.parse(this.responseText);console.log(res);}
}
// 3. 調用open,設置請求方式和url
xhr.open('POST', 'http://www.liulongbin.top:3006/api/addbook');
// 4. POST方式,要設置請求頭 --- 和GET方式不一樣的一處
// 下面一行代碼的意思,告訴服務器,前端提交的數據是什么類型的。表示是查詢字符串類型
xhr.setRequestHeader('Content-Type',  'application/x-www-form-urlencoded');
// 5. 調用send,發送請求
// xhr.send('key=value&key=valuye.......');
xhr.send('bookname=唐詩三百首&author=老湯&publisher=黑馬出版社');

URL編碼

// 編碼
encodeURI('紅&黑');
// "%E7%BA%A2&%E9%BB%91"
encodeURIComponent('紅&黑');
// "%E7%BA%A2%26%E9%BB%91"// 解碼
decodeURI('%E7%BA%A2&%E9%BB%91');
// "紅&黑"
decodeURIComponent("%E7%BA%A2%26%E9%BB%91");
// "紅&黑"

在實際開發中,需要對中文及需要編碼的特殊符號進行編碼:

使用的編碼函數:

  • encodeURI() — 能夠對中文進行編碼
  • encodeURIComponent() — 能夠對中文和特殊符號進行編碼(&=)

封裝

思路:

  • 模擬jQuery中的 $.ajax()

步驟:

  1. 定義空的函數,設置一個形參
  2. 模擬$.ajax() ,調用函數,并傳遞一個對象形式的參數
  3. 函數內部:編寫原生的代碼
  4. 無論是GET方式還是POST方式,我們都需要將服務器返回的結果傳遞給success
  5. 判斷是GET還是POST方式,然后寫對應的 open和send
  6. 將對象形式的請求參數(data),處理成查詢字符串

定義與調用函數

// 模擬 $.ajax() ,自己封裝一個實現ajax請求的函數/*option 是一個對象option.type 表示請求類型option.url  表示請求的urloption.data 表示請求參數option.success()  表示一個處理服務器返回結果的函數*/
function ajax (option) {}// 調用函數
ajax({type: 'post', // GET或POSTurl: 'http://www.liulongbin.top:3006/api/addbook',data: {bookname: 'aaa', author: 'bbb', publisher: 'ccc'},success: function (res) {console.log(res);}
});

寫基本的代碼

function ajax (option) {let xhr = new XMLHttpRequest();xhr.onreadystatechange = function () {}xhr.open();xhr.send();
}

將服務器返回的結果傳遞給success

function ajax (option) {let xhr = new XMLHttpRequest();xhr.onreadystatechange = function () {if (this.readyState === 4 && this.status === 200) {let x = JSON.parse(this.responseText);option.success(x); // 調用success函數,把服務器返回的結果傳遞給它}}xhr.open();xhr.send();
}

針對GET和POST分別寫open和send方法

function ajax (option) {let xhr = new XMLHttpRequest();xhr.onreadystatechange = function () {if (this.readyState === 4 && this.status === 200) {let x = JSON.parse(this.responseText);option.success(x); // 調用success函數,把服務器返回的結果傳遞給它}}// 判斷,GET和POST方式單獨完成if (option.type === 'GET') {xhr.open('GET', option.url);xhr.send();} else if (option.type === 'POST') {xhr.open('POST', option.url);xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');xhr.send();}
}

將對象形式的data處理成querystring

function ajax (option) {let xhr = new XMLHttpRequest();xhr.onreadystatechange = function () {if (this.readyState === 4 && this.status === 200) {let x = JSON.parse(this.responseText);option.success(x); // 調用success函數,把服務器返回的結果傳遞給它}}// 先處理查詢字符串,把傳遞進來的 對象形式的data,處理成查詢字符串格式// {bookname: 'aaa', author: 'bbb', publisher: 'ccc'}// ===> bookname=aaa&author=bbb&publiser=ccclet arr = [];for (let key in option.data) {// key 表示對象的 鍵// option.data[key] 表示對象的值// arr.push('key=value');arr.push(key + '=' + option.data[key]);   // ['bookname=aaa', 'author=bbb', ...]}let querystring = arr.join('&'); // bookname=aaa&author=bbb&publiser=ccc// 判斷,GET和POST方式單獨完成if (option.type === 'GET') {xhr.open('GET', option.url + '?' + querystring);xhr.send();} else if (option.type === 'POST') {xhr.open('POST', option.url);xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');xhr.send(querystring);}
}

優化-請求方式不區分大小寫

function ajax (option) {let xhr = new XMLHttpRequest();xhr.onreadystatechange = function () {if (this.readyState === 4 && this.status === 200) {let x = JSON.parse(this.responseText);option.success(x); // 調用success函數,把服務器返回的結果傳遞給它}}// 先處理查詢字符串,把傳遞進來的 對象形式的data,處理成查詢字符串格式// {bookname: 'aaa', author: 'bbb', publisher: 'ccc'}// ===> bookname=aaa&author=bbb&publiser=ccclet arr = [];for (let key in option.data) {// key 表示對象的 鍵// option.data[key] 表示對象的值// arr.push('key=value');arr.push(key + '=' + option.data[key]);   // ['bookname=aaa', 'author=bbb', ...]}let querystring = arr.join('&'); // bookname=aaa&author=bbb&publiser=ccc// 定義變量,接收并處理請求方式let method = option.type.toUpperCase(); // 把請求方式轉成大寫// 判斷,GET和POST方式單獨完成if (method === 'GET') {xhr.open('GET', option.url + '?' + querystring);xhr.send();} else if (method === 'POST') {xhr.open('POST', option.url);xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');xhr.send(querystring);}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/248063.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/248063.shtml
英文地址,請注明出處:http://en.pswp.cn/news/248063.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

d3.js 共享交換平臺demo

今天在群里遇到一張圖 遂來玩一玩&#xff0c;先來上圖!! 點擊相應按鈕&#xff0c;開關線路&#xff0c;此項目的重點是計算相應圖形的位置&#xff0c;由于是個性化項目就沒有封裝布局。好了直接上代碼。 <!DOCTYPE html> <html lang"en"> <head&g…

Java知識系統回顧整理01基礎05控制流程07結束外部循環

一、break是結束當前循環 二、結束當前循環實例 break; 只能結束當前循環 public class HelloWorld { public static void main(String[] args) { //打印單數 for (int i 0; i < 10; i) { for (int j 0; j < 1…

Swift傻傻分不清楚系列(九)閉包

本頁包含內容&#xff1a; 閉包表達式&#xff08;Closure Expressions&#xff09;尾隨閉包&#xff08;Trailing Closures&#xff09;值捕獲&#xff08;Capturing Values&#xff09;閉包是引用類型&#xff08;Closures Are Reference Types&#xff09;非逃逸閉包(Nones…

Ajax — 新聞列表

注意&#xff1a;本項目主要利用到了template&#xff0c;模板引擎進行編寫 模板引擎代碼下載地址 <div id"news-list"><!-- 這里放數據 --></div>.news-item {display: flex;border: 1px solid #eee;width: 700px;padding: 10px;margin-bottom: …

vim下更省心地用中文

在vim下使用中文是個麻煩。除了寫代碼&#xff0c;很多時候也需要做筆記。以下介紹rime輸入法的一個功能&#xff0c;它可以減少vim下中文輸入帶來的麻煩。在***.custom.yaml下添加代碼&#xff1a; "key_binder/bindings": - { when: always, accept: ReleaseEs…

Python 常見的內置模塊

1. abs() 函數 描述 abs() 函數返回數字的絕對值 #!/usr/bin/pythonprint "abs(-45) : ", abs(-45) print "abs(100.12) : ", abs(100.12) print "abs(119L) : ", abs(119L)以上實例運行后輸出結果為&#xff1a;abs(-45) : 45 abs(100.12) : …

Ajax — 第四天

數據交換格式 XML 寫法&#xff1a; 一個文檔有且只有一個根標簽標簽必須閉合屬性值必須加引號 如果說服務器返回的數據是xml格式的 前端需要把服務器返回的xml當做document對象來處理目前無法演示&#xff0c;自己寫接口的時候&#xff0c;我們可以測試一下。 JSON 寫法…

檢測字符串包含emoji表情

有時候在開發時會遇到不希望字符串中包含emoji表情的情況&#xff0c;Google之后發現了方法&#xff0c;但是似乎iOS9之后的emoji無法過濾&#xff0c;繼續尋找方法&#xff0c;在一個NSString的擴展中發現了辦法 #import <Foundation/Foundation.h>/**Category to searc…

數據庫系統原理(第三章數據庫設計 )

一、數據庫設計概述 數據庫的生命周期 數據庫設計的目標&#xff1a; 滿足應用功能需求&#xff08;存、取、刪、改&#xff09;&#xff0c;良好的數 據庫性能&#xff08;數據的高效率存取和空間的節省 共享性、完整性、一致性、安全保密性&#xff09;數據庫設計的內容 數據…

Ajax — 第五天

Ajax-05 xhr&#xff08;level-2&#xff09;新特性 responseType屬性和response屬性 responseType: 表示預期服務器返回的數據的類型 “” &#xff0c;默認空text&#xff0c;和空一樣&#xff0c;表示服務器返回的數據是字符串格式json&#xff0c;表示服務器返回的是js…

java 根據身份證號碼獲取出生日期、性別、年齡

1.情景展示 如何根據身份證號&#xff0c;計算出出生日期、性別、年齡? 2.解決方案 從網上找的別人的&#xff0c;因為并沒有實際用到&#xff0c;所以并未對其優化&#xff01; /*** 通過身份證號碼獲取出生日期、性別、年齡* param certificateNo* return 返回的出生日期格式…

Swift傻傻分不清楚系列(十)枚舉

本頁內容包含&#xff1a; 枚舉語法&#xff08;Enumeration Syntax&#xff09;使用 Switch 語句匹配枚舉值&#xff08;Matching Enumeration Values with a Switch Statement&#xff09;關聯值&#xff08;Associated Values&#xff09;原始值&#xff08;Raw Values&…

數據庫系統原理(第四章:SQL與關系數據庫基本操作 )

一、SQL概述 sql是結構化查詢語言&#xff08;Structured Query Language&#xff0c;SQL&#xff09;是專門用來與數 據庫通信的語言&#xff0c;它可以幫助用戶操作關系數據庫。 SQL的特點&#xff1a; SQL不是某個特定數據庫供應商專有的語言&#xff1b; SQL簡單易學 &…

selenium操作瀏覽器窗口最大化和刷新

實際測試過程中經常遇到打開一個頁面并不是全屏顯示&#xff0c;但是卻希望它能夠全屏顯示或者新增一條記錄后需要刷新一下看能不能再列表中正常顯示。 于是就有了今天的關于對瀏覽器窗口的最大化和刷新頁面。需要說明的一點&#xff1a;所有和python相關的記錄都是基于3.6版本…

Git安裝步驟+Mac終端配置

Git安裝步驟 其實可以直接略過。因為安裝的時候&#xff0c;一路 next 即可。 注意&#xff0c;安裝路徑中不能出現中文。安裝完成后&#xff0c;不得更改安裝路徑。 檢查Git是否安裝成功 在任何文件夾&#xff0c;空白處&#xff0c;右鍵。如果看到 “Git Bash Here”&#xf…

Swift傻傻分不清楚系列(十一)類和結構體

本頁包含內容&#xff1a; 類和結構體對比結構體和枚舉是值類型類是引用類型類和結構體的選擇字符串(String)、數組(Array)、和字典(Dictionary)類型的賦值與復制行為 類和結構體是人們構建代碼所用的一種通用且靈活的構造體。我們可以使用完全相同的語法規則來為類和結構體定義…

數據庫系統原理(第5章:數據庫編程)

一、存儲過程 概念&#xff1a;存儲過程是一組為了完成某項特定功能的SQL語句集&#xff0c; 其實質就是一段存儲在數據庫中的代碼。 它可以由聲明式的sql語句和過程式sql語句組成。 特點&#xff1a; 可增強SQL語言的功能和靈活性良好的封裝性高性能可減少網絡流量可作為一種安…

科學-中醫:儒醫

ylbtech-科學-中醫&#xff1a;儒醫"儒醫"是一種歷史悠久的社會文化現象。闡釋了"儒醫"的三重境界,即良醫、大醫、圣醫。"良醫"注重技,屬于知識論,追求的是"真";"大醫"注重德,屬于道德論,追求的是"善";"圣醫…

Ajax — 第六天

Ajax-06 GET和POST的區別 字面意思不同 GET 是獲取意思。想從服務器獲取數據&#xff0c;用GET方式的請求POST是郵遞、郵寄意思。如果提交數據到服務器&#xff0c;用POST方式 請求參數位置不同 GET 請求參數會和url拼接到一起&#xff0c;形如 api/getbooks?id2&age3PO…

iOS Tips 模擬器屏幕截圖

當我們發布app到AppStore的時候&#xff0c;在itunes connect里面&#xff0c;蘋果官方要求我們提供各種尺寸的屏幕截圖。由于受到硬件條件的限制&#xff0c;我們不可能在每個真實的物理機器上測試并截圖&#xff0c;相反如果我們能直接在模擬器上進行屏幕截圖的話&#xff0c…