本地存储
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>本地存储</title> 6 </head> 7 <body> 8 <h1>webStorage本地存储</h1> 9 <p id="msg"></p> 10 <p id="forever"></p> 11 <input type="text" id="input"> 12 <input type="button" value="保存数据" onclick="saveStorage('input');"> 13 <input type="button" value="读取数据" onclick="loadStorage('msg');"> 14 </body> 15 <script type="text/javascript"> 16 function saveStorage(id){ 17 var target = document.getElementById(id); 18 var str = target.value; 19 sessionStorage.setItem('mess',str);//临时保存 20 localStorage.setItem('mess',str);//永久保存 21 } 22 23 function loadStorage(id){ 24 var target = document.getElementById(id); 25 var forever = document.getElementById('forever'); 26 var msg = sessionStorage.getItem('mess'); 27 target.innerHTML = "临时数据:" + msg; 28 forever.innerHTML = "永久数据:" + localStorage.getItem('mess'); 29 } 30 </script> 31 </html>
测试本地存储是否已被填充
在 main.js 开头,我们先测试本地存储是否已被填充(即,页面之前被访问过):
if(!localStorage
.getItem('bgcolor')){
populateStorage();
}else
{
setStyles();
}
Storage.getItem()
方法用来从存储中获取一个数据项。该例中,我们测试 bgcolor
数据项是否存在。如果不存在,执行 populateStorage()
来将存在的自定义值添加到存储中。如果有值存在,则执行 setStyles()
来使用存储的值更新页面的样式。
备注:你还可以使用 Storage.length
来测试存储对象是否为空。
从存储中获取值
正如上面提到的,使用 Storage.getItem()
可以从存储中获取一个数据项。该方法接受数据项的键作为参数,并返回数据值。例如:
functionsetStyles()
{
var
currentColor
=localStorage
.getItem('bgcolor');
var
currentFont
=localStorage
.getItem('font');
var
currentImage
=localStorage
.getItem('image');
document
.getElementById('bgcolor').value
=currentColor
;
document
.getElementById('font').value
=currentFont
;
document
.getElementById('image').value
=currentImage
;
htmlElem
.style
.backgroundColor
='#'
+
currentColor
;
pElem
.style
.fontFamily
=currentFont
;
imgElem
.setAttribute('src',currentImage
);
}
首先,前三行代码从本地中获取值。接着,将值显示到表单元素中,这样在重新加载页面时与自定义设置保持同步。最后,更新页面的样式和图片,这样重新加载页面后,你的自定义设置重新起作用了。
在存储中设置值
Storage.setItem()
方法可被用来创建新数据项和更新已存在的值。该方法接受两个参数——要创建/修改的数据项的键,和对应的值。
functionpopulateStorage()
{
localStorage
.setItem('bgcolor',document
.getElementById('bgcolor').value
);
localStorage
.setItem('font',document
.getElementById('font').value
);
localStorage
.setItem('image',document
.getElementById('image').value
);
setStyles();
}
populateStorage()
方法在本地存储中设置三项数据 — 背景颜色、字体和图片路径。然后执行 setStyles()
方法来更新页面的样式。
同时,我们为每个表单元素绑定了一个 onchange
监听器,这样,一个表单值改变时,存储的数据和页面样式会更新。
bgcolorForm
.onchange
=populateStorage
;
fontForm
.onchange
=populateStorage
;
imageForm
.onchange
=populateStorage
;
通过 StorageEvent 响应存储的变化
无论何时,Storage
对象发生变化时(即创建/更新/删除数据项时,重复设置相同的键值不会触发该事件,Storage.clear()
方法至多触发一次该事件),StorageEvent
事件会触发。在同一个页面内发生的改变不会起作用——在相同域名下的其他页面(如一个新标签或 iframe)发生的改变才会起作用。在其他域名下的页面不能访问相同的 Storage 对象。
在事件结果页面中的 JavaScript 如下所示(可见 events.js):
window
.addEventListener('storage',function(
e
){
document
.querySelector('.my-key').textContent
=e
.key
;
document
.querySelector('.my-old').textContent
=e
.oldValue
;
document
.querySelector('.my-new').textContent
=e
.newValue
;
document
.querySelector('.my-url').textContent
=e
.url
;
document
.querySelector('.my-storage').textContent
=e
.storageArea
;
});
这里,我们为 window 对象添加了一个事件监听器,在当前域名相关的 Storage
对象发生改变时该事件监听器会触发。正如你在上面看到的,此事件相关的事件对象有多个属性包含了有用的信息——改变的数据项的键,改变前的旧值,改变后的新值,改变的存储对象所在的文档的 URL,以及存储对象本身。
删除数据记录
Web Storage 提供了一对简单的方法用于移除数据。我们没用在我们的 demo 中使用这些方法,但是添加到你自己的项目中很简单:
Storage.removeItem()
接受一个参数——你想要移除的数据项的键,然后会将对应的数据项从域名对应的存储对象中移除。Storage.clear()
不接受参数,只是简单地清空域名对应的整个存储对象。