WHATWG DB Backend (openDatabase). Клиентские хранилища. Технологии будущего. Оптимизация структуры веб-страниц
userData behavior
Flash Local Shared Object
WHATWG DB Backend (openDatabase)
globalStorage и localStorage
Google Gears
Библиотеки для работы с клиентскими хранилищами
Резюме
Рабочая группа WHATWG была организована производителями браузеров Apple, Mozilla Foundation и Opera Software ASA. Именно эта группа создала документ Web Application 1.0, который л?г в основу пятой версии HTML.
В частности, этот документ решал и проблему хранения данных веб-приложения на стороне пользователя. Текущая спецификация HTML5 решает эту проблему иначе, а метод, предложенный данной группой, был реализован в одной из версий движка WebKit и попал в Safari 3.1, который основан на этом движке.
Текущие версии Safari (в том числе под iPhone) и Chromium так же содержат openDatabase (именно так называется эта часть спецификации) и представляют собой несложный доступ к реляционной СУБД SQLite из JavaScript.
Максимальный размер такого хранилища, теоретически ограничен лишь местом на диске и внутренними ограничениями SQLite, но по умолчанию Safari устанавливает предел в 5МБ.
Упрощ?нный (с минимальной обработкой ошибок) класс для доступа к openDatabase выглядит так:
function SafariStorage(name, maxsize) { this.db = null; if (!window.openDatabase) return; try { this.db = openDatabase(name, '1.0 ', 'Storage for ' + name, maxsize); // maxsize — в байтах } catch (e) { this.db = null; return; } this.db.transaction(function (t) { t.executeSql('CREATE TABLE IF NOT EXISTS storage(k TEXT UNIQUE NOT NULL PRIMARY KEY, v TEXT NOT NULL);', []); }) this.get = function (name, fn, scope) { scope = scope || this; this.db.transaction(function (t) { t.executeSql('SELECT v FROM storage WHERE k = ? ', [name], function (t, r) { if (r.rows.length) { fn.call(scope, r.rows.item(0)['v']) } else { fn.call(scope, null)
} }); }); } this.set = function (name, value) { this.db.transaction(function (t) { t.executeSql('INSERT OR REPLACE INTO storage(k, v) VALUES (?, ?)', [name, value]); }); } this.del = function (name) { this.db.transaction(function (t) { t.executeSql('DELETE FROM storage WHERE k = ?', [name]); }); } }
Метод transaction созда?т транзакцию и переда?т её своему аргументу — функции, запрос внутри который будет обработан в единой транзакции. У transaction есть ещ? два аргумента — функции, первая из которых будет вызвана, если транзакция выполнена успешно, вторая — если закончилась ошибкой, объект ошибки будет первым аргументом вызываемой функцией.
У executeSql (обратите внимание на регистр букв!) так же есть опциональные аргументы: после текста запроса и его подстановок, можно указать callback для возвращаемых данных и функцию, которая будет вызвана в случае ошибки с двумя аргументами: транзакцией и объектом ошибки.