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.mzph.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…

Ajax — 新闻列表

注意&#xff1a;本项目主要利用到了template&#xff0c;模板引擎进行编写 模板引擎代码下载地址 <div id"news-list"><!-- 这里放数据 --></div>.news-item {display: flex;border: 1px solid #eee;width: 700px;padding: 10px;margin-bottom: …

Ajax — 第四天

数据交换格式 XML 写法&#xff1a; 一个文档有且只有一个根标签标签必须闭合属性值必须加引号 如果说服务器返回的数据是xml格式的 前端需要把服务器返回的xml当做document对象来处理目前无法演示&#xff0c;自己写接口的时候&#xff0c;我们可以测试一下。 JSON 写法…

数据库系统原理(第三章数据库设计 )

一、数据库设计概述 数据库的生命周期 数据库设计的目标&#xff1a; 满足应用功能需求&#xff08;存、取、删、改&#xff09;&#xff0c;良好的数 据库性能&#xff08;数据的高效率存取和空间的节省 共享性、完整性、一致性、安全保密性&#xff09;数据库设计的内容 数据…

Ajax — 第五天

Ajax-05 xhr&#xff08;level-2&#xff09;新特性 responseType属性和response属性 responseType: 表示预期服务器返回的数据的类型 “” &#xff0c;默认空text&#xff0c;和空一样&#xff0c;表示服务器返回的数据是字符串格式json&#xff0c;表示服务器返回的是js…

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…

数据库系统原理(第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…

数据库系统原理(第6章:数据库安全与保护)

一、数据库完整性 数据库完整性是指数据库中数据的正确性和相容性。 完整性约束条件的作用对象 列级约束&#xff1a; 包括对列的类型、取值范围、精度等的约束元组约束&#xff1a; 指元组中各个字段之间的相互约束表级约束&#xff1a; 指若干元组、关系之间的联系的约束定义…

.net core WebApi 使用Swagger生成API文档

关于 Swagger Swagger能成为最受欢迎的REST APIs文档生成工具之一&#xff0c;有以下几个原因&#xff1a; Swagger 可以生成一个具有互动性的API控制台&#xff0c;开发者可以用来快速学习和尝试API。Swagger 可以生成客户端SDK代码用于各种不同的平台上的实现。Swagger 文件可…

Git — 初体验

准备工作 版本管理软件 作用 记录代码的版本实现多人协作 分类 集中式&#xff0c;典型代表 SVN分布式&#xff0c;典型代表 Git 注册远程仓库账号 远程仓库相当于中央服务器我们需要在github上或码云上注册一个账号&#xff0c;用于创建远程仓库使用注册的时候&#xff0…

iOS CoreTelephony框架介绍与使用案列

昨晚看一篇文章时看到了私有API这个词&#xff0c;貌似开发者对私有API的使用很反感于是果断百度谷歌&#xff0c;以下是Stackoverflow中关于Private Frameworks的一个解释&#xff1a; Private frameworks are frameworks which you are not allowed to use. They are not exp…

JS数组的迭代器方法

迭代器forEachevery一、迭代器方法 迭代器方法&#xff0c; 这些方法对数组中的每一个元素应用一个函数&#xff0c;可以返回一个值&#xff0c;一组值或一个新数组。 不生成新数组的迭代器方法 1.forEach() forEach()输出 forEach输出结果2.every() 该方法按接受一个返回值为布…

Git 笔记

三个区域 下面三个区域&#xff0c;是Git虚拟的区域&#xff0c;看不到&#xff0c;摸不着。 工作区 工作区&#xff0c;指的是使用Git管理后的文件&#xff0c;这些文件显示在磁盘上&#xff0c;供我们使用或修改的区域。所以&#xff0c;粗略的说&#xff0c;项目文件夹就是…