第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)的更多相关文章

  1. javascript高级程序设计读书笔记-事件(一)

    读书笔记,写的很乱   事件处理程序   事件处理程序分为三种: 1.html事件2. DOM0级,3,DOM2级别  没有DOM1 同样的事件 DOM0会顶掉html事件   因为他们都是属性  而 ...

  2. javascript高级程序设计读书笔记

    第2章  在html中使用javascript 一般都会把js引用文件放在</body>前面,而不是放在<head>里, 目的是最后读取js文件以提高网页载入速度. 引用js文 ...

  3. Javascript高级程序设计读书笔记(第六章)

    第6章  面向对象的程序设计 6.2 创建对象 创建某个类的实例,必须使用new操作符调用构造函数会经历以下四个步骤: 创建一个新对象: 将构造函数的作用域赋给新对象: 执行构造函数中的代码: 返回新 ...

  4. JavaScript高级程序设计-读书笔记(7)

    第22章 高级技巧 1.高级函数 (1)安全的类型检测 在任何值上调用Object原生的toString()方法,都会返回一个[object NativeConstructorName]格式的字符串. ...

  5. JavaScript高级程序设计 读书笔记

    第一章 JavaScript 简介 第二章 Html中使用JavaScript 第三章 基本概念 第四章 变量,作用域,内存 第五章 引用类型 第六章 面向对象 第七章 函数表达式 第八章 BOM 第 ...

  6. JavaScript高级程序设计 读书笔记 第一章

    JavaScript是一种专门为与网页交互而设计的脚本语言 JavaScript实现 ECMAscript---核心 DOM---文档对象模型 BOM---浏览器对象模型

  7. Javascript高级程序设计读书笔记(第二章)

    第二章  在HTML中使用Javascript 2.1<script>元素 延迟脚本(defer = "defer")表明脚本在执行时不会影响页面的构造,脚本会被延迟到 ...

  8. JavaScript高级程序设计-读书笔记(5)

    第13章 事件 1.事件流 事件流描述的是从页面中接收事件的顺序.IE的事件流是事件冒泡流,而Netscape Communicator的事件流是事件捕获流. (1)事件冒泡,即事件开始时由最具体的元 ...

  9. JavaScript高级程序设计-读书笔记(4)

    第11章 DOM扩展 1.选择符API Selector API Level 1 的核心是两个方法:querySelector()和querySelectorAll().在兼容的浏览器中,可以通过Do ...

随机推荐

  1. Golang&Python测试thrift

    接上篇,安装好之后,就开始编写IDL生成然后测试. 一.生成运行 参考 http://www.aboutyun.com/thread-8916-1-1.html 来个添加,查询. namespace ...

  2. Celery(一个懂得 异步任务、定时任务、周期任务 的"芹菜")

    一.什么是Celery? Celery 是基于Python实现的模块,用于执行异步.定时.周期任务的,其结构的组成是: - 用户任务 app - 管道 broker 用于存储任务(官方推荐 redis ...

  3. 日志输出:控制台和log文件输出日志

    self_log.py 中 import os import logging import time # 如果日志文件夹不存在,则创建 log_dir = "log" # 日志存放 ...

  4. 图解Python可以做些什么

    Python具有简单.易学.免费.开源.可移植.可扩展.可嵌入.面向对象等优点,它的面向对象甚至比java和C#.net更彻底. 作为一种通用语言,Python几乎可以用在任何领域和场合,角色几乎是无 ...

  5. jenkins用户管理(Role-based Authorization Strategy插件使用)

    安装:Role-based Authorization Strategy插件 一.点击左侧的"系统管理"-->再点击绿色的"管理插件"  二.点击&quo ...

  6. Vi文本编辑

    vi 有3种工作模式,分别是命令行模式.插入模式.底行模式 . 命令行模式:最初进入的一般模式,该模式下可以移动光标进行浏览,整行删除,但无法编辑文字.插入模式:只有在该模式下,用户才能进行文字的编辑 ...

  7. 深度分析ORACLE热点块问题

    1.热点块的定义 数据库的热点块,从简单了讲,就是极短的时间内对 少量数据块进行了过于频繁的访问.定义看起来总是很简单的,但实际在数据库中,我们要去观察或者确定热点块的问题,却不是那么简单了.要深刻地 ...

  8. php now 5.2 升级5.3

    简单说明 在WIN上有时候需要测试一些PHP程序,又不会自行独立配置环境,那么PHPNow是非常好的选择. PHPNow自带的PHP版本为5.2.14,而最后一次更新在于2010-9-22,PHP5. ...

  9. android 22.3 环境

    http://developer.android.com/tools/sdk/eclipse-adt.html 要求 22.3https://dl.google.com/android/android ...

  10. [Windows Powershell]-学习笔记(4)

    Powershell 定义变量 在powershell中变量名均是以美元符"$"开始,剩余字符可以是数字.字母.下划线的任意字符,并且powershell变量名大小写不敏感($a和 ...