Pokedex 2 assigned
Exploration session NEXT week
Creative Project 9 - Opt in!!! Melissa's office hours after class
Cookies...
Sessions...
New privacy laws in Europe are making website owners rethink using cookies
From Wikipedia
localStorage
is a document
property that allows
you to save information across browser sessions (i.e after you close the browser)
sessionStorage
is a document
property that allows
you to save information for this session only, and will be cleared when
the page is closed.
Both localStorage
and sessionStorage
inherit from Storage
class.
Name/value pairs (seen in cookies and Storage) are supported by most every browser
There are three methods we're interested in from Storage
method | description |
---|---|
setItem(keyName, keyValue) | Sets the keyName location in localStorage to be keyValue |
getItem(keyName) | Retrieves the keyValue in localStorage associated with keyName |
removeItem(keyName) | Removes the keyName location in localStorage |
window.localStorage.setItem("Melissa", "Mowgli");
window.localStorage.setItem("Lauren", "Spot");
window.localStorage.setItem("Jacki", "Moss");
let bestPet = window.localStorage.getItem("Lauren");
window.localStorage.removeItem("Jacki");
JavaScript (example)
before closing the browser tab
after closing the browser tab
Similarly for sessionStorage
window.sessionStorage.setItem("Melissa", "Mowgli");
window.sessionStorage.setItem("Lauren", "Spot");
window.sessionStorage.setItem("Jacki", "Moss");
let bestPet = window.sessionStorage.getItem("Lauren");
window.sessionStorage.removeItem("Jacki");
JavaScript (example)
before closing the browser tab
after closing the browser tab
indexDB
cookies
, localStorage
,
sessionStorage
can only store small amounts of
data
indexDB
is a "a low-level API for client-side storage
of significant amounts of structured data, including files/blobs"
indexDB
usageThere are many flavors types of indexDB - so apparently you have to cover your bases with creating the database for your page:
// This works on all devices/browsers, and uses IndexedDBShim as a final fallback
let indexedDB = window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB || window.shimIndexedDB;
// Open (or create) the database
let openDB = indexedDB.open(<dbname>, <version>);
JavaScript (template)
// This works on all devices/browsers, and uses IndexedDBShim as a final fallback
let indexedDB = window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB || window.shimIndexedDB;
// Open (or create) the database
let openDB = indexedDB.open("terms", 1);
JavaScript (example)
indexDB
usageYou need to set callbacks on the new database object, so once the database is created, the tables (schema) can be created.
openDB.onupgradeneeded = function() {
let db = openDB.result;
let store = db.createObjectStore("terms", {keyPath: "term"});
let index = store.createIndex("definition", "definition", { unique: false });
};
openDB.onsuccess = function() {
console.log("Database created!");
}
JavaScript (example)
indexDB
setting values
// Start a new transaction
let db = openDB.result;
let tx = db.transaction("terms", "readwrite");
let store = tx.objectStore("terms");
let index = store.index("definition");
// get the term and definition from the user
store.put({key: userTerm, definition: userDef});
// Close the db when the transaction is done
tx.oncomplete = function() {
db.close();
};
JavaScript (example)
indexDB
getting values
// assume the variable term has been set
let getValue = store.get(term);
getValue.onsuccess = function() {
alert(getValue.result.definition);
};
getValue.onerror = function() {
// error handling here
};
JavaScript (example)
Dexie to the rescue
Dexie is a wrapper around indexDB
that makes it MUCH easier to use.
// create the database (module global)
let db = new Dexie(<name of database>);
window.onload = function() {
// set up the schema
db.version(1).stores({
// this is the table with the columns that are to be indexed.
<tableName>: '<column1>, <column2>...'
});
};
JavaScript (template)
let db = new Dexie("definitions");
window.onload = function() {
// set up the schema
db.version(1).stores({
terms: 'term,definition'
});
};
JavaScript (example)
Putting an item in a table is pretty straight forward:
db.<tableName>.put({"column1": <value1>, "column2": <value2>, ...});
JavaScript (template)
db.terms.put({"term": term, "definition": definition});
JavaScript (example)
There are two ways to get information back out of a table, using either a
callback, or a Promise
// get with a callback
db.<tableName>.get(<key>, function (item) {
// do something here
});
// get with a Promise.
db.<tableName>.get(<key>).then (function (item) {
// do something here
});
JavaScript (template)
db.terms.get(term, function (item) {
console.log("Callback: Item at " + term + " is " + item.definition);
});
db.terms.get(term).then (function (item) {
console.log("Promise: Item at " + term + " is " + item.definition);
});
JavaScript (example)
The one issue with all of these newer technlogies
(localStorage
, sessionStorage
,
indexDB
, and frameworks like Dexie
) is cross
browser compatibilty
What Web Can Do Today (Try this in different browsers or on your phone)
Roadmap of Web Applications on Mobile
Can I use - "provides up-to-date browser support tables for support of front-end web technologies on desktop and mobile web browsers."