DIV CSS 佈局教程網

 DIV+CSS佈局教程網 >> 網頁腳本 >> JavaScript入門知識 >> JavaScript基礎知識 >> 浏覽器客戶端的數據存儲
浏覽器客戶端的數據存儲
編輯:JavaScript基礎知識     

屬於某個特定用戶的信息應該存在該用戶的機器上,無論是登錄信息、偏好設定或其他數據,這是一個很重要的用戶體驗,它避免了用戶重復多次的簡單操作。

一、Cookie

cookie 是原來的網景公司創造的。一份題為“Persistent Client State: HTTP Cookes”(持久客戶端狀態: HTTP Cookies ) 的標准中對cookie 機制進行了闡述。

cookie標准要求服務器對任意HTTP 請求發送Set-Cookie HTTP 頭作為響應的一部分,其中包含會話信息

過程:
1.設置cookie,發送至服務器端;
2.服務器對該請求發送帶有Set-Cookie 的HTTP響應給浏覽器;
3.浏覽器會存儲這樣的會話信息,並在這之後,通過為每個請求添加Cookie HTTP 頭將信息發送回服務器

cookie的限制

  • 域限制:浏覽器會存儲這樣的會話信息,並在這之後,通過為每個請求添加Cookie HTTP 頭將信
    息發送回服務器
  • 大小限制:大多數浏覽器都有大約4096B(加減1)的長度限制。為了最佳的浏覽器兼容性,最好將整個cookie 長度限制在4095B(含4095)以內
  • 個數限制:每個域的cookie 總數是有限的,不過浏覽器之間各有不同:
浏覽器 個數 IE7+ 50 Firefox 50 Opera 30 Safari 和Chrome 沒有硬性規定

cookie的構成
比如:

Set-Cookie: name=value; expires=Mon, 22-Jan-07 07:10:24 GMT; domain=.wrox.com;secure
  • name = value [必須參數]; 名值對,不區分大小寫,必須是URL 編碼
  • domain 設定cookie的有效域,所有向該域發送的請求中都會包含這個cookie 信息
  • path 指定cookie在有效域中的有效路徑,即使請求都是來自同一個域的,不是該鍵制定的路徑,也不會發送cookie
  • expires 表示cookie 何時應該被刪除的時間戳(這個值是個GMT 格式的日期),默認情況下,浏覽器會話結束時即將所有cookie 刪除
  • secure 指定後,cookie 只有在使用SSL 連接的時候才發送到服務器

js處理cookie
document.cookie 返回當前頁面可用的所有cookie的字符串,一系列由分號隔開的名值對兒。
cookie的操作無非是獲取、設置和刪除,我們把這三種方法封裝在一個var CookieUtil = {}對象中。分別對應其get,set,unset屬性。

cookie的name和value都是經過URL 編碼的,所以必須使用encodeURIComponent,decodeURIComponent()來編解碼。

1.get

    get: function (name){
        var cookieName = encodeURIComponent(name) + "=",
        cookieStart = document.cookie.indexOf(cookieName),
        cookieValue = null;
        if (cookieStart > -1){
            var cookieEnd = document.cookie.indexOf(";", cookieStart);
            if (cookieEnd == -1){
                cookieEnd = document.cookie.length;
            }
            cookieValue = decodeURIComponent(document.cookie.substring(cookieStart + cookieName.length, cookieEnd));
        }
        return cookieValue;
    }

2.set

    set: function (name, value, expires, path, domain, secure) {
        var cookieText = encodeURIComponent(name) + "=" +
        encodeURIComponent(value);
        if (expires instanceof Date) {
            cookieText += "; expires=" + expires.toGMTString();
        }
        if (path) {
            cookieText += "; path=" + path;
        }
        if (domain) {
            cookieText += "; domain=" + domain;
        }
        if (secure) {
            cookieText += "; secure";
        }
        document.cookie = cookieText;
    }

3.unset

    unset: function (name, path, domain, secure){
        this.set(name, "", new Date(0), path, domain, secure);
    }

子cookie

子cookie可以繞開浏覽器的單域名下的cookie 數限制。子cookie 是存放在單個cookie 中的更小段的數據。也就是使用cookie 值來存儲多個名稱值對,如:name=name1=value1&name2=value2&name3=value3&name4=value4&name5=value5

所有的cookie 都會由浏覽器作為請求頭發送,所以在cookie 中存儲大量信息會影響到特定域的請求性能。cookie 信息越大,完成對服務器請求的時間也就越長。盡管浏覽器對cookie 進行了大小限制,不過最好還是盡可能在cookie 中少存儲信息,以避免影響性能

二、IE用戶數據

在IE5.0 中,微軟通過一個自定義行為引入了持久化用戶數據的概念。用戶數據允許每個文檔最多
128KB 數據,每個域名最多1MB 數據。

使用

  • 使用CSS 在某個元素上指定userData 行為:

    <div style="behavior:url(#default#userData)" id="dataStore"></div>
  • 使用setAttribute()方法在上面保存數據

    dataStore.setAttribute("name", "Nicholas");
  • 調用save()方法保存數據,參數為數據空間名字,數據空間名字可以完全任意,僅用於區分不同的數據集

    dataStore.save("BookInfo");
  • 使用load()方法來獲取數據,參數為數據空間名字

    dataStore.load("BookInfo");
  • 使用removeAttribute()刪除數據,並使用save()保存修改

    dataStore.removeAttribute("name");
    dataStore.save("BookInfo");

限制

  • 同cookie,需要同域名,同路徑,並使用與進行存儲的腳本同樣的協議;
  • 無法將用戶數據訪問限制擴展到更多的客戶

用戶數據默認是可以跨越會話持久存在的,不會過期;數據需要通過removeAttribute()方法專門進行刪除以釋放空間。

三、web存儲機制——Web Storage

Web Storage 的目的是克服由cookie 帶來的一些限制,提供一種存儲大量可以跨會話的在cookie 之外的存儲會話數據的途徑。

Storage對象(以windows 對象屬性的形式存在)

  • sessionStorage對象
    存儲特定於某個會話的數據,該數據只保持到浏覽器關閉

  • globalStorage對象
    這個對象可以跨越會話存儲數據,但有特定的訪問限制。要使用globalStorage,首先要指定哪些域可以訪問該數據。可以通過方括號標記使用屬性來實現。如果不使用removeItem() 或者delete 刪除該對象, 或者用戶未清除浏覽器緩存, 存儲在globalStorage 屬性中的數據會一直保留在磁盤上。這讓globalStorage 非常適合在客戶端存儲文檔或者長期保存用戶偏好設置。

  • localStorage對象
    該對象在修訂過的HTML 5 規范中作為持久保存客戶端數據的方案取代了globalStorage。與globalStorage 不同,不能給localStorage 指定任何訪問規則;規則事先就設定好了。要訪問同一個localStorage 對象,頁面必須來自同一個域名(子域名無效),使用同一種協議,在同一個端口上。這相當於globalStorage[location.host]。
    同globalStorage對象一樣,localStorage對象數據保留到通過JavaScript 刪除或者是用戶清除浏覽器緩存。

浏覽器支持:
IE8+、Firefox 3.5+、Chrome 4+和Opera 10.5+

Storage對象方法:

  • clear(): 刪除所有值;Firefox 中沒有實現 。
  • getItem(name):根據指定的名字name 獲取對應的值。
  • key(index):獲得index 位置處的值的名字。
  • removeItem(name):刪除由name 指定的名值對兒。
  • setItem(name, value):為指定的name 設置一個對應的值。

Storage 類型只能存儲字符串。非字符串的數據在存儲之前會被轉換成字符串。

Storage對象事件
對Storage 對象進行任何修改,都會在文檔上觸發storage 事件。這個事件的event 對象有以下屬性:

  • domain:發生變化的存儲空間的域名。
  • key:設置或者刪除的鍵名。
  • newValue:如果是設置值,則是新值;如果是刪除鍵,則是null。
  • oldValue:鍵被更改之前的值。

數據操作
存儲數據:

    //使用屬性存儲數據
    sessionStorage/globalStorage["www.wrox.com"]/localStorage.name = "brand";
    //使用方法存儲數據
    sessionStorage/globalStorage["www.wrox.com"]/localStorage.setItem("name","brand");

讀取數據:

    //使用屬性存儲數據
    var name = sessionStorage/globalStorage["www.wrox.com"]/localStorage.name;
    //使用方法存儲數據
    var name = sessionStorage/globalStorage["www.wrox.com"]/localStorage.getItem(("name","brand");

刪除數據:

    sessionStorage/globalStorage["www.wrox.com"]/localStorage.removeItem("name")

限制
每個來源都有固定大小的空間用於保存自己的數據,一般限制在2.5M—5M左右。
參考書籍:《javascript高級程序設計》

XML學習教程| jQuery入門知識| AJAX入門| Dreamweaver教程| Fireworks入門知識| SEO技巧| SEO優化集錦|
Copyright © DIV+CSS佈局教程網 All Rights Reserved