JavaScript高级程序设计-读书笔记(6)
第20章 JSON
JSON是一个轻量级的数据格式,可以简化表示复杂数据结构的工作量
JSON的语法可以表示一下三种类型的值
l 简单值:使用与JavaScript相同的语法,可以在JSON中表示字符串、数值、布尔值和null。但JSON不支持JavaScript中的特殊数值undefined。
“Hello world!”
l 对象(属性的值可以是简单值,也可以是复杂类型值,如下这样在对象嵌入对象)
{
“name” : ”Nicholas”,
“age” : 29
“school” : {
“name” : “MerrimackCollege”,
“location” : “North Andover, MA”
}
}
l 数组
[25, “hi”, true]
把数组和对象结合起来,可以构成更复杂的数据集合,例如:
[
{
“title” : “professinal JavaScript”,
“authors” : [
“Nicholas C. Zakas”
],
edition : 3,
year : 2011
},
{
“title” : “ professinal JavaScript”,
“authors” : [
“Nicholas C. Zakas”
],
edition : 2,
year : 2009
}
]
ECMAScript 5定义了一个原生的JSON对象,可以用来将对象序列化为JSON字符串或者将JSON数据解析为JavaScript对象。JSON.stringify()和JSON.parse()方法分别用来实现上述两项功能。
第21章 Ajax与Comet
Ajax技术的核心是XMLHttpRequest对象(简称XHR).能够以异步方式从服务器取得更多信息,以为着用户单击后,可以不刷新页面也能取得新数据。
1、XMLHttpRequest对象
(1)XHR的用法
使用下面的代码在所有浏览器中创建XHR对象:
var xhr = createrXHR();
在使用XHR对象时,要调用的第一个方法是open(),它接受3个参数:要发送的请求的类型(“get”、”post”等)、请求的URL和表示是否异步发送请求的布尔值。
调用open()方法并不会真正发送请求,而只是启动一个请求以备发送。
要发送特定的请求,条用send()方法,如:
xhr.open("get","example.php", false);
xhr.send(null);
如果不需要通过请求主体发送数据,则必须传入null。
在收到响应后,响应的数据会自动填充XHR对象的属性,相关属性如下:
- responseText:作为响应的主体被返回的文本;
- responseXML:若响应的内容类型”text/xml”或”application/xml”,此属性保存响应数据XML DOM文档
- status:响应的HTTP状态;
- statusText:HTTP状态的说明。
在接收到响应后,第一步是检查status属性,以确定响应已经成功返回。
多数情况下,要发送异步请求,可以检测XHR对象的readyState属性,该属性表示请求/响应过程的当前活动阶段。可能的取值如下:
0 : 未初始化,未调用open();
1 : 启动,已经调用了open();
2 : 发送,已经调用了send(),未接受响应;
3 : 接受,已接收到部分响应;
4 : 完成,已接收到全部响应,且已经可以在客户端使用。
只要readyState属性的值由一个值变成另一个值,都会触发一次readystatechange事件。
另外,在接收到响应之前还可以调用abort()方法来取消异步请求。
(2)HTTP头部信息
每个HTTP请求和响应都会带有相应的头部信息。
默认情况下,在发送XHR请求的同时,还会发送下列头部信息:
Accept:浏览器能够处理的内容类型;
Accept-Charset:浏览器能够显示的字符集;
Accept-Encoding:浏览器能够处理的压缩编码;
Axxept-Language:浏览器当前设置的语言;
Connection:浏览器与服务器之间连接的类型;
Cookie:当前页面设置的如何Cookie;
Host:发送请求耳洞页面所在域;
Referer:发出请求的页面的URI;
User-Agent:浏览器的用户代理字符串。
使用setRequestHeader()方法可以设置自定义的请求头部信息。
调用XHR对象的getResponseHeader()方法并传入头部字段名称,可以取得相应的响应头部信息。
而调用getAllResponseHeader()方法则可以取得一个包含所有头部信息的长字符串。
(3)GET请求
GET是最常见的请求类型,最常用于向服务器查询某些信息。
必要时,可以将查询字符串参数追加到URL的末尾,以便将信息发送给服务器。
查询字符串中每个参数的名称和值都必须使用encodeURIComponent()进行编码,然后才能放到URL的末尾。
下面这个函数可以辅助想现有URL的某位添加查询字符串参数:
function addURLParam(url,name,value){
url += (url.indexOf('?')
== -1?'?':'&');
url +=
encodeURIComponent(name) + '=' + encodeURIComponent(value);
return url;
}
(4)POST请求
POST请求,通常用于向服务器发送应该被保存的数据。
2、XMLHttpRequest 2级
(1)FormData为序列化表单以及创建于表单格式相同的数据(用于通过XHR传输)提供了便利。
下面的例子创建了一个FormData对象,并向其中添加了一些数据:
var data = new FormData();
data.append(“name”,”Nicholas”);
这个append()方法接收两个参数:键和值。
而通过向FormData构造函数传入表单元素,也可以用表单的数据预先向其中填入键值对:
var data = new FormData(document.forms[0]);
创建FormData的实例后,可以将它直接传给XHR的send()方法。
使用FormData的方便之处体现在不必明确地在XHR对象上设置请求头部。
(2)超时设定
IE8为XHR对象添加了一个timeout属性,表示请求在等待响应多少毫秒之后就终止。
(3)overrideMimeType()
Firefox最早引入了overrideMimeType()方法,用于重写XHR响应的MIME类型。
3、进度事件
Progress Events 规范定义了与客户端服务通信有关的事件。有以下6个进度事件:loadstarts、progress、error、abort、load、loadend。
每个请求都从触发loadstart事件开始,接下来是一个或多个progress事件,然后触发error、abort或load事件中的一个,最后以触发loadend事件结束。
4、跨源资源共享
CORS(Cross-Origin
Resource Sharing,跨源资源共享)定义了在必须访问跨源资源时,浏览器与服务器应该如何沟通。
其基本思想,就是使用自定义的HTTP头部让浏览器与服务器进行沟通,从而决定请求或响应是应该成功,还是应该失败。
(1)IE对CORS的实现
微软在IE8中引入了XDR(XdomainRequest)类型。这个对象与XHR类似,但能实现安全可靠的跨域通信。
XDR对象的使用方法与XHR对象非常相似。也是创建一个XdomainRequest的实例,调用open()方法,在调用send()方法。
所有XDR请求都是异步执行的,不能用它来创建同比请求。
XDR对象也支持timeout属性以及ontimeout事件处理程序。
为支持POST请求,XDR对象提供了contentType属性,用来表示发送数据的格式。
(2)其他浏览器对CORS的实现
Firefox3.5+、Safair4+、Chrome、iSO版和Android平台中的WebKit都通过XMLHttpRequest对象实现了对CORS的原生支持。
要请求位于另一个域中的资源,使用标准的XHR对象并在open()方法中传入决定URL即可。
(3)Preflighted
Reqeusts
CORS通过一种叫做Preflighted
Reqeusts的透明服务器验证机制支持开发人员使用自定义的头部GET或POST之外的方法,以及不同类型的主体内容。
(4)带凭据的请求
默认情况下,跨源请求不提供凭据(cookie、HTTP认证及客户发顿SSL证明等)。通过将withCredentials属性设置为true,可以指定某个请求应该发送凭据)。
(5)跨浏览器的CORS
检测XHR是否支持CORS的最简单方式,就是检查是否存在withCredentials属性。再结合检测XdomainRequest对象是否存在,就可以兼顾所有浏览器了。
5、其他跨域技术
利用DOM中能够执行跨域请求的功能,在不依赖XHR对象的情况下也能发送某种请求。
(1)图像Ping
第一种跨域请求技术是使用<img>标签。
通过图像Ping,浏览器得不到任何具体的数据,但通过监听load和error事件,它能知道响应是什么时候接收到的。
缺点:只能发送GET请求;无法访问服务器的响应文本。
(2)JSONP
填充式JSON或参数式JSON,是应用JSON方法的一种新方法。
优点:能够直接访问文本,支持浏览器与服务器之间的双向通信。
缺点:JSONP是从其他域中加载代码执行的,可能不安全;要确定JSONP请求是否失败并不容易。
(3)Comet
Ajax是一种从页面向服务器请求数据的技术,而Comet则是一种服务器向页面推送数据的技术。
有两种实现Comet的方式:长轮询和流。
轮询的优势是所有浏览器都支持。
(4)服务器发送事件(SSE)
SSE API用于创建到服务器的单向连接,服务器通过这个连接可以发送任意数量的数据。
要预定新的事件流,首先要创建一个新的EventSource对象,并传进一个入口点:
var source = new EventSource(“myevents.php”);
默认情况下,EventSource对象会保持与服务器的活动连接。如果想强制立即端来连接并且不再连接,可以调用close()方法。
(5)Web
Sockets
Web Sockets的目标是在一个单独的持久连接上提供全双工、双向通信。
使用标准的HTTP服务器无法实现Web Sockets,只有支持这种协议的专门服务器才能正常工作。
要创建Web
Socket,先实例一个WebSocket对象并传入要连接的URL:
var socket =
new WebSocket(“ws://www.example.com/server.php”);
要关闭Web
Socket连接,可以在任何时候调用close()方法。
socket.close();
Web Socket打开之后,就可以通过连接发送和接收数据。要向服务器发送数据,使用send()方法。
Web Sockets只能通过连接发送纯文本数据,所以对于复杂的数据结构,在通过连接发送之前,必须进行序列化。
在服务器向客服端发来消息时,WebSocket对象就会触发message事件。
6、安全
为确保通过XHR访问的URL安全,通行的做法就是验证发送请求者是否有权访问相应的资源。
第23章 离线应用与客户端存储
支持离线Web应用开发是HTML5的另一个重点。
开发离线Web应用需要几个步骤:
首先是确保应用知道设备是否能上网;
然后,应用还必须能访问一定的资源(图像、JavaScript、CSS等);
最后,必须有一块本地空间用于保存数据。
1、离线检测
HTML5为此定义了一个navigator.onLine属性,这个属性值为true表示设备能上网,值为false表示设备离线。
为了更好地确定网络是否可用,HTML还定义了两个事件:online和offline。当网络从离线变为在线或者从在线变为离线时,分别触发这两个事件。
为了检测应用是否离线,在页面加载后,最好先通过navigator.onLine取得初始的状态。然后,就是通过上述两个事件来确定网络连接状态是否变化。
2、应用缓存
HTML5的应用缓存,简称为appcache。就是从浏览器的缓存中分出来的一块缓存区。要想在这个缓存中保存数据,可以使用一个描述文件(manifest file),列出要下载和缓存的资源。
要将描述文件与页面关联起来,可以在<htnl>中的manifest属性中指定这个文件的路径,如:
<html
manifest=”/offline.manifest”>
应用缓存也有相应的JavaScript API让你知道它都在做什么。这个API的核心是applicationCache对象,这个对象有一个status属性,属性的值是常量,表示应用缓存的如下当前状态:
0 :无缓存。
1:闲置。
2:检查中。
3:下载中。
4:更新完成。
5:废弃。
应用缓存还有很多相关是事件,表示其状态的改变。有:checking、error、noupdate、downloading、progress、updateready、cached。
一般来讲,这些事件会随着页面加载按上述顺序依次触发。不过,通过调用update()方法也可以手工干预,让应用缓存为检查更新而触发上述事件。
3、数据存储
(1)Cookie
HTTP Cookie,通常直接叫做cookie,最初是在客户端用于存储会话信息的。
- 限制
cookie在性质上是绑定在特定的域名下的。
由于cookie是存储在客户端计算机上的,还加入了一些限制确保cookie不会被恶意使用,同时不会占据太多磁盘空间。每个域的cookie总数是有限制的,不过浏览器之间个不相同。
当超过单个域名限制之后还要再设置cookie,浏览器就会清楚之前设置的cookie。
浏览器中对cookie的尺寸也有限制。大多数浏览器都有大约4096B(加减1)的长度限制。
如果你尝试创建超过最大尺寸限制的cookie,那么该cookie会被悄无声息地丢掉。
- cookie的构成
cookie由浏览器保存的以下几块信息构成:名称、值、域、路径、失效时间、安全标志。
- JavaScript中的cookie
基本的cookie操作有三种:读取、写入和删除。
(2)IE用户数据
在IE5.0中,微软通过一个自定义行为引入了持久化用户数据的概念。
(3)Web存储机制
Web Storage的目的是克服由cookie带来的一些限制,当数据需要被严格控制在客户端上时,无须持续地将数据发回服务器。
最初的Web Storage规范包含了两种对象的定义:sessionStorage和globalStorage。
(4)IndexedB
IndexedB是一种类似SOL数据库的结构化数据储存机制。
JavaScript高级程序设计-读书笔记(6)的更多相关文章
- javascript高级程序设计读书笔记-事件(一)
读书笔记,写的很乱 事件处理程序 事件处理程序分为三种: 1.html事件2. DOM0级,3,DOM2级别 没有DOM1 同样的事件 DOM0会顶掉html事件 因为他们都是属性 而 ...
- javascript高级程序设计读书笔记
第2章 在html中使用javascript 一般都会把js引用文件放在</body>前面,而不是放在<head>里, 目的是最后读取js文件以提高网页载入速度. 引用js文 ...
- Javascript高级程序设计读书笔记(第六章)
第6章 面向对象的程序设计 6.2 创建对象 创建某个类的实例,必须使用new操作符调用构造函数会经历以下四个步骤: 创建一个新对象: 将构造函数的作用域赋给新对象: 执行构造函数中的代码: 返回新 ...
- JavaScript高级程序设计-读书笔记(7)
第22章 高级技巧 1.高级函数 (1)安全的类型检测 在任何值上调用Object原生的toString()方法,都会返回一个[object NativeConstructorName]格式的字符串. ...
- JavaScript高级程序设计 读书笔记
第一章 JavaScript 简介 第二章 Html中使用JavaScript 第三章 基本概念 第四章 变量,作用域,内存 第五章 引用类型 第六章 面向对象 第七章 函数表达式 第八章 BOM 第 ...
- JavaScript高级程序设计 读书笔记 第一章
JavaScript是一种专门为与网页交互而设计的脚本语言 JavaScript实现 ECMAscript---核心 DOM---文档对象模型 BOM---浏览器对象模型
- Javascript高级程序设计读书笔记(第二章)
第二章 在HTML中使用Javascript 2.1<script>元素 延迟脚本(defer = "defer")表明脚本在执行时不会影响页面的构造,脚本会被延迟到 ...
- JavaScript高级程序设计-读书笔记(5)
第13章 事件 1.事件流 事件流描述的是从页面中接收事件的顺序.IE的事件流是事件冒泡流,而Netscape Communicator的事件流是事件捕获流. (1)事件冒泡,即事件开始时由最具体的元 ...
- JavaScript高级程序设计-读书笔记(4)
第11章 DOM扩展 1.选择符API Selector API Level 1 的核心是两个方法:querySelector()和querySelectorAll().在兼容的浏览器中,可以通过Do ...
随机推荐
- Golang&Python测试thrift
接上篇,安装好之后,就开始编写IDL生成然后测试. 一.生成运行 参考 http://www.aboutyun.com/thread-8916-1-1.html 来个添加,查询. namespace ...
- Celery(一个懂得 异步任务、定时任务、周期任务 的"芹菜")
一.什么是Celery? Celery 是基于Python实现的模块,用于执行异步.定时.周期任务的,其结构的组成是: - 用户任务 app - 管道 broker 用于存储任务(官方推荐 redis ...
- 日志输出:控制台和log文件输出日志
self_log.py 中 import os import logging import time # 如果日志文件夹不存在,则创建 log_dir = "log" # 日志存放 ...
- 图解Python可以做些什么
Python具有简单.易学.免费.开源.可移植.可扩展.可嵌入.面向对象等优点,它的面向对象甚至比java和C#.net更彻底. 作为一种通用语言,Python几乎可以用在任何领域和场合,角色几乎是无 ...
- jenkins用户管理(Role-based Authorization Strategy插件使用)
安装:Role-based Authorization Strategy插件 一.点击左侧的"系统管理"-->再点击绿色的"管理插件" 二.点击&quo ...
- Vi文本编辑
vi 有3种工作模式,分别是命令行模式.插入模式.底行模式 . 命令行模式:最初进入的一般模式,该模式下可以移动光标进行浏览,整行删除,但无法编辑文字.插入模式:只有在该模式下,用户才能进行文字的编辑 ...
- 深度分析ORACLE热点块问题
1.热点块的定义 数据库的热点块,从简单了讲,就是极短的时间内对 少量数据块进行了过于频繁的访问.定义看起来总是很简单的,但实际在数据库中,我们要去观察或者确定热点块的问题,却不是那么简单了.要深刻地 ...
- php now 5.2 升级5.3
简单说明 在WIN上有时候需要测试一些PHP程序,又不会自行独立配置环境,那么PHPNow是非常好的选择. PHPNow自带的PHP版本为5.2.14,而最后一次更新在于2010-9-22,PHP5. ...
- android 22.3 环境
http://developer.android.com/tools/sdk/eclipse-adt.html 要求 22.3https://dl.google.com/android/android ...
- [Windows Powershell]-学习笔记(4)
Powershell 定义变量 在powershell中变量名均是以美元符"$"开始,剩余字符可以是数字.字母.下划线的任意字符,并且powershell变量名大小写不敏感($a和 ...