zoukankan      html  css  js  c++  java
  • 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数据库的结构化数据储存机制。

  • 相关阅读:
    Object.keys方法
    vue数据绑定原理
    JS控制数字从指定数开始变化
    传入参数和回调取值
    Android contacts content provider学习小结
    Android输入法框架分析(1)-三大组件
    通过Android View的两种事件响应方法比较inheritance和composition
    对象间相互调用时互相控制的几种方法
    immutable和mutable对象
    关于Unicode
  • 原文地址:https://www.cnblogs.com/ww03/p/5277069.html
Copyright © 2011-2022 走看看