1
2
3
4
5
|
if(window.localStorage){
alert('This browser supports localStorage');
}else{
alert('This browser does NOT support localStorage');
}
|
getItem //取記錄javascript
setIten//設置記錄css
removeItem//移除記錄html
key//取key所對應的值html5
clear//清除記錄java
存儲的內容:web
數組,圖片,json,樣式,腳本。。。(只要是能序列化成字符串的內容均可以存儲)ajax
1
2
3
4
|
<!
DOCTYPE
HTML>
<
html
manifest="demo.appcache">
...
</
html
>
|
manifest 文件是簡單的文本文件,它告知瀏覽器被緩存的內容(以及不緩存的內容)。sql
manifest 文件可分爲三個部分:數據庫
①CACHE MANIFEST - 在此標題下列出的文件將在首次下載後進行緩存json
②NETWORK - 在此標題下列出的文件須要與服務器的鏈接,且不會被緩存
③FALLBACK - 在此標題下列出的文件規定當頁面沒法訪問時的回退頁面(好比 404 頁面)
完整demo:
1
2
3
4
5
6
7
8
9
10
|
CACHE MANIFEST
# 2016-07-24 v1.0.0
/theme.css
/main.js
NETWORK:
login.jsp
FALLBACK:
/html/ /offline.html
|
服務器上:manifest文件須要配置正確的MIME-type,即 "text/cache-manifest"。
如Tomcat:
1
2
3
4
|
<
mime-mapping
>
<
extension
>manifest</
extension
>
<
mime-type
>text/cache-manifest</
mime-type
>
</
mime-mapping
>
|
經常使用API:
核心是applicationCache對象,有個status屬性,表示應用緩存的當前狀態:
0(UNCACHED) : 無緩存, 即沒有與頁面相關的應用緩存
1(IDLE) : 閒置,即應用緩存未獲得更新
2 (CHECKING) : 檢查中,即正在下載描述文件並檢查更新
3 (DOWNLOADING) : 下載中,即應用緩存正在下載描述文件中指定的資源
4 (UPDATEREADY) : 更新完成,全部資源都已下載完畢
5 (IDLE) : 廢棄,即應用緩存的描述文件已經不存在了,所以頁面沒法再訪問應用緩存
相關的事件:
表示應用緩存狀態的改變:
checking : 在瀏覽器爲應用緩存查找更新時觸發
error : 在檢查更新或下載資源期間發送錯誤時觸發
noupdate : 在檢查描述文件發現文件無變化時觸發
downloading : 在開始下載應用緩存資源時觸發
progress:在文件下載應用緩存的過程當中持續不斷地下載地觸發
updateready : 在頁面新的應用緩存下載完畢觸發
cached : 在應用緩存完整可用時觸發
Application Cache的三個優點:
① 離線瀏覽
② 提高頁面載入速度
③ 下降服務器壓力
1. 瀏覽器對緩存數據的容量限制可能不太同樣(某些瀏覽器設置的限制是每一個站點 5MB)
2. 若是manifest文件,或者內部列舉的某一個文件不能正常下載,整個更新過程將視爲失敗,瀏覽器繼續所有使用老的緩存
3. 引用manifest的html必須與manifest文件同源,在同一個域下
4. 瀏覽器會自動緩存引用manifest文件的HTML文件,這就致使若是改了HTML內容,也須要更新版本才能作到更新。
5. manifest文件中CACHE則與NETWORK,FALLBACK的位置順序沒有關係,若是是隱式聲明須要在最前面
6. FALLBACK中的資源必須和manifest文件同源
7. 更新完版本後,必須刷新一次纔會啓動新版本(會出現重刷一次頁面的狀況),須要添加監聽版本事件。
8. 站點中的其餘頁面即便沒有設置manifest屬性,請求的資源若是在緩存中也從緩存中訪問
9. 當manifest文件發生改變時,資源請求自己也會觸發更新
離線緩存與傳統瀏覽器緩存區別:
1. 離線緩存是針對整個應用,瀏覽器緩存是單個文件
2. 離線緩存斷網了仍是能夠打開頁面,瀏覽器緩存不行
3. 離線緩存能夠主動通知瀏覽器更新資源
核心方法:
①openDatabase:這個方法使用現有的數據庫或者新建的數據庫建立一個數據庫對象。
②transaction:這個方法讓咱們可以控制一個事務,以及基於這種狀況執行提交或者回滾。
③executeSql:這個方法用於執行實際的 SQL 查詢。
打開數據庫:
1
2
|
var db = openDatabase('mydb', '1.0', 'Test DB', 2 * 1024 * 1024,fn);
//openDatabase() 方法對應的五個參數分別爲:數據庫名稱、版本號、描述文本、數據庫大小、建立回調
|
1
2
3
4
|
var db = openDatabase('mydb', '1.0', 'Test DB', 2 * 1024 * 1024);
db.transaction(function (tx) {
tx.executeSql('CREATE TABLE IF NOT EXISTS WIN (id unique, name)');
});
|
插入數據:
1
2
3
4
5
6
|
var db = openDatabase('mydb', '1.0', 'Test DB', 2 * 1024 * 1024);
db.transaction(function (tx) {
tx.executeSql('CREATE TABLE IF NOT EXISTS WIN (id unique, name)');
tx.executeSql('INSERT INTO WIN (id, name) VALUES (1, "winty")');
tx.executeSql('INSERT INTO WIN (id, name) VALUES (2, "LuckyWinty")');
});
|
讀取數據:
1
2
3
4
5
6
7
8
9
10
11
12
|
db.transaction(function (tx) {
tx.executeSql('SELECT * FROM WIN', [], function (tx, results) {
var len = results.rows.length, i;
msg = "<
p
>查詢記錄條數: " + len + "</
p
>";
document.querySelector('#status').innerHTML += msg;
for (i = 0; i < len; i++){
alert(results.rows.item(i).name );
}
}, null);
});
|
由這些操做能夠看出,基本上都是用SQL語句進行數據庫的相關操做,若是你會MySQL的話,這個應該比較容易用。
1
2
3
4
5
6
|
function
closeDB(db){
db.close();
}
function
deleteDB(name){
indexedDB.deleteDatabase(name);
}
|
數據存儲:
indexedDB中沒有表的概念,而是objectStore,一個數據庫中能夠包含多個objectStore,objectStore是一個靈活的數據結構,能夠存放多種類型數據。也就是說一個objectStore至關於一張表,裏面存儲的每條數據和一個鍵相關聯。
咱們可使用每條記錄中的某個指定字段做爲鍵值(keyPath),也可使用自動生成的遞增數字做爲鍵值(keyGenerator),也能夠不指定。選擇鍵的類型不一樣,objectStore能夠存儲的數據結構也有差別。
這個就有點複雜了。看這裏的教程:
1.http://www.cnblogs.com/dolphinX/p/3415761.html