Ajax编程

目录

1.Ajax 基础

1.1传统网站中存在的问题

1.2Ajax 概述

 1.3 Ajax 的应用场景

1.4 Ajax 的运行环境

2.Ajax 运行原理及实现

   2.1Ajax 运行原理

2.2Ajax 的实现步骤

2.2.1 创建 Ajax 对象

2.2.2告诉 Ajax 请求地址以及请求方式

2.2.3 发送请求

2.2.4获取服务器端给与客户端的响应数据

2.3 服务器端响应的数据格式

2.4请求参数传递

2.4.1传统网站表单提交

2.4.2 GET 请求方式

2.4.3 POST 请求方式

2.5 请求报文

2.6 请求参数的格式

2.7 获取服务器端的响应

2.7.1 获取服务器端的响应

2.7.2 onreadystatechange 事件

2.8 Ajax 错误处理

2.9 低版本 IE 浏览器的缓存问题

3. Ajax 异步编程

3.1同步异步概述

3.2Ajax 封装

4.模板引擎

4.1 模板引擎概述

4.2 使用步骤

5.案例

5.1 验证邮箱地址唯一性

5.2 搜索框内容自动提示

5.3 省市区三级联动

6.FormData

6.1FormData 对象的作用

6.2 FormData 对象的使用

6.3 FormData 对象的实例方法

6.4 FormData 二进制文件上传

6.5 FormData 文件上传进度展示

6.6 FormData 文件上传图片即时预览

7.同源政策

7.1 Ajax请求限制

7.2 什么是同源

7.3 同源政策的目的

7.4 使用 JSONP 解决同源限制问题

7.5 JSONP 代码优化

7.6 CORS 跨域资源共享

7.7 访问非同源数据 服务器端解决方案

7.8 cookie复习

7.9 withCredentials属性


1.Ajax 基础

1.1传统网站中存在的问题

  • l网速慢的情况下,页面加载时间长,用户只能等待
  • l 表单提交后,如果一项内容不合格,需要重新填写所有表单内容
  • l 页面跳转,重新加载页面,造成资源浪费,增加用户等待时间

1.2Ajax 概述

Ajax:标准读音 eɪˌdʒæks] ,中文音译:阿贾克斯

它是浏览器提供的一套方法,可以实现页面无刷新更新数据,提高用户浏览网站应用的体验

 1.3 Ajax 的应用场景

1. 页面上拉加载更多数据
2. 列表数据无刷新分页
3. 表单项离开焦点数据验证
4. 搜索框提示文字下拉列表

1.4 Ajax 的运行环境

技术需要运行在网站环境中才能生效,当前课程会使用Node创建的服务器作为网站服务器

2.Ajax 运行原理及实现

   2.1Ajax 运行原理

Ajax 相当于浏览器发送请求与接收响应的代理人,以实现在不影响用户浏览页面的情况下,局部更新页面数据,从而提高用户体验。

2.2Ajax 实现步骤

2.2.1 创建 Ajax 对象

 

var xhr = new XMLHttpRequest();

2.2.2告诉 Ajax 请求地址以及请求方式

xhr.open('get', 'http://www.example.com');

 

2.2.3 发送请求

xhr.send();

2.2.4获取服务器端给与客户端的响应数据

xhr.onload = function () {
     console.log(xhr.responseText);
 }

2.3 服务器端响应的数据格式

在真实的项目中,服务器端大多数情况下会以 JSON 对象作为响应数据的格式。当客户端拿到响应数据时,要将 JSON 数据和 HTML 字符串进行拼接,然后将拼接的结果展示在页面中。

http 请求与响应的过程中,无论是请求参数还是响应内容,如果是对象类型,最终都会被转换为对象字符串进行传输。

JSON.parse() // 将 json 字符串转换为json对象

2.4请求参数传递

2.4.1传统网站表单提交

<form method="get" action="http://www.example.com">
     <input type="text" name="username"/>
     <input type="password" name="password">
 </form>
 <!– http://www.example.com?username=zhangsan&password=123456 -->

2.4.2 GET 请求方式

xhr.open('get', 'http://www.example.com?name=zhangsan&age=20');

2.4.3 POST 请求方式

xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded') xhr.send('name=zhangsan&age=20');

2.5 请求报文

HTTP 请求和响应的过程中传递的数据块就叫报文,包括要传送的数据和一些附加信息,这些数据和信息要遵守规定好的格式。

2.6 请求参数的格式

1.   application/x-www-form-urlencoded

name=zhangsan&age=20&sex=男

2.   application/json

{name: 'zhangsan', age: '20', sex: '男'}

在请求头中指定 Content-Type 属性的值是 application/json,告诉服务器端当前请求参数的格式是 json
 

JSON.stringify() // 将json对象转换为json字符串

注意:get 请求是不能提交 json 对象数据格式的,传统网站的表单提交也是不支持 json 对象数据格式的。

2.7 获取服务器端的响应

2.7.1 获取服务器端的响应

在创建ajax对象,配置ajax对象,发送请求,以及接收完服务器端响应数据,这个过程中的每一个步骤都会对应一个数值,这个数值就是ajax状态码。

0:请求未初始化(还没有调用open())

1:请求已经建立,但是还没有发送(还没有调用send())

2:请求已经发送

3:请求正在处理中,通常响应中已经有部分数据可以用了

4:响应已经完成,可以获取并使用服务器的响应了

xhr.readyState // 获取Ajax状态码

2.7.2 onreadystatechange 事件

Ajax 状态码发生变化时将自动触发该事件。

在事件处理函数中可以获取 Ajax 状态码并对其进行判断,当状态码为 4 时就可以通过 xhr.responseText 获取服务器端的响应数据了。

 // 当Ajax状态码发生变化时
 xhr.onreadystatechange = function () {
     // 判断当Ajax状态码为4时
     if (xhr.readyState == 4) {
         // 获取服务器端的响应数据
         console.log(xhr.responseText);
     }
 }

两种获取服务器端响应方式的区别

2.8 Ajax 错误处理

1.   网络畅通,服务器端能接收到请求,服务器端返回的结果不是预期结果。

可以判断服务器端返回的状态码,分别进行处理。xhr.status 获取http状态码

2.   网络畅通,服务器端没有接收到请求,返回404状态码。

检查请求地址是否错误。

3.   网络畅通,服务器端能接收到请求,服务器端返回500状态码。

服务器端错误,找后端程序员进行沟通。

4.   网络中断,请求无法发送到服务器端。

会触发xhr对象下面的onerror事件,在onerror事件处理函数中对错误进行处理。

2.9 低版本 IE 浏览器的缓存问题

问题:在低版本的 IE 浏览器中,Ajax 请求有严重的缓存问题,即在请求地址不发生变化的情况下,只有第一次请求会真正发送到服务器端,后续的请求都会从浏览器的缓存中获取结果。即使服务器端的数据更新了,客户端依然拿到的是缓存中的旧数据。

解决方案:在请求地址的后面加请求参数,保证每一次请求中的请求参数的值不相同。

 xhr.open('get', 'http://www.example.com?t=' + Math.random());

3. Ajax 异步编程

3.1同步异步概述

同步

  • l 一个人同一时间只能做一件事情,只有一件事情做完,才能做另外一件事情。
  • l 落实到代码中,就是上一行代码执行完成后,才能执行下一行代码,即代码逐行执行。
 console.log('before'); 
 console.log('after');

异步

  • l一个人一件事情做了一半,转而去做其他事情,当其他事情做完以后,再回过头来继续做之前未完成的事情。
  • l落实到代码上,就是异步代码虽然需要花费时间去执行,但程序不会等待异步代码执行完成后再继续执行后续代码,而是直接执行后续代码,当后续代码执行完成后再回头看异步代码是否返回结果,如果已有返回结果,再调用事先准备好的回调函数处理异步代码执行的结果。
 console.log('before');
 setTimeout(
    () => { console.log('last');
 }, 2000);
 console.log('after');

3.2Ajax 封装

问题:发送一次请求代码过多,发送多次请求代码冗余且重复。

解决方案:将请求代码封装到函数中,发请求时调用函数即可。

 ajax({ 
     type: 'get',
     url: 'http://www.example.com',
     success: function (data) { 
         console.log(data);
     }
 })

4.模板引擎

4.1 模板引擎概述

作用:使用模板引擎提供的模板语法,可以将数据和 HTML 拼接起来。

官方地址: https://aui.github.io/art-template/zh-cn/index.html

4.2 使用步骤

1.   下载 art-template 模板引擎库文件并在 HTML 页面中引入库文件

 <script src="./js/template-web.js"></script>

2.   准备 art-template 模板

 <script id="tpl" type="text/html">
     <div class="box"></div>
 </script>

3.   告诉模板引擎将哪一个模板和哪个数据进行拼接

 var html = template('tpl', {username: 'zhangsan', age: '20'});

4.   将拼接好的html字符串添加到页面中

 document.getElementById('container').innerHTML = html;

5.   通过模板语法告诉模板引擎,数据和html字符串要如何拼接

 <script id="tpl" type="text/html">
     <div class="box"> {{ username }} </div>
 </script>

5.案例

5.1 验证邮箱地址唯一性

1. 获取文本框并为其添加离开焦点事件
2. 离开焦点时,检测用户输入的邮箱地址是否符合规则
3. 如果不符合规则,阻止程序向下执行并给出提示信息
4. 向服务器端发送请求,检测邮箱地址是否被别人注册
5. 根据服务器端返回值决定客户端显示何种提示信息

 

/^[A-Za-z\d]+([-_.][A-Za-z\d]+)*@([A-Za-z\d]+[-.])+[A-Za-z\d]{2,4}$/

5.2 搜索框内容自动提示

1. 获取搜索框并为其添加用户输入事件
2. 获取用户输入的关键字
3. 向服务器端发送请求并携带关键字作为请求参数
4. 将响应数据显示在搜索框底部

5.3 省市区三级联动

1. 通过接口获取省份信息
2. 使用 JavaScript 获取到省市区下拉框元素
3. 将服务器端返回的省份信息显示在下拉框中
4. 为下拉框元素添加表单值改变事件( onchange
5. 当用户选择省份时,根据省份 id 获取城市信息
6. 当用户选择城市时,根据城市 id 获取县城信息
 

6.FormData

6.1FormData 对象的作用

1. 模拟 HTML 表单,相当于将 HTML 表单映射成表单对象,自动将表单对象中的数据拼接成请求参数的格式。
 
2. 异步上传二进制文件
 

6.2 FormData 对象的使用

1.   准备 HTML 表单
 
 <form id="form">
     <input type="text" name="username" />
     <input type="password" name="password" />
     <input type="button"/>
</form>

 

2.   HTML 表单转化为 formData 对象
 
var form = document.getElementById('form'); 
var formData = new FormData(form);

3.   提交表单对象

 
  xhr.send(formData);

注意:

1. Formdata 对象不能用于 get 请求,因为对象需要被传递到 send 方法中,而 get 请求方式的请求参数只能放在请求地址的后面。
2. 服务器端 bodyParser 模块不能解析 formData 对象表单数据,我们需要使用 formidable 模块进行解析
 

6.3 FormData 对象实例方法

1.   获取表单对象中属性的值
 formData.get('key');

2.   设置表单对象中属性的值

 formData.set('key', 'value');

3.   删除表单对象中属性的值

 formData.delete('key');

4.   向表单对象中追加属性值

 formData.append('key', 'value');

注意:set 方法与 append 方法的区别是,在属性名已存在的情况下,set 会覆盖已有键名的值,append会保留两个值。

6.4 FormData 二进制文件上传

<input type="file" id="file"/>
 var file = document.getElementById('file')
// 当用户选择文件的时候
 file.onchange = function () {
     // 创建空表单对象
     var formData = new FormData();
     // 将用户选择的二进制文件追加到表单对象中
     formData.append('attrName', this.files[0]);
     // 配置ajax对象,请求方式必须为post
     xhr.open('post', 'www.example.com');
     xhr.send(formData);
 }

6.5 FormData 文件上传进度展示

 // 当用户选择文件的时候
 file.onchange = function () {
     // 文件上传过程中持续触发onprogress事件
     xhr.upload.onprogress = function (ev) {
         // 当前上传文件大小/文件总大小 再将结果转换为百分数
         // 将结果赋值给进度条的宽度属性 
         bar.style.width = (ev.loaded / ev.total) * 100 + '%';
     }
 }

6.6 FormData 文件上传图片即时预览

在我们将图片上传到服务器端以后,服务器端通常都会将图片地址做为响应数据传递到客户端,客户端可以从响应数据中获取图片地址,然后将图片再显示在页面中。
 
 xhr.onload = function () {
     var result = JSON.parse(xhr.responseText);
     var img = document.createElement('img');
     img.src = result.src;
     img.onload = function () {
         document.body.appendChild(this);
     }
 }

7.同源政策

7.1 Ajax请求限制

Ajax 只能向自己的服务器发送请求。比如现在有一个 A 网站、有一个 B 网站, A 网站中的 HTML 文件只能向 A 网站服务器中发送 Ajax 请求, B 网站中的 HTML 文件只能向 B 网站中发送 Ajax 请求,但是 A 网站是不能向 B 网站发送 Ajax 请求的,同理, B 网站也不能向 A 网站发送 Ajax 请求。

7.2 什么是同源

如果两个页面拥有相同的协议、域名和端口,那么这两个页面就属于同一个源,其中只要有一个不相同,就是不同源。

http://www.example.com/dir/page.html

http://www.example.com/dir2/other.html:同源

http://example.com/dir/other.html:不同源(域名不同)

http://v2.www.example.com/dir/other.html:不同源(域名不同)

http://www.example.com:81/dir/other.html:不同源(端口不同)

https://www.example.com/dir/page.html:不同源(协议不同)

7.3 同源政策的目的

同源政策是为了保证用户信息的安全,防止恶意的网站窃取数据。最初的同源政策是指 A 网站在客户端设置的 Cookie B 网站是不能访问的。
随着互联网的发展,同源政策也越来越严格,在不同源的情况下,其中有一项规定就是无法向非同源地址发送 Ajax 请求,如果请求,浏览器就会报错。
 

7.4 使用 JSONP 解决同源限制问题

jsonp json with padding 的缩写,它不属于 Ajax 请求,但它可以模拟 Ajax 请求。
 
1.   将不同源的服务器端请求地址写在 script 标签的 src 属性中
 
 <script src="www.example.com"></script>
 <script src=“https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script>

2.   服务器端响应数据必须是一个函数的调用,真正要发送给客户端的数据需要作为函数调用的参数。

 const data = 'fn({name: "张三", age: "20"})';
 res.send(data);

3.   在客户端全局作用域下定义函数 fn

 function fn (data) { }

4.   fn 函数内部对服务器端返回的数据进行处理

 function fn (data) { console.log(data); }

7.5 JSONP 代码优化

1. 客户端需要将函数名称传递到服务器端。
2. script 请求的发送变成动态请求。
3. 封装 jsonp 函数,方便请求发送。
4. 服务器端代码优化之 res.jsonp 方法。
 

7.6 CORS 域资源共享

CORS :全称为 Cross-origin resource sharing ,即跨域资源共享,它允许浏览器向跨域服务器发送 Ajax 请求,克服了 Ajax 只能同源使用的限制。
 
 
 origin: http://localhost:3000
 Access-Control-Allow-Origin: 'http://localhost:3000'
 Access-Control-Allow-Origin: '*'

Node 服务器端设置响应头示例代码:

 app.use((req, res, next) => {
     res.header('Access-Control-Allow-Origin', '*');
     res.header('Access-Control-Allow-Methods', 'GET, POST');
     next();
 })

7.7 访问非同源数据 服务器端解决方案

同源政策是浏览器给予Ajax技术的限制,服务器端是不存在同源政策限制。

 

7.8 cookie复习

7.9 withCredentials属性

在使用Ajax技术发送跨域请求时,默认情况下不会在请求中携带cookie信息。

withCredentials指定在涉及到跨域请求时,是否携带cookie信息,默认值为false

Access-Control-Allow-Credentialstrue 允许客户端发送请求时携带cookie

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值