HTML 5中的存储及离线应用(三)

最后我们来看一下Indexed DB。


  1. Indexed DB使用Key-Value的数据库存储;
  2. 被Firefox4/Chrome 11以上支持;
  3. 限制较多;

好吧,由于不支持“file://”URL我放弃了,目前看起来还是一个toy而已,真的不是很好用,代码简单看一下。。。

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">

<!-- 
    indexedDB.html by Bill Weinman 
    <http://bw.org/contact/>
    created 2011-04-16

    Copyright (c) 2011 The BearHeart Group, LLC
    This file may be used for personal educational purposes as needed. 
    Use for other purposes is granted provided that this notice is
    retained and any changes made are clearly indicated as such. 
-->

<head>
    <title>
        indexedDB storage example
    </title>
    <link rel="stylesheet" type="text/css" href="../CSS/main.css">
    <script language="javascript" src="../Javascript/bwH5LS.js"></script>
    <script language="javascript">
        var db;
        var dbVersion = '1.0';
        openDB();

        // Check if this browser supports indexedDB
        function getIndexedDB() {
            try {
                if( ! window.indexedDB ) window.indexedDB = window.mozIndexedDB || window.webkitIndexedDB;
                if( !! window.indexedDB ) return window.indexedDB;
                else return undefined;
            } catch(e) {
                return undefined;
            }
        }

        // global error handler for indexedDB
        function dbErrorHandler(event) {
            dispError( 'Database error: ' + event.target.errorCode );
        }

        function openDB () {
            var iDB = getIndexedDB();
            if(!iDB) {
                dispError('IndexedDB not supported.');
                return;
            } else {
                try {
                    var request = iDB.open('travelDB', 'demo travel database');
                    request.onerror = function(event) { errorDisplay('Failed to open IndexedDB database.'); }
                    request.onsuccess = function(event) {
                        db = request.result;    // set the global db variable
                        db.onerror = dbErrorHandler;
                        if(db.version != dbVersion) {
                            var vReq = db.setVersion(dbVersion);
                            vReq.onerror = function(event) { alert('version error: ' + event.target.errorCode); }
                            vReq.onsuccess = function(event) {
                                alert('Creating the object store');
                                var objectStore = db.createObjectStore('oTravel', { keyPath: 'id', autoIncrement: true });
                                objectStore.createIndex('traveler', 'ciTraveler', { unique: false });
                            }
                        }
                    }
                } catch(e) {
                    dispError( 'Browser supports IndexedDB but didn\'t open the database. (' + e.message + ')');
                }
            }
        }

        // Create the Edit and Delete buttons for a row
        function rowButtons( id, traveler ) {
            return '<form><input type="button" value="Edit" onClick="javascript:editGo(' + id + ')"/>' +
                '<input type="button" value="Delete" onClick="javascript:deleteGo(' + id + ', "' + traveler + '")"/></form>';
        }

        // sometimes the database takes a moment to open
        // provides a retry for the dispResults() function
        var retryCount = 0;
        function retryDisp() {
            if( ++retryCount > 5 ) {
                errorDisp('Cannot open the database after 5 retries');
                dispResults();
            }
            setTimeout('dispResults()', 100);
        }

        // Main display function
        function dispResults() {
            if(errorMessage) {
                element('results').innerHTML = errorMessage;
                return;
            }

            if(db) {
                var bwt = new bwTable();
                bwt.setHeader(['Traveler', 'Destination', 'Transportation', '']);
                var count = 0;
                var objectStore = db.transaction(['oTravel']).objectStore('oTravel');
                var indexTraveler = objectStore.index("traveler");
                indexTraveler.openCursor().onsuccess = function(event) {
                    var cursor = event.target.result;
                    if(cursor) {
                        var v = cursor.value;
                        bwt.addRow([v.traveler, v.destination, v.transportation, rowButtons(v.id, v.traveler)]);
                        count++;
                        cursor.continue();
                    } else {    // the cursor is done
                        element('rowCount').innerHTML = count;
                        element('results').innerHTML = bwt.getTableHTML();
                        element('travelForm').elements['traveler'].focus();
                    }
                }
            } else { 
                // There's been no error, so the databaes is probably still opening
                retryDisp();
            }
        }

        // add or update rows in the table
        function dbGo() {
            if(errorMessage) return;
            var f = element('travelForm');
            var action = f.elements['inputAction'].value;
            var traveler = f.elements['traveler'].value;
            var destination = f.elements['destination'].value;
            var transportation = f.elements['transportation'].value;
            var key = f.elements['key'].value;

            switch(action) {
            case 'add': 
                if(! (traveler || destination || transportation)) break;
                curRec = { traveler: traveler, destination: destination, transportation: transportation,
                    ciTraveler: traveler.toLowerCase() };
                db.transaction(['oTravel'], IDBTransaction.READ_WRITE).objectStore('oTravel').add(curRec);
                break;
            case 'update':
                if(! (traveler || destination || transportation)) break;
                curRec = { traveler: traveler, destination: destination, transportation: transportation,
                    ciTraveler: traveler.toLowerCase() };
                var objectStore = db.transaction("oTravel", IDBTransaction.READ_WRITE).objectStore("oTravel");
                objectStore.delete(key).onsuccess = function(event) {
                    objectStore.add(curRec);
                };
                break;
            }
            resetTravelForm();
            dispResults();
        }

        // update the edited row
        function editGo(id) {
            db.transaction("oTravel").objectStore("oTravel").get(id).onsuccess = function(event) {
                rec = event.target.result;
                if(rec) {
                    var f = element('travelForm');
                    f.elements['traveler'].value = rec.traveler;
                    f.elements['destination'].value = rec.destination;
                    f.elements['transportation'].value = rec.transportation;
                    f.elements['goButton'].value = 'Update';
                    f.elements['inputAction'].value = 'update';
                    f.elements['key'].value = rec.id;
                    f.elements['traveler'].focus();
                    f.elements['traveler'].select();
                }
            }
        }

        // confirm and delete a row
        function deleteGo(id, traveler) {
            if(confirm('Delete ' + traveler + ' (ID: ' + id + ')?')) {
                db.transaction("oTravel", IDBTransaction.READ_WRITE).objectStore("oTravel").delete(id);
                resetTravelForm();
                dispResults();
            }
        }

        // clear all the form fields and reset the button and action elements
        function resetTravelForm() {
            var f = element('travelForm');
            for( var n in [ 'traveler', 'destination', 'transportation', 'key' ] ) {
                f.elements[n].value = '';
            }
            f.elements['inputAction'].value = 'add';
            f.elements['goButton'].value = 'Add';
        }

        // delete all the recs in the store
        function clearDB() {
            if(confirm('Clear the entire table?')) {
                db.transaction("oTravel", IDBTransaction.READ_WRITE).objectStore("oTravel").clear();
                resetTravelForm();
                dispResults();
            }
        }

        function initDisp() {
            dispResults();
        }

        window.onload = function() {
            initDisp();
        }
    </script>
</head>

<body>

<div id="content">

    <h1> 
        indexedDB storage example
    </h1>
    
    <div id="form">
        <form id="travelForm">
            <table class="form">
                <tr><td class="label"> Traveler </td><td> <input type="text" name="traveler" /> </td></tr>
                <tr><td class="label"> Destination </td><td> <input type="text" name="destination" /> </td></tr>
                <tr><td class="label"> Transportation </td><td> <input type="text" name="transportation" /> </td></tr>
                <tr><td colspan="2" class="button">
                    <input id="formSubmit" type="button" name="goButton" value="Add" onClick="javascript:dbGo()" />
                </td></tr>
            </table>
        <input id="inputAction" type="hidden" name="action" value="add" />
        <input id="inputKey" type="hidden" name="key" value="0" />
        </form>
    </div>
    
    <p id="rcp" class="message">
        There are <span id="rowCount">_</span> rows in the table.
        <input type="button" value="Empty" onClick="javascript:clearDB()" />
    </p>

    <div id="results">
    <!-- results show here -->
    </div>
    
</div>
</body>
</html>





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值