摘要:離線應(yīng)用與客戶端存儲(chǔ)離線檢測(cè)定義了屬性來檢測(cè)設(shè)備是在線還是離線。應(yīng)用緩存還有很多相關(guān)的事件,表示其狀態(tài)的改變。
離線應(yīng)用與客戶端存儲(chǔ) 離線檢測(cè)
HTML5定義了navigator.onLine屬性來檢測(cè)設(shè)備是在線還是離線。這個(gè)屬性為true表示設(shè)備能上網(wǎng),值為false表示設(shè)備離線。這個(gè)屬性的關(guān)鍵是瀏覽器必須知道設(shè)備能否訪問網(wǎng)絡(luò),從而返回正確的值
不同瀏覽器之間有小差異
IE6+和Safari5+能夠正確檢測(cè)到網(wǎng)絡(luò)已經(jīng)斷開,并將navigator.onLine的值轉(zhuǎn)換為false
Firefox3+和Opera10.6+支持navigator.onLine屬性,但必須手工選中菜單項(xiàng)脫機(jī)工作才能讓瀏覽器正常工作
Chrome11以及之前版本始終將navigator.onLine屬性設(shè)置為true
為了更好確定網(wǎng)絡(luò)是否可用,HTML5還定義了兩個(gè)事件onLine和offLine。當(dāng)網(wǎng)絡(luò)從離線變?yōu)樵诰€或者從在線變?yōu)殡x線時(shí),分別觸發(fā)這兩個(gè)事件
EventUtil.addHandler(window, "online", function(){ alert("Online"); }); EventUtil.addHandler(window, "offline", function(){ alert("Offline"); });應(yīng)用緩存
applicationCache 對(duì)象,status屬性,屬性的值是常量,表示應(yīng)用緩存的如下當(dāng)前狀態(tài)。
0,無緩存,即沒有與頁面相關(guān)的應(yīng)用緩存。
1,閑置,即應(yīng)用緩存未得到更新。
2,檢查中,即正在下載描述文件并檢查更新。
3,下載中,即應(yīng)用緩存正在下載描述文件中指定的資源。
4,更新完成,即應(yīng)用緩存已經(jīng)更新了資源,而且所有資源都已下載完畢,可以通過 swapCache()來使用了。
5,廢棄,即應(yīng)用緩存的描述文件已經(jīng)不存在了,因此頁面無法再訪問應(yīng)用緩存。
應(yīng)用緩存還有很多相關(guān)的事件,表示其狀態(tài)的改變。以下是這些事件。
checking,在瀏覽器為應(yīng)用緩存查找更新時(shí)觸發(fā)。
error,在檢查更新或下載資源期間發(fā)生錯(cuò)誤時(shí)觸發(fā)。
noupdate,在檢查描述文件發(fā)現(xiàn)文件無變化時(shí)觸發(fā)。
downloading,在開始下載應(yīng)用緩存資源時(shí)觸發(fā)。
progress,在文件下載應(yīng)用緩存的過程中持續(xù)不斷地觸發(fā)。
updateready,在頁面新的應(yīng)用緩存下載完畢且可以通過 swapCache() 使用時(shí)觸發(fā)。
cached,在應(yīng)用緩存完整可用時(shí)觸發(fā)。
數(shù)據(jù)存儲(chǔ) Cookiecookie在性質(zhì)上是綁定在特定的域名下的。當(dāng)設(shè)定了一個(gè)cookie后,再給創(chuàng)建它的域名發(fā)送請(qǐng)求時(shí)都會(huì)包含這個(gè)cookie。這個(gè)限制確保了儲(chǔ)存在cookie中的信息只能讓批準(zhǔn)的接受者訪問,而無法被其他域訪問
cookie由瀏覽器保存的幾部分組成
名稱,一個(gè)唯一確定 cookie 的名稱。cookie 名稱是不區(qū)分大小寫的,所以 myCookie 和 MyCookie被認(rèn)為是同一個(gè) cookie。然而,實(shí)踐中最好將 cookie 名稱看作是區(qū)分大小寫的,因?yàn)槟承┓?wù)器會(huì)這樣處理 cookie。cookie 的名稱必須是經(jīng)過 URL 編碼的。
值,儲(chǔ)存在 cookie 中的字符串值。值必須被 URL 編碼。
域,cookie 對(duì)于哪個(gè)域是有效的。所有向該域發(fā)送的請(qǐng)求中都會(huì)包含這個(gè) cookie 信息。這個(gè)值可以包含子域(subdomain,如 www.wrox.com ),也可以不包含它(如. wrox.com ,則對(duì)于wrox.com的所有子域都有效)。如果沒有明確設(shè)定,那么這個(gè)域會(huì)被認(rèn)作來自設(shè)置 cookie 的那個(gè)域。
路徑,對(duì)于指定域中的那個(gè)路徑,應(yīng)該向服務(wù)器發(fā)送 cookie。例如,你可以指定 cookie 只有從http://www.wrox.com/books/ 中才能訪問,那么 http://www.wrox.com 的頁面就不會(huì)發(fā)
送 cookie 信息,即使請(qǐng)求都是來自同一個(gè)域的。
失效時(shí)間,表示 cookie 何時(shí)應(yīng)該被刪除的時(shí)間戳(也就是,何時(shí)應(yīng)該停止向服務(wù)器發(fā)送這個(gè)cookie)。默認(rèn)情況下,瀏覽器會(huì)話結(jié)束時(shí)即將所有 cookie 刪除;不過也可以自己設(shè)置刪除時(shí)間。這個(gè)值是個(gè) GMT 格式的日期(Wdy, DD-Mon-YYYY HH:MM:SS GMT),用于指定應(yīng)該刪除cookie 的準(zhǔn)確時(shí)間。因此,cookie 可在瀏覽器關(guān)閉后依然保存在用戶的機(jī)器上。如果你設(shè)置的失效日期是個(gè)以前的時(shí)間,則 cookie 會(huì)被立刻刪除。
安全標(biāo)志,指定后,cookie 只有在使用 SSL 連接的時(shí)候才發(fā)送到服務(wù)器。例如,cookie 信息只能發(fā)送給https://www.wrox.com ,而 http://www.wrox.com 的請(qǐng)求則不能發(fā)送 cookie。
基本的cookie操作有3種:讀取、寫入和刪除
//設(shè)置 cookie CookieUtil.set("name", "Nicholas"); CookieUtil.set("book", "Professional JavaScript"); //讀取 cookie 的值 alert(CookieUtil.get("name")); //"Nicholas" alert(CookieUtil.get("book")); //"Professional JavaScript" //刪除 cookie CookieUtil.unset("name"); CookieUtil.unset("book") //設(shè)置 cookie,包括它的路徑、域、失效日期 CookieUtil.set("name", "Nicholas", "/books/projs/", "www.wrox.com", new Date("January 1, 2010")); //刪除剛剛設(shè)置的 cookie CookieUtil.unset("name", "/books/projs/", "www.wrox.com"); //設(shè)置安全的 cookie CookieUtil.set("name", "Nicholas", null, null, null, true);
確保刪除cookie
//設(shè)置 cookie CookieUtil.set("name", "Nicholas"); CookieUtil.set("book", "Professional JavaScript"); //讀取 cookie 的值 alert(CookieUtil.get("name")); //"Nicholas" alert(CookieUtil.get("book")); //"Professional JavaScript" //刪除 cookie CookieUtil.unset("name"); CookieUtil.unset("book") //設(shè)置 cookie,包括它的路徑、域、失效日期 CookieUtil.set("name", "Nicholas", "/books/projs/", "www.wrox.com", new Date("January 1, 2010")); //刪除剛剛設(shè)置的 cookie CookieUtil.unset("name", "/books/projs/", "www.wrox.com"); //設(shè)置安全的 cookie CookieUtil.set("name", "Nicholas", null, null, null, true);
子cookie一般以查詢字符串的格式進(jìn)行格式化。然后這些值可以使用單個(gè)cookie進(jìn)行存儲(chǔ)和訪問,而非對(duì)每個(gè)名稱-值對(duì)兒使用不同的cookie存儲(chǔ)
要獲得一個(gè)子cookie,首先要遵循與獲得cookie一樣的基本步驟,但是在解碼cookie值之前,需要按下面方法找出子cookie信息
var SubCookieUtil = { get: function (name, subName){ var subCookies = this.getAll(name); if (subCookies){ return subCookies[subName]; } else { return null; } }, getAll: function(name){ var cookieName = encodeURIComponent(name) + "=", cookieStart = document.cookie.indexOf(cookieName), cookieValue = null, cookieEnd, subCookies, i, parts, result = {}; if (cookieStart > -1){ cookieEnd = document.cookie.indexOf(";", cookieStart); if (cookieEnd == -1){ cookieEnd = document.cookie.length; } cookieValue = document.cookie.substring(cookieStart + cookieName.length, cookieEnd); if (cookieValue.length > 0){ subCookies = cookieValue.split("&"); for (i=0, len=subCookies.length; i < len; i++){ parts = subCookies[i].split("="); result[decodeURIComponent(parts[0])] = decodeURIComponent(parts[1]); } return result; } } return null; }, //省略了更多代碼 };
要設(shè)置子cookie,也有兩種方法set()和setAll()
var SubCookieUtil = { set: function (name, subName, value, expires, path, domain, secure) { var subcookies = this.getAll(name) || {}; subcookies[subName] = value; this.setAll(name, subcookies, expires, path, domain, secure); }, setAll: function(name, subcookies, expires, path, domain, secure){ var cookieText = encodeURIComponent(name) + "=", subcookieParts = new Array(), subName; for (subName in subcookies){ if (subName.length > 0 && subcookies.hasOwnProperty(subName)){ subcookieParts.push(encodeURIComponent(subName) + "=" + encodeURIComponent(subcookies[subName])); } } if (cookieParts.length > 0){ cookieText += subcookieParts.join("&"); if (expires instanceof Date) { cookieText += "; expires=" + expires.toGMTString(); } if (path) { cookieText += "; path=" + path; } if (domain) { cookieText += "; domain=" + domain; } if (secure) { cookieText += "; secure"; } } else { cookieText += "; expires=" + (new Date(0)).toGMTString(); } document.cookie = cookieText; }, //省略了更多代碼 };
為了刪除一個(gè)子cookie,首先必須獲得包含在某個(gè)cookie中的所有子cookie,然后僅刪除需要?jiǎng)h除的那個(gè)子cookie,然后再將余下的子cookie的值保存為cookie的值
var SubCookieUtil = { //這里省略了更多代碼 unset: function (name, subName, path, domain, secure){ var subcookies = this.getAll(name); if (subcookies){ delete subcookies[subName]; this.setAll(name, subcookies, null, path, domain, secure); } }, unsetAll: function(name, path, domain, secure){ this.setAll(name, null, new Date(0), path, domain, secure); } };IE用戶數(shù)據(jù)
一旦元素使用了userData行為,那么就可以使用setAttribute()方法在上面保存數(shù)據(jù)了,為了將數(shù)據(jù)提交到瀏覽器緩存中,還必須調(diào)用save()方法,并告訴它要保存的數(shù)據(jù)空間的名字
var dataStore = document.getElementById("dataStore"); dataStore.setAttribute("name", "Nicholas"); dataStore.setAttribute("book", "Professional JavaScript"); dataStore.save("BookInfo")Web存儲(chǔ)機(jī)制 Storage類型
Storage的實(shí)例與其他對(duì)象類似
clear(),刪除所有值,F(xiàn)irefox中沒有實(shí)現(xiàn)
getItem(name),根據(jù)指定的名字name獲取對(duì)應(yīng)的值
key(index),獲得index位置處的值的名字
removeItem(name),刪除由name指定的名值對(duì)兒
setItem(name,value),為指定的name設(shè)置一個(gè)對(duì)應(yīng)的值
sessionStorage對(duì)象
可以使用setItem()或者直接設(shè)置新的屬性類存儲(chǔ)數(shù)據(jù)
//使用方法存儲(chǔ)數(shù)據(jù) sessionStorage.setItem("name", "Nicholas"); //使用屬性存儲(chǔ)數(shù)據(jù) sessionStorage.book = "Professional JavaScript";
sessionStroage中有數(shù)據(jù)時(shí),可以使用getItem()或者通過直接訪問屬性名來獲取數(shù)據(jù)
//使用方法讀取數(shù)據(jù) var name = sessionStorage.getItem("name"); //使用屬性讀取數(shù)據(jù) var book = sessionStorage.book;globalStorage對(duì)象
可以通過方括號(hào)標(biāo)記使用屬性來實(shí)現(xiàn)
//保存數(shù)據(jù) globalStorage["wrox.com"].name = "Nicholas"; //獲取數(shù)據(jù) var name = globalStorage["wrox.com"].name;localStorage對(duì)象
可以像使用sessionStorage一樣來使用
//使用方法存儲(chǔ)數(shù)據(jù) localStorage.setItem("name", "Nicholas"); //使用屬性存儲(chǔ)數(shù)據(jù) localStorage.book = "Professional JavaScript"; //使用方法讀取數(shù)據(jù) var name = localStorage.getItem("name"); //使用屬性讀取數(shù)據(jù) var book = localStorage.book;storage事件
對(duì)Storage對(duì)象進(jìn)行任何修改,都會(huì)在文檔上觸發(fā)storage事件,當(dāng)通過屬性或setItem()方法保存數(shù)據(jù),使用delete操作符或removeItem()刪除數(shù)據(jù),或者調(diào)用clear()方法時(shí),都會(huì)發(fā)生這個(gè)事件,這個(gè)事件的event對(duì)象有以下屬性
domain,發(fā)生變化的存儲(chǔ)空間的域名
key,設(shè)置或者刪除的鍵名
newValue,如果是設(shè)置值,則是新值,如果嘶吼刪除鍵,則是null
oldValue,鍵被更改之前的值
IndexedDB 數(shù)據(jù)庫IndexedDB最大的特色就是使用對(duì)象保存數(shù)據(jù),而不是使用表來保存數(shù)據(jù)
使用IndexedDB第一步是打開它,將要打開的數(shù)據(jù)庫名傳給indexedDB.open()。如果傳入的數(shù)據(jù)庫已經(jīng)存在,就會(huì)發(fā)送一個(gè)打開它的請(qǐng)求,如果傳入的數(shù)據(jù)庫不存在,就發(fā)送一個(gè)創(chuàng)建并打開它的請(qǐng)求
var request, database; request = indexedDB.open("admin"); request.onerror = function(event){ alert("Something bad happened while trying to open: " + event.target.errorCode); }; request.onsuccess = function(event){ database = event.target.result; }
可能的錯(cuò)誤碼
IDBDatabaseException.UNKNOWN_ERR (1),意外錯(cuò)誤,無法歸類。
IDBDatabaseException.NON_TRANSIENT_ERR (2),操作不合法。
IDBDatabaseException.NOT_FOUND_ERR (3),未發(fā)現(xiàn)要操作的數(shù)據(jù)庫。
IDBDatabaseException.CONSTRAINT_ERR (4),違反了數(shù)據(jù)庫約束。
IDBDatabaseException.DATA_ERR (5),提供給事務(wù)的數(shù)據(jù)不能滿足要求。
IDBDatabaseException.NOT_ALLOWED_ERR (6),操作不合法。
IDBDatabaseException.TRANSACTION_INACTIVE_ERR (7),試圖重用已完成的事務(wù)。
IDBDatabaseException.ABORT_ERR (8),請(qǐng)求中斷,未成功。
IDBDatabaseException.READ_ONLY_ERR (9),試圖在只讀模式下寫入或修改數(shù)據(jù)。
IDBDatabaseException.TIMEOUT_ERR (10),在有效時(shí)間內(nèi)未完成操作。
IDBDatabaseException.QUOTA_ERR (11),磁盤空間不足
IndexedDB沒有版本號(hào),一開始為數(shù)據(jù)庫指定一個(gè)版本號(hào),可以調(diào)用setVersion()方法,傳入以字符串形式表示的版本號(hào)
if (database.version != "1.0"){ request = database.setVersion("1.0"); request.onerror = function(event){ alert("Something bad happened while trying to set version: " + event.target.errorCode); }; request.onsuccess = function(event){ alert("Database initialization complete. Database name: " + database.name + ", Version: " + database.version); }; } else { alert("Database already initialized. Database name: " + database.name + ", Version: " + database.version); }對(duì)象存儲(chǔ)空間
如果想驗(yàn)證請(qǐng)求是否成功完成,可以把返回的請(qǐng)求對(duì)象保存在一個(gè)變量中,然后再指定onerror或onsuccess事件處理程序
//users 中保存著一批用戶對(duì)象 var i=0, request, requests = [], len = users.length; while(i < len){ request = store.add(users[i++]); request.onerror = function(){ // 處理錯(cuò)誤 }; request.onsuccess = function(){ // 處理成功 }; requests.push(request); }事務(wù)
事務(wù)對(duì)象本身也有事件處理程序:onerror和oncomplete
transaction.onerror = function(event){ //整個(gè)事務(wù)都被取消了 }; transaction.oncomplete = function(event){ //整個(gè)事務(wù)都成功完成了 };使用游標(biāo)查詢
實(shí)例有幾個(gè)屬性
direction,數(shù)值,表示游標(biāo)移動(dòng)的方向。默認(rèn)值為 IDBCursor.NEXT (0),表示下一項(xiàng)。IDBCursor.NEXT_NO_DUPLICATE (1)表示下一個(gè)不重復(fù)的項(xiàng), IDBCursor.PREV (2)表示前一項(xiàng),而 IDBCursor.PREV_NO_DUPLICATE 表示前一個(gè)不重復(fù)的項(xiàng)。
key,對(duì)象的鍵。
value,實(shí)際的對(duì)象。
primaryKey,游標(biāo)使用的鍵??赡苁菍?duì)象鍵,也可能是索引鍵
調(diào)用update()方法可以指定的對(duì)象更新當(dāng)前游標(biāo)的value,與其他操作一樣,調(diào)用update()方法也會(huì)創(chuàng)建一個(gè)新的請(qǐng)求
request.onsuccess = function(event){ var cursor = event.target.result, value, updateRequest; if (cursor){ //必須要檢查 if (cursor.key == "foo"){ value = cursor.value; // 取得當(dāng)前的值 value.password = "magic!"; // 更新密碼 updateRequest = cursor.update(value); // 請(qǐng)求保存更新 updateRequest.onsuccess = function(){ // 處理成功 }; updateReqeust.onerror = function(){ // 處理失敗 }; } } };
調(diào)用delete()方法,會(huì)刪除相應(yīng)的記錄
request.onsuccess = function(event){ var cursor = event.target.result, value, deleteRequest; if (cursor){ //必須要檢查 if (cursor.key == "foo"){ deleteRequest = cursor.delete(); // 請(qǐng)求刪除當(dāng)前項(xiàng) deleteRequest.onsuccess = function(){ // 處理成功 }; deleteRequest.onerror = function(){ // 處理失敗 }; } } };
默認(rèn)情況下,每個(gè)游標(biāo)只發(fā)起一次請(qǐng)求,要想發(fā)起另一次請(qǐng)求,必須調(diào)用下面的方法
continue(key),移動(dòng)到結(jié)果集中的下一項(xiàng)。參數(shù) key 是可選的,不指定這個(gè)參數(shù),游標(biāo)移動(dòng)到下一項(xiàng);指定這個(gè)參數(shù),游標(biāo)會(huì)移動(dòng)到指定鍵的位置。
advance(count),向前移動(dòng) count 指定的項(xiàng)數(shù)。
鍵范圍
先聲明一個(gè)本地的類型
var IDBKeyRange = window.IDBKeyRange || window.webkitIDBKeyRange;
四種方式
使用only()方法
var onlyRange = IDBKeyRange.only("007");
指定結(jié)果集的下界
//從鍵為"007"的對(duì)象開始,然后可以移動(dòng)到最后 var lowerRange = IDBKeyRange.lowerBound("007"); //如果你想忽略鍵為 "007" 的對(duì)象,從它的下一個(gè)對(duì)象開始,那么可以傳入第二個(gè)參數(shù) true //從鍵為"007"的對(duì)象的下一個(gè)對(duì)象開始,然后可以移動(dòng)到最后 var lowerRange = IDBKeyRange.lowerBound("007", true);
指定結(jié)果集的上界
//從頭開始,到鍵為"ace"的對(duì)象為止 var upperRange = IDBKeyRange.upperBound("ace"); //如果你不想包含鍵為指定值的對(duì)象,同樣,傳入第二個(gè)參數(shù) true //從頭開始,到鍵為"ace"的對(duì)象的上一個(gè)對(duì)象為止 var upperRange = IDBKeyRange.upperBound("ace", true);
同時(shí)指定結(jié)果集的上界下界。這個(gè)方法接收4個(gè)參數(shù):表示下界的鍵、表示上界的鍵、可選的表示是否跳過下界的布爾值、可選的表示是否跳過上界的布爾值
//從鍵為"007"的對(duì)象開始,到鍵為"ace"的對(duì)象為止 var boundRange = IDBKeyRange.bound("007", "ace"); //從鍵為"007"的對(duì)象的下一個(gè)對(duì)象開始,到鍵為"ace"的對(duì)象為止 var boundRange = IDBKeyRange.bound("007", "ace", true); //從鍵為"007"的對(duì)象的下一個(gè)對(duì)象開始,到鍵為"ace"的對(duì)象的上一個(gè)對(duì)象為止 var boundRange = IDBKeyRange.bound("007", "ace", true, true); //從鍵為"007"的對(duì)象開始,到鍵為"ace"的對(duì)象的上一個(gè)對(duì)象為止 var boundRange = IDBKeyRange.bound("007", "ace", false, true)索引
要?jiǎng)?chuàng)建索引,首先引用對(duì)象存儲(chǔ)空間,然后調(diào)用createIndex()方法
var store = db.transaction("users").objectStore("users"), index = store.createIndex("username", "username", { unique: false });
索引上調(diào)用openCursor()方法可以創(chuàng)建新的游標(biāo),除了將來會(huì)把索引鍵而非主鍵保存在event.result.key屬性中之外,這個(gè)游標(biāo)與在對(duì)象存儲(chǔ)空間上調(diào)用openCursor()返回的游標(biāo)完全一樣
var store = db.transaction("users").objectStore("users"), index = store.index("username"), request = index.openCursor(); request.onsuccess = function(event){ //處理成功 };
索引上也能創(chuàng)建一個(gè)特殊的只返回每條記錄主鍵的游標(biāo),調(diào)用openKeyCursor()方法,這個(gè)方法接收的參數(shù)與openCursor()相同
var store = db.transaction("users").objectStore("users"), index = store.index("username"), request = index.openKeyCursor(); request.onsuccess = function(event){ //處理成功 // event.result.key 中保存索引鍵,而 event.result.value 中保存主鍵 };
使用get()方法能夠從索引中取得一個(gè)對(duì)象
var store = db.transaction("users").objectStore("users"), index = store.index("username"), request = index.get("007"); request.onsuccess = function(event){ //處理成功 }; request.onerror = function(event){ //處理失敗 };
要根據(jù)給定的索引鍵取得主鍵,可以使用getKey()方法
var store = db.transaction("users").objectStore("users"), index = store.index("username"), request = index.getKey("007"); request.onsuccess = function(event){ //處理成功 //event.result.key 中保存索引鍵,而 event.result.value 中保存主鍵 }
通過IDBIndex對(duì)象的屬性可以獲得有關(guān)索引的相關(guān)信息
name,索引的名字
keyPath,傳入createIndex()中的屬性路徑
objectStore,索引的對(duì)象存儲(chǔ)空間
unique,表示索引鍵是否唯一的布爾值
下面代碼可以知道根據(jù)存儲(chǔ)的對(duì)象建立了哪些索引
var store = db.transaction("users").objectStore("users"), indexNames = store.indexNames, index, i = 0, len = indexNames.length; while(i < len){ index = store.index(indexNames[i++]); console.log("Index name: " + index.name + ", KeyPath: " + index.keyPath + ", Unique: " + index.unique); }并發(fā)問題
剛打開數(shù)據(jù)庫時(shí),要記著指定 onversionchange 事件處理程序。當(dāng)同一個(gè)來源的另一個(gè)標(biāo)簽頁調(diào)
用 setVersion() 時(shí),就會(huì)執(zhí)行這個(gè)回調(diào)函數(shù)。處理這個(gè)事件的最佳方式是立即關(guān)閉數(shù)據(jù)庫,從而保證
版本更新順利完成
var request, database; request = indexedDB.open("admin"); request.onsuccess = function(event){ database = event.target.result; database.onversionchange = function(){ database.close(); }; }限制
IndexedDB數(shù)據(jù)庫只能由同源頁面操作,因此不能跨域共享信息
每個(gè)來源的數(shù)據(jù)庫占用的磁盤空間有限制
不允許本地文件訪問IndexedDB
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/98195.html
摘要:應(yīng)用緩存的應(yīng)用緩存,或者簡稱為,是專門為開發(fā)離線應(yīng)用而設(shè)計(jì)的。應(yīng)用緩存還有很多相關(guān)的事件,表示其狀態(tài)的改變。數(shù)據(jù)存儲(chǔ),通常直接叫做,最初是在客戶端用于存儲(chǔ)會(huì)話信息的。也就是使用值來存儲(chǔ)多個(gè)名稱值對(duì)兒。 所謂Web離線應(yīng)用,就是在設(shè)備不能上網(wǎng)的情況下仍然可以運(yùn)行的應(yīng)用。開發(fā)離線Web應(yīng)用需要幾個(gè)步驟:(1)確保應(yīng)用知道設(shè)備是否能上網(wǎng);(2)應(yīng)用還必須能訪問一定的資源(圖像、JavaScr...
摘要:離線檢測(cè)含義設(shè)備能否上網(wǎng)代碼注和,和最新的沒問題應(yīng)用緩存緩存的目的是專門為網(wǎng)頁離線設(shè)計(jì)的,當(dāng)然在在線情況也會(huì)緩存機(jī)制當(dāng)用戶在地址輸入請(qǐng)求的地址去請(qǐng)求網(wǎng)頁時(shí),瀏覽器會(huì)先本地緩存中查看是否有對(duì)應(yīng)的緩存文件,如果有然后查看新鮮度就是是否過期了,如 23.1 離線檢測(cè) 含義:設(shè)備能否上網(wǎng) 代碼: navigator.onLine 注:IE6+和safari+5,firefox3+和ope...
摘要:基本概念語法區(qū)分大小寫,中的一切變量函數(shù)名和操作符都區(qū)分大小寫。要將一個(gè)值轉(zhuǎn)換成對(duì)應(yīng)的值,可以調(diào)用類型包括整數(shù)和浮點(diǎn)數(shù)值,基本數(shù)值字面量格式是十進(jìn)制整數(shù),除了十進(jìn)制外還有八進(jìn)制十六進(jìn)制。八進(jìn)制第一位必須是,十六進(jìn)制第一位必須是。 基本概念 語法 區(qū)分大小寫,ECMAScript中的一切(變量、函數(shù)名和操作符)都區(qū)分大小寫。函數(shù)名不能使用typeof,因?yàn)樗且粋€(gè)關(guān)鍵字,但typeOf...
閱讀 1605·2019-08-30 13:18
閱讀 1586·2019-08-29 12:19
閱讀 2129·2019-08-26 13:57
閱讀 4153·2019-08-26 13:22
閱讀 1197·2019-08-26 10:35
閱讀 2999·2019-08-23 18:09
閱讀 2520·2019-08-23 17:19
閱讀 691·2019-08-23 17:18