日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

JavaScript高级程序设计-读书笔记(6)

發(fā)布時間:2024/6/21 javascript 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JavaScript高级程序设计-读书笔记(6) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

第20章 JSON

JSON是一個輕量級的數(shù)據(jù)格式,可以簡化表示復雜數(shù)據(jù)結構的工作量

JSON的語法可以表示一下三種類型的值

l??????? 簡單值:使用與JavaScript相同的語法,可以在JSON中表示字符串、數(shù)值、布爾值和null。但JSON不支持JavaScript中的特殊數(shù)值undefined。

“Hello world!”

l??????? 對象(屬性的值可以是簡單值,也可以是復雜類型值,如下這樣在對象嵌入對象)

?????? {

????????? “name” : ”Nicholas”,

????????? “age” : 29

????????? “school” : {

????????????? “name” : “MerrimackCollege”,

????????????? “l(fā)ocation” : “North Andover, MA”

?????????? }

?????? }

l??????? 數(shù)組

?????? [25, “hi”, true]

把數(shù)組和對象結合起來,可以構成更復雜的數(shù)據(jù)集合,例如:

?? [

????????? {

???????????? “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數(shù)據(jù)解析為JavaScript對象。JSON.stringify()和JSON.parse()方法分別用來實現(xiàn)上述兩項功能。

?

第21章 Ajax與Comet

Ajax技術的核心是XMLHttpRequest對象(簡稱XHR).能夠以異步方式從服務器取得更多信息,以為著用戶單擊后,可以不刷新頁面也能取得新數(shù)據(jù)。

1、XMLHttpRequest對象

(1)XHR的用法

使用下面的代碼在所有瀏覽器中創(chuàng)建XHR對象:

??? var xhr = createrXHR();

?

在使用XHR對象時,要調用的第一個方法是open(),它接受3個參數(shù):要發(fā)送的請求的類型(“get”、”post”等)、請求的URL和表示是否異步發(fā)送請求的布爾值。

調用open()方法并不會真正發(fā)送請求,而只是啟動一個請求以備發(fā)送。

?

要發(fā)送特定的請求,條用send()方法,如:

xhr.open("get","example.php", false);

xhr.send(null);

?? 如果不需要通過請求主體發(fā)送數(shù)據(jù),則必須傳入null。

?

在收到響應后,響應的數(shù)據(jù)會自動填充XHR對象的屬性,相關屬性如下:

  • responseText:作為響應的主體被返回的文本;
  • responseXML:若響應的內容類型”text/xml”或”application/xml”,此屬性保存響應數(shù)據(jù)XML DOM文檔
  • status:響應的HTTP狀態(tài);
  • statusText:HTTP狀態(tài)的說明。

在接收到響應后,第一步是檢查status屬性,以確定響應已經成功返回。

?

多數(shù)情況下,要發(fā)送異步請求,可以檢測XHR對象的readyState屬性,該屬性表示請求/響應過程的當前活動階段。可能的取值如下:

0 : 未初始化,未調用open();
?????? ?????? 1 : 啟動,已經調用了open();
?????? ?????? 2 : 發(fā)送,已經調用了send(),未接受響應;
?????? ?????? 3 : 接受,已接收到部分響應;
?????? ?????? 4 : 完成,已接收到全部響應,且已經可以在客戶端使用。

只要readyState屬性的值由一個值變成另一個值,都會觸發(fā)一次readystatechange事件。

另外,在接收到響應之前還可以調用abort()方法來取消異步請求。

(2)HTTP頭部信息

?每個HTTP請求和響應都會帶有相應的頭部信息。

默認情況下,在發(fā)送XHR請求的同時,還會發(fā)送下列頭部信息:

????????????? Accept:瀏覽器能夠處理的內容類型;

????????????? Accept-Charset:瀏覽器能夠顯示的字符集;

????????????? Accept-Encoding:瀏覽器能夠處理的壓縮編碼;

????????????? Axxept-Language:瀏覽器當前設置的語言;

????????????? Connection:瀏覽器與服務器之間連接的類型;

????????????? Cookie:當前頁面設置的如何Cookie;

????????????? Host:發(fā)送請求耳洞頁面所在域;

????????????? Referer:發(fā)出請求的頁面的URI;

????????????? User-Agent:瀏覽器的用戶代理字符串。

?????? 使用setRequestHeader()方法可以設置自定義的請求頭部信息。

???? 調用XHR對象的getResponseHeader()方法并傳入頭部字段名稱,可以取得相應的響應頭部信息。

?????? 而調用getAllResponseHeader()方法則可以取得一個包含所有頭部信息的長字符串。

(3)GET請求

GET是最常見的請求類型,最常用于向服務器查詢某些信息。

必要時,可以將查詢字符串參數(shù)追加到URL的末尾,以便將信息發(fā)送給服務器。

查詢字符串中每個參數(shù)的名稱和值都必須使用encodeURIComponent()進行編碼,然后才能放到URL的末尾。

下面這個函數(shù)可以輔助想現(xiàn)有URL的某位添加查詢字符串參數(shù):

function addURLParam(url,name,value){

??? url += (url.indexOf('?') == -1?'?':'&');

??? url += encodeURIComponent(name) + '=' + encodeURIComponent(value);

??? return url;

}

(4)POST請求

?? POST請求,通常用于向服務器發(fā)送應該被保存的數(shù)據(jù)。

?

2、XMLHttpRequest 2級

(1)FormData為序列化表單以及創(chuàng)建于表單格式相同的數(shù)據(jù)(用于通過XHR傳輸)提供了便利。

?? 下面的例子創(chuàng)建了一個FormData對象,并向其中添加了一些數(shù)據(jù):

var data = new FormData();

data.append(“name”,”Nicholas”);

?? 這個append()方法接收兩個參數(shù):鍵和值。

???

?? 而通過向FormData構造函數(shù)傳入表單元素,也可以用表單的數(shù)據(jù)預先向其中填入鍵值對:

?? var data = new FormData(document.forms[0]);

?

?? 創(chuàng)建FormData的實例后,可以將它直接傳給XHR的send()方法。

?

使用FormData的方便之處體現(xiàn)在不必明確地在XHR對象上設置請求頭部。

(2)超時設定

?? IE8為XHR對象添加了一個timeout屬性,表示請求在等待響應多少毫秒之后就終止。

(3)overrideMimeType()

?? Firefox最早引入了overrideMimeType()方法,用于重寫XHR響應的MIME類型。

3、進度事件

Progress Events 規(guī)范定義了與客戶端服務通信有關的事件。有以下6個進度事件:loadstarts、progress、error、abort、load、loadend。

?每個請求都從觸發(fā)loadstart事件開始,接下來是一個或多個progress事件,然后觸發(fā)error、abort或load事件中的一個,最后以觸發(fā)loadend事件結束。

4、跨源資源共享

CORS(Cross-Origin Resource Sharing,跨源資源共享)定義了在必須訪問跨源資源時,瀏覽器與服務器應該如何溝通。

其基本思想,就是使用自定義的HTTP頭部讓瀏覽器與服務器進行溝通,從而決定請求或響應是應該成功,還是應該失敗。

(1)IE對CORS的實現(xiàn)

?? 微軟在IE8中引入了XDR(XdomainRequest)類型。這個對象與XHR類似,但能實現(xiàn)安全可靠的跨域通信。

XDR對象的使用方法與XHR對象非常相似。也是創(chuàng)建一個XdomainRequest的實例,調用open()方法,在調用send()方法。

所有XDR請求都是異步執(zhí)行的,不能用它來創(chuàng)建同比請求。

XDR對象也支持timeout屬性以及ontimeout事件處理程序。

為支持POST請求,XDR對象提供了contentType屬性,用來表示發(fā)送數(shù)據(jù)的格式。

(2)其他瀏覽器對CORS的實現(xiàn)

?? Firefox3.5+、Safair4+、Chrome、iSO版和Android平臺中的WebKit都通過XMLHttpRequest對象實現(xiàn)了對CORS的原生支持。

?? 要請求位于另一個域中的資源,使用標準的XHR對象并在open()方法中傳入決定URL即可。

(3)Preflighted Reqeusts

CORS通過一種叫做Preflighted Reqeusts的透明服務器驗證機制支持開發(fā)人員使用自定義的頭部GET或POST之外的方法,以及不同類型的主體內容。

(4)帶憑據(jù)的請求

??? 默認情況下,跨源請求不提供憑據(jù)(cookie、HTTP認證及客戶發(fā)頓SSL證明等)。通過將withCredentials屬性設置為true,可以指定某個請求應該發(fā)送憑據(jù))。

(5)跨瀏覽器的CORS

?? 檢測XHR是否支持CORS的最簡單方式,就是檢查是否存在withCredentials屬性。再結合檢測XdomainRequest對象是否存在,就可以兼顧所有瀏覽器了。

5、其他跨域技術

?? 利用DOM中能夠執(zhí)行跨域請求的功能,在不依賴XHR對象的情況下也能發(fā)送某種請求。

(1)圖像Ping

第一種跨域請求技術是使用<img>標簽。

通過圖像Ping,瀏覽器得不到任何具體的數(shù)據(jù),但通過監(jiān)聽load和error事件,它能知道響應是什么時候接收到的。

缺點:只能發(fā)送GET請求;無法訪問服務器的響應文本。

(2)JSONP

填充式JSON或參數(shù)式JSON,是應用JSON方法的一種新方法。

優(yōu)點:能夠直接訪問文本,支持瀏覽器與服務器之間的雙向通信。

缺點:JSONP是從其他域中加載代碼執(zhí)行的,可能不安全;要確定JSONP請求是否失敗并不容易。

(3)Comet

Ajax是一種從頁面向服務器請求數(shù)據(jù)的技術,而Comet則是一種服務器向頁面推送數(shù)據(jù)的技術。

有兩種實現(xiàn)Comet的方式:長輪詢和流。

輪詢的優(yōu)勢是所有瀏覽器都支持。

(4)服務器發(fā)送事件(SSE)

SSE API用于創(chuàng)建到服務器的單向連接,服務器通過這個連接可以發(fā)送任意數(shù)量的數(shù)據(jù)。

要預定新的事件流,首先要創(chuàng)建一個新的EventSource對象,并傳進一個入口點:

var source = new EventSource(“myevents.php”);

默認情況下,EventSource對象會保持與服務器的活動連接。如果想強制立即端來連接并且不再連接,可以調用close()方法。

(5)Web Sockets

Web Sockets的目標是在一個單獨的持久連接上提供全雙工、雙向通信。

使用標準的HTTP服務器無法實現(xiàn)Web Sockets,只有支持這種協(xié)議的專門服務器才能正常工作。

要創(chuàng)建Web Socket,先實例一個WebSocket對象并傳入要連接的URL:

??? var socket = new WebSocket(“ws://www.example.com/server.php”);

要關閉Web Socket連接,可以在任何時候調用close()方法。

??? socket.close();

Web Socket打開之后,就可以通過連接發(fā)送和接收數(shù)據(jù)。要向服務器發(fā)送數(shù)據(jù),使用send()方法。

Web Sockets只能通過連接發(fā)送純文本數(shù)據(jù),所以對于復雜的數(shù)據(jù)結構,在通過連接發(fā)送之前,必須進行序列化。

在服務器向客服端發(fā)來消息時,WebSocket對象就會觸發(fā)message事件。

6、安全

?為確保通過XHR訪問的URL安全,通行的做法就是驗證發(fā)送請求者是否有權訪問相應的資源。

?

第23章 離線應用與客戶端存儲

? 支持離線Web應用開發(fā)是HTML5的另一個重點。

? 開發(fā)離線Web應用需要幾個步驟:

首先是確保應用知道設備是否能上網;

然后,應用還必須能訪問一定的資源(圖像、JavaScript、CSS等);

最后,必須有一塊本地空間用于保存數(shù)據(jù)。

1、離線檢測

HTML5為此定義了一個navigator.onLine屬性,這個屬性值為true表示設備能上網,值為false表示設備離線。

為了更好地確定網絡是否可用,HTML還定義了兩個事件:online和offline。當網絡從離線變?yōu)樵诰€或者從在線變?yōu)殡x線時,分別觸發(fā)這兩個事件。

為了檢測應用是否離線,在頁面加載后,最好先通過navigator.onLine取得初始的狀態(tài)。然后,就是通過上述兩個事件來確定網絡連接狀態(tài)是否變化。

2、應用緩存

HTML5的應用緩存,簡稱為appcache。就是從瀏覽器的緩存中分出來的一塊緩存區(qū)。要想在這個緩存中保存數(shù)據(jù),可以使用一個描述文件(manifest file),列出要下載和緩存的資源。

要將描述文件與頁面關聯(lián)起來,可以在<htnl>中的manifest屬性中指定這個文件的路徑,如:

?? <html manifest=”/offline.manifest”>

應用緩存也有相應的JavaScript API讓你知道它都在做什么。這個API的核心是applicationCache對象,這個對象有一個status屬性,屬性的值是常量,表示應用緩存的如下當前狀態(tài):

??? 0?:無緩存。

??? 1:閑置。

??? 2:檢查中。

3:下載中。

4:更新完成。

5:廢棄。

?? 應用緩存還有很多相關是事件,表示其狀態(tài)的改變。有:checking、error、noupdate、downloading、progress、updateready、cached。

?? 一般來講,這些事件會隨著頁面加載按上述順序依次觸發(fā)。不過,通過調用update()方法也可以手工干預,讓應用緩存為檢查更新而觸發(fā)上述事件。

?

3、數(shù)據(jù)存儲

(1)Cookie

?? HTTP Cookie,通常直接叫做cookie,最初是在客戶端用于存儲會話信息的。

  • ?限制

cookie在性質上是綁定在特定的域名下的。

?? 由于cookie是存儲在客戶端計算機上的,還加入了一些限制確保cookie不會被惡意使用,同時不會占據(jù)太多磁盤空間。每個域的cookie總數(shù)是有限制的,不過瀏覽器之間個不相同。

?? 當超過單個域名限制之后還要再設置cookie,瀏覽器就會清楚之前設置的cookie。

?????? 瀏覽器中對cookie的尺寸也有限制。大多數(shù)瀏覽器都有大約4096B(加減1)的長度限制。

如果你嘗試創(chuàng)建超過最大尺寸限制的cookie,那么該cookie會被悄無聲息地丟掉。

  • cookie的構成

cookie由瀏覽器保存的以下幾塊信息構成:名稱、值、域、路徑、失效時間、安全標志。

  • JavaScript中的cookie

基本的cookie操作有三種:讀取、寫入和刪除。

(2)IE用戶數(shù)據(jù)

? 在IE5.0中,微軟通過一個自定義行為引入了持久化用戶數(shù)據(jù)的概念。

(3)Web存儲機制

Web Storage的目的是克服由cookie帶來的一些限制,當數(shù)據(jù)需要被嚴格控制在客戶端上時,無須持續(xù)地將數(shù)據(jù)發(fā)回服務器。

最初的Web Storage規(guī)范包含了兩種對象的定義:sessionStorage和globalStorage。

(4)IndexedB

??? IndexedB是一種類似SOL數(shù)據(jù)庫的結構化數(shù)據(jù)儲存機制。

轉載于:https://www.cnblogs.com/ww03/p/5277069.html

總結

以上是生活随笔為你收集整理的JavaScript高级程序设计-读书笔记(6)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。