第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. Linux进程虚拟地址空间管理2

    2017-04-12 前篇文章对Linux进程地址空间的布局以及各个部分的功能做了简要介绍,本文主要对各个部分的具体使用做下简要分析,主要涉及三个方面:1.MMAP文件的映射过程 2.用户 内存的动态 ...

  2. 前端基础之BOM和DOM和三个小示例(计时器、搜索框、select联动)

    一.BOM和DOM JavaScript分为 ECMAScript,DOM,BOM. BOM(Browser Object Model)是指浏览器对象模型,它使 JavaScript 有能力与浏览器进 ...

  3. HTTP request is unauthorized with client authentication scheme 'Anonymous'. The authentication header received from the server was 'NTLM'。

    情况:WCF服务在浏览器中可以正常浏览,但是通过程序调用提示: HTTP request is unauthorized with client authentication scheme 'Anon ...

  4. 在android上跑 keras 或 tensorflow 模型

    https://groups.google.com/forum/#!topic/keras-users/Yob7mIDmTFs http://talc1.loria.fr/users/cerisara ...

  5. .........请添加一个名为 jquery (区分大小写)的 ScriptResourceMapping。

    今天研究membership的时候出现的问题.在此记录一下. 解决办法就是,将"C:\Program Files (x86)\Microsoft Web Tools\Packages\Asp ...

  6. 深入理解Flink核心技术(转载)

    作者:李呈祥 Flink项目是大数据处理领域最近冉冉升起的一颗新星,其不同于其他大数据项目的诸多特性吸引了越来越多的人关注Flink项目.本文将深入分析Flink一些关键的技术与特性,希望能够帮助读者 ...

  7. EXPORT_SYMBOL使用

    EXPORT_SYMBOL只出现在2.6内核中,在2.4内核默认的非static 函数和变量都会自动导入到kernel 空间的, 都不用EXPORT_SYMBOL() 做标记的.2.6就必须用EXPO ...

  8. 记录:tensoflow改错TypeError: Cannot interpret feed_dict key as Tensor: Can not convert a float into a Te

    错误描述: TypeError: Cannot interpret feed_dict key as Tensor: Can not convert a float into a Tensor. 改错 ...

  9. [转]linux shell 获取当前正在执行脚本的绝对路径

    原文链接:http://sexywp.com/bash-how-to-get-the-basepath-of-current-running-script.htm 常见的一种误区,是使用 pwd 命令 ...

  10. python全栈开发从入门到放弃之模块和包

    一 模块 1 什么是模块? 常见的场景:一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀. 但其实import加载的模块分为四个通用类别: 1 使用python编 ...