Ajax

第1章 AJAX编程

1.1 Ajax

即 Asynchronous Javascript And XML,AJAX 不是一门的新的语言,而是对现有持术的综合利用。

  1. 基于web标签的xhtml+css
    2. 可以使用dom进行动态的显示和交互
    3. 使用XML和XSLT(是一种用于将XML文档转换任意文本的描述语言)进行数据的交换和操作
    4. 使用XMLHttpRequest进行异步的数据查询和检索等操作。。。

本质:是在HTTP协议的基础上以异步的方式通过XMLHttpRequest对象与服务器进行通信。

作用:可以在页面不刷新的情况下,请求服务器,局部更新页面的数据;

1.2 异步(Asynchronous [eɪˈsɪŋkrənəs])

指某段程序执行时不会阻塞其它程序执行,其表现形式为程序的执行顺序不依赖程序本身的书写顺序,相反则为同步。

其优势在于不阻塞程序的执行,从而提升整体执行效率。

同步:同一时刻只能做一件事,上一步完成才能开始下一步

异步:同时做多件事,效率更高

XMLHttpRequest可以以异步方式的处理程序。

1.3 XMLHttpRequest

浏览器内建对象,用于在后台与服务器通信(交换数据) ,由此我们便可实现对网页的部分更新,而不是刷新整个页面。

下面是一个简单的例子

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Y74qPNyE-1584674303710)(file:///C:\Users\ADMINI~1\AppData\Local\Temp\msohtmlclip1\01\clip_image004.jpg)]

由于XMLHttpRequest本质基于HTTP协议实现通信,所以结合HTTP协议和上面的例子我们分析得出如下结果:

1.3.1 请求

HTTP请求3个组成部分与XMLHttpRequest方法的对应关系

1、请求行

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bWL7fV7n-1584674303746)(file:///C:\Users\ADMINI~1\AppData\Local\Temp\msohtmlclip1\01\clip_image006.jpg)]

2、请求头

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CVo1kC8d-1584674303749)(file:///C:\Users\ADMINI~1\AppData\Local\Temp\msohtmlclip1\01\clip_image008.jpg)]

**get 请求可以不设置 **

3、请求主体

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LTJZgAAu-1584674303751)(file:///C:\Users\ADMINI~1\AppData\Local\Temp\msohtmlclip1\01\clip_image010.jpg)]

注意书写顺序

1.3.2 响应

HTTP响应是由服务端发出的,作为客户端更应关心的是响应的结果。

HTTP响应3个组成部分与XMLHttpRequest方法或属性的对应关系。

由于服务器做出响应需要时间(比如网速慢等原因),所以我们需要监听服务器响应的状态,然后才能进行处理。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6pC1gptj-1584674303754)(file:///C:\Users\ADMINI~1\AppData\Local\Temp\msohtmlclip1\01\clip_image012.jpg)]

**onreadystatechange 是 Javascript 的事件的一种,其意义在于监听 XMLHttpRequest 的状态 **

1、获取状态行(包括状态码&状态信息)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Q1wygsLF-1584674303759)(file:///C:\Users\ADMINI~1\AppData\Local\Temp\msohtmlclip1\01\clip_image014.jpg)]

2、获取响应头

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gzxPhirH-1584674303761)(file:///C:\Users\ADMINI~1\AppData\Local\Temp\msohtmlclip1\01\clip_image016.jpg)]

3、响应主体

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sGlHtIVK-1584674303763)(file:///C:\Users\ADMINI~1\AppData\Local\Temp\msohtmlclip1\01\clip_image018.jpg)]

我们需要检测并判断响应头的MIME类型后确定使用request.responseText或者request.responseXML

1.3.3 API 详解

xhr.open() 发起请求,可以是get、post方式

xhr.setRequestHeader() 设置请求头

xhr.send() 发送请求主体get方式使用xhr.send(null)

xhr.onreadystatechange = function () {} 监听响应状态

readstate 属性有五个状态:

  • xhr.readyState = 0时,(未初始化)还没有调用send()方法
  • xhr.readyState = 1时,(载入)已调用send()方法,正在发送请求
  • xhr.readyState = 2时,(载入完成)send()方法执行完成,已经接收到全部响应内容
  • xhr.readyState = 3时,(交互)正在解析响应内容
  • xhr.readyState = 4时,(完成)响应内容解析完成,可以在客户端调用了

不用记忆状态,只需要了解有状态变化这个概念

xhr.status表示响应码,如200

xhr.statusText表示响应信息,如OK

xhr.getAllResponseHeaders() 获取全部响应头信息

xhr.getResponseHeader(‘key’) 获取指定头信息

xhr.responseText、xhr.responseXML都表示响应主体

注GET和POST请求方式的差异(面试题)

1、GET没有请求主体,使用xhr.send(null)

2、GET可以通过在请求URL上添加请求参数

3、POST可以通过xhr.send(‘name=itcast&age=10’)

4、POST需要设置

Content-type:application/x-www-form-urlencoded

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TE8LCTft-1584674303766)(file:///C:\Users\ADMINI~1\AppData\Local\Temp\msohtmlclip1\01\clip_image020.jpg)]

5、GET大小限制约4K,POST则没有限制

问题?如何获取复杂数据呢?

1.4 XML extensible markup language

XML是一种标记语言,很类似HTML,其宗旨是用来传输数据,具有自我描述性(固定的格式的数据)。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BcY6nTTR-1584674303768)(file:///C:\Users\ADMINI~1\AppData\Local\Temp\msohtmlclip1\01\clip_image022.jpg)]

1.4.1 语法规则

1、必须有一个根元素

2、标签名称不可有空格、不可以数字或.开头、大小写敏感

3、不可交叉嵌套

4、属性双引号(浏览器自动修正成双引号了)

5、特殊符号要使用实体

6、注释和HTML一样

虽然可以描述和传输复杂数据,但是其解析过于复杂并且体积较大,所以实现开发已经很少使用了。

1.5 JSON

即 JavaScript Object Notation,另一种轻量级的文本数据交换格式,独立于语言。

1.5.1 语法规则

1、数据在名称/值对中

2、数据由逗号分隔(最后一个健/值对不能带逗号)

3、花括号保存对象方括号保存数组

4、使用双引号

1.5.2 JSON解析

JSON数据在不同语言进行传输时,类型为字符串,不同的语言各自也都对应有解析方法,需要解析完成后才能读取

1、Javascript 解析方法

JSON对象 JSON.parse()、 JSON.stringify();

2、PHP解析方法

json_encode()、json_decode()

总结:JSON体积小、解析方便且高效,在实际开发成为首选。

1.6 封装AJAX工具函数

为了提升我们的开发效率,我们自已将XMLHttpRequest封装成一个函数。

1.7 jQuery中的Ajax

jQuery为我们提供了更强大的Ajax封装

$.ajax({}) 可配置方式发起Ajax请求

$.get() 以GET方式发起Ajax请求

$.post() 以POST方式发起Ajax请求

$(‘form’).serialize()序列化表单(即格式化key=val&key=val)

url 接口地址

type 请求方式

timeout 请求超时

dataType 服务器返回格式

data 发送请求数据

beforeSend:function () {} 请求发起前调用

success 成功响应后调用

error 错误响应时调用

complete 响应完成时调用(包括成功和失败)

jQuery Ajax介绍

http://www.w3school.com.cn/jquery/jquery_ref_ajax.asp

1.8 案例练习

1、Loading状态

2、禁止重复提交

3、表单处理

4、数据验证

1.9 接口化开发

请求地址即所谓的接口,通常我们所说的接口化开发,其实是指一个接口对应一个功能,并且严格约束了请求参数和响应结果的格式,这样前后端在开发过程中,可以减少不必要的讨论,从而并行开发,可以极大的提升开发效率,另外一个好处,当网站进行改版后,服务端接口只需要进行微调。

第2章 模板引擎

Js插件 template_native.js

作用:渲染数据时 代替 拼接字符串的操作

2.1 流行模板引擎

BaiduTemplate:http://tangram.baidu.com/BaiduTemplate/

ArtTemplate:http://aui.github.io/art-template/zh-cn/

https://aui.github.io/art-template/
velocity.js:https://github.com/shepherdwind/velocity.js/

Handlebars:http://handlebarsjs.com/
http://blog.jobbole.com/56689/

2.2 artTemplate

1、引入template-web.js

2、在{{ }}中包含js代码

3、语法:

Js代码包含在{{ }}中

{{data.key}}

{{data[‘key’]}}

{{a ? b : c}}

条件判断语句:

{{if value}} … {{/if}}

{{if v1}} … {{else if v2}} …{{/if}}

循环遍历:

{{each target }}

{{KaTeX parse error: Expected 'EOF', got '}' at position 6: index}̲} {{value}}

{{/each}}

第3章 同源&跨域

3.1 同源

同源策略是浏览器的一种安全策略,所谓同源是指,域名,协议,端口完全相同。

www.jd.com—>www.taobao.com

www.taobaol.com

M.taobao.com www.zfb.com

3.2 跨域

不同源则跨域

1-不允许进行DOM操作

2-不能进行ajax请求

例如http://www.example.com/

http://api.example.com/detail.html不同源域名不同
https//www.example.com/detail.html不同源协议不同
http://www.example.com:8080/detail.html不同源端口不同
http://api.example.com:8080/detail.html不同源域名、端口不同
https://api.example.com/detail.html不同源协议、域名不同
https://www.example.com:8080/detail.html不同源端口、协议不同
http://www.example.com/detail/index.html同源只是目录不同

3.3 跨域方案

1、顶级域名相同的可以通过domain.name来解决,即同时设置 domain.name = 顶级域名(如example.com)

2、document.domain+ iframe

3、window.name+ iframe

4、location.hash+ iframe

5、window.postMessage()

参考资料

http://rickgray.me/2015/09/03/solutions-to-cross-domain-in-browser.html

以上几种解决方案多数只能在某一特定情形下使用,兼容性及通用性都不够好,更通用的是JSONP解决方案。**

3.4 JSONP

JSON with Padding

1、原理剖析

其本质是利用了标签具有可跨域的特性,由服务端返回一个预先定义好的Javascript函数的调用,并且将服务器数据以该函数参数的形式传递过来,此方法需要前后端配合完成。

只能以GET方式请求

3.5 jQuery中的JSONP

jQuery 的$.ajax() 方法当中集成了JSONP的实现,可以非常方便的实现跨域数据的访问。

dataType:‘jsonp’ 设置dataType值为jsonp即开启跨域访问

jsonp 可以指定服务端接收的参数的“key”值,默认为callback

jsonpCallback 可以指定相应的回调函数,默认自动生成

3.6 服务器端跨域 CORS跨域:

header( ‘Access-Control-Allow-Origin:*’ );

header( ‘Access-Control-Allow-Origin:http://www.study.com’);

案例练习


天气接口:

http://lbsyun.baidu.com/index.php?title=car/api/weather

天气预报的密钥:zVo5SStav7IUiVON0kuCogecm87lonOj

百度API:

http://apistore.baidu.com/

密钥:

21f068f20fd5b7ca99c8908c1ae9f2bb

图灵机器人:http://www.tuling123.com/register/index.jhtml

第4章 XMLHttpRequest2.0

技术总是在实践中不断更新的,XMLHttpRequest也不例外。

4.1 设置超时

a) 设置超时 xhr.timeout

b) 监听超时事件 xhr.ontimeout = function () {// code}

当请求超时,此事件就会被触发

4.2 FormData

a) 提供了一个新的内建对象,可用于管理表单数据

b) 首先要获取一个表单元素form

c) 然后在实例化时 new FormData(form),将表单元素form传进去

d) 会返回一个对象,此对象可以直接做为xhr.send(formData)的参数

e) 此时我们的数据就是以二进制形式传递了

f) 注意我们这里只能以post形式传递,浏览器会自动为我们设置一个合适的请求头

4.3 二进制

a) 我们上传文件是以二进制形式传递的

b) 我们可以通过表单获取到一个文件对象

c) 然后file.files[0]可以获取文件信息

d) 然后再利用var formData = new FormData() 实例化

e) 然后再利用formData.append(‘upload’, file.files[0])将文件转成二进制

f) 最后将 formData 做为xhr.send(formData)的参数

见代码示例11-3.html 和 11-3.php

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WbWfe5Fd-1584674303776)(file:///C:\Users\ADMINI~1\AppData\Local\Temp\msohtmlclip1\01\clip_image028.jpg)]

4.4 上传进度

a) 利用XMLHttpRequest我们可以实现文件的上传

b) 并且我们可以通过xhr.upload.onprogress = function (ev) {// code},监听上传的进度

c) 这时我们上传的进度信息会保存在事件对象ev里

d) ev.loaded 表示已上传的大小,ev.total表示文件整体的大小

e) var percent = ev.loaded / ev.total

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值