JavaScript高级程序设计:第二十一章
第二十一章
Ajax与Comet
一、XMLHttpRequest对象
1.XHT的用法
在使用XHR对象时,要调用的第一个方法时open( ),它接受3个参数:要发送的请求的类型、请求的URL和表示是否异步发送请求的布尔值。下面是调用这个方法的例子:
xhr.open( “get” , ”example.php” , false ) ;
这段代码会启动一个针对example.php的GET请求。有两点需要注意:一是URL相对于执行代码的当前页面;二是调用open( )方法并不会真正发送请求,而只是启动一个请求以备发送。
要发送特定的请求,只能像下面这样调用send( )方法 ;
xhr.open( “get” , “example.php” , false) ;
xhr.send( null ) ;
这里的send( )方法接收一个参数,即要作为请求主体发送的数据。如果不需要通过请求主体发送数据,则必须传入null,因为这个参数对有些浏览器来说是必须的。调用send( )之后,请求就会被分派到服务器。
XHR对象的readyState属性表示请求/响应过程的当前活动阶段。这个属性可取的值如下:
0:未初始化。已经调用open()方法,但尚未调用send()方法。
1:启动。已经调用open()方法,但尚未调用send()方法。
2:发送。已经调用send()方法,但尚未接收到响应。
3:接收。已经接收到部分响应数据。
4:完成。已经接收到全部响应数据,而且已经可以在客户端使用了。
2.GET请求
GET是最常见的请求类型,最常用于向服务器查询某些信息。使用GET请求经常发生的一个错误,就是查询字符串的格式有问题。查询字符串中每个参数的名称和值都必须使用encodeURIComponent( )进行编码,然后才能放到URL的末尾;而且所有名-值对都必须由和号&分隔。
3.POST请求
使用POST请求通常是向服务器发送应该保存的数据。POST请求应该吧数据作为请求的主体提交,而GET请求传统上不是这样,POST请求可以包含非常多的数据,而且格式不限。
二、XMLHttpRequest2级
1.FormData
现代WEB应用中频繁使用的一项功能就是表单数据的序列化,XMLHttpRequest2级为此定义了FormData类型。FormData为序列化表单以及创建与表单格式相同的数据提供了便利。
2.超时设定
IE8为XHR对象添加了一个timeout属性,表示请求在等待响应多少毫秒之后就终止。在给timeout设置一个数值之后,如果在规定的时间内浏览器还没有接收到响应,那么就会触发timeout事件,进而会调用ontimeout事件处理程序。
3.overrideMimeType( )方法
返回响应的MIME类型决定了XHR对象如何处理它,所以提供一种方法能够重写服务器返回的MIME类型时很有用的。
三、进度事件
1.load事件
响应接收完毕后触发load事件,而onload事件处理程序会接收到一个event对象,其target属性就指向XHR对象实例, 因而可以访问到XHR对象的所有方法和属性。
2.progress事件
progress事件会在浏览器接收新数据期间周期性地触发。而onprogress事件处理程序会接收到一个event对象,其target属性是XHR对象,但包含着三个额外的属性:lengthComputable(一个表示进度信息是否可用的布尔值)、position(表示已经接收的字节数)和totalSize(表示根据Content-Length响应头部确定的预期字节数)。
四、跨源资源共享
1.IE对CORS的实现
微软在IE8中引入了XDR类型,这个对象与XHR相似,但能实现安全可靠的跨域通信。以下是XDR与XHR的一些不同之处:
cookie不会随请求发送,也不会随响应返回。
只能设置请求头部信息中的Content-Type字段。
不能访问响应头部信息。
只支持GET和POST请求。
XDR对象的使用方法和XHR非常类似,也是创建一个XDomainRequest的实例,再调用open()方法,再调用send()方法。但与XHR对象的open()方法不同,XDR对象的open()方法只接受两个参数:请求的类型和URL。
2.其他浏览器对CORS的实现
跨域XHR对象也有一些限制:
不能使用setRequestHeader()设置自定义头部
不能发送和接收cookie
调用getAllResponseHdaders()方法总会返回空字符串
3.Preflighted Requests
CORS通过一种叫做Preflighted Requests的透明服务器验证机制支持开发人员使用自定义的头部、GET或POST之外的方法,以及不同类型的主体内容。在使用下列高级选项来发送请求时,就会向服务器发送一个Preflight请求。
4.带凭据的请求
默认情况下,跨源请求不提供凭据(cookie、HTTP认证及客户端SSL证明)。通过将withCredentials属性设置为true,可以指定某个请求应该发送凭据。如果服务器接收带凭据的请求,会用下面的HTTP头部来响应。
5.跨浏览器的CORS
即使浏览器对CORS的支持程度都不一样,但所有浏览器都支持简单的请求,因此有必要实现一个跨浏览器的方案。检测XHR是否支持CORS的最简单方式,就是检查是否存在withCredentials属性。再结合检查XDomainRequest对象是否存在,就可以兼顾所有浏览器了。
JavaScript高级程序设计:第二十一章的更多相关文章
- javascript高级程序设计第二章知识点提炼
这是我整理的javascript高级程序设计第二章的脑图,内容也是非常浅显与简单.希望您看了我的博客能够给我一些意见或者建议.
- JavaScript高级程序设计第20章JSON 笔记 (学习笔记)
第二十章 JSON 1.Json 可以表示三种类型的值: 1.简单值: 表示数值:5 表示字符串:“hello wrold”注表示字符串时必须使用双引号 2.对象: {“name”:“mi”,”ag ...
- javascript高级程序设计---第二、三章
在HTML中引用javaScript javascript的几个属性 type async(异步加载 只适用于外部JS且IE8以上 HTML5规范 先于load执行) src defer(延迟加载 ...
- javascript高级程序设计第二章
看后总结: 1.js代码用得最多的两种加载方式: a)外部文件形式:<script type="text/javascript" src="jquery.min.j ...
- 读书笔记 - javascript 高级程序设计 - 第二章 在Html中使用JavaScript
1 <script>的6个属性 async 立即下载当前script标签的外部脚本 但不能影响别的 charset 没用了 defer 文档显示之后再执行脚本,只对外部脚本有效 lan ...
- JavaScript 高级程序设计 第5章引用类型 笔记
第五章 引用类型 一.object类型 1.创建方法: 1.使用new 操作符创建 var person=new object() Person.name=”Nicholasa” Porson.age ...
- JavaScript高级程序设计第14章表单脚本 (学习笔记)
第十四章 表单脚本 1.阻止默认表单提交 1.提交表单数据 1.使用type=submit提交按钮 2.使用submit():方法 注意:当用户点击提交按钮时,会触发submit事件,从而在这里我们有 ...
- 《JavaScript 高级程序设计》第一章:简介
JavaScript 历史 JavaScript的诞生的主要是当时的 netspace 公司谋求为自己的浏览器 Navigator 添加一种脚本语言,以便在本地客户端进行一些行为操作,而这一功能的需求 ...
- 《JavaScript高级程序设计》——第一章JavaScript简介
第一章主要讲了JavaScript的诞生和发展.刚刚接触JavaScript的我,似乎对这些内容并不感兴趣,快速看了一遍就开始去看第二章了. 看完第一章,收获也就是了解到JavaScript由ECMA ...
- javascript高级程序设计第5章,引用类型
object类型: 创建object实列的方式有两种,一种是new()方法,一种是对象字面量表示法: 第一种法方: var obj = new object(); obj.name = 'name' ...
随机推荐
- 扣出的图片无法调整大小 photoshop mac版本
- STL容器小结
1.空间分配器 std::alloc用于容器中内存空间的分配和释放,以及分配内存的管理.construct().destroy()等全局函数用于为对象的构造和析构. 2.迭代器和trains 迭代器 ...
- C# lesson1
一.C#和.net平台 .net是一个软件,一个平台(一般在windows自带 或者在vs里面已经有了) C#是一门运行在.net平台上的语言,需要编译:C#经过.net framework里面的编译 ...
- 4.请求方式为application/json时的接口测试要如何做?
1.单独新建一个线程组, 在信息头管理器中增加: 在Body Data中,添加json格式的内容(我不会写,直接用fiddler抓包,然后把TextView中的数据复制过来). 2.然后因为登录状态, ...
- 安卓Activity、service是否处于同一进程
Activity与Service是否处于同一进程? 1)默认情况下(不写android:process的时候),此时同一个应用程序的所有组建位于同一进程里,Activity与service也处于同 ...
- openstack私有云布署实践【4.2 上层代理haproxy+nginx配置 (办公网测试环境)】
续上一节说明 一开始我也是使用haproxy来做的,但后来方式改了,是因为物理机controller的高配置有些浪费,我需要1组高可用的上层nginx代理服务器来实现其它域名80代理访问,很多办公网测 ...
- openresty 前端开发轻量级MVC框架封装二(渲染篇)
这一章主要介绍怎么使用模板,进行后端渲染,主要用到了lua-resty-template这个库,直接下载下来,放到lualib里面就行了,推荐第三方库,已经框架都放到lualib目录里面,lua目录放 ...
- VB VBA VBS有什么区别?
VB和VBA本就是同宗的姐妹,只不过姐姐VB的功夫要比妹妹VBA历害些.不过姐姐只会单打独斗是女强人:妹妹却只会傍大款(例如Office).姐姐有生育能力,是真正的女人:妹妹却不会生崽(生成.EXE) ...
- JavaScript详解
JavaScript可以说是web开发中必备的一种技术.它具有灵活,简单,高效等特点.这次DRP中大量的用到了js,让自己对js有了更深的了解.看完这个以后还回去看了一下牛腩的js视频.把以前没看的看 ...
- Effective JavaScript :第四章
1.理解:prototype.getPrototypeOf和_proto_之间的不同 ①C.prototype用于建立new C()创建的对象的原型. ②Object.getPrototypeOf(o ...