案例地址:http://yotcap.top/htm/storage.html
在同一页面添加监听事件监听 storage 并不起作用,所以有以下两种方法用来监听。
- 同源页面添加监听事件
- 同页面重写 storage 方法
1. 监听同源页面中 storage 的变动
storage.html(监听变动页面)
<!doctype html>
<html>
<head>
<meta charset="utf-8" >
<title>test storage</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0">
</head>
<body>
<input id="tInput" type="text" />
<button onclick="addItem()">add</button>
<button onclick="getItem()">get</button>
<br>
<p><a href="storageChange.html" target="_blank" title="修改storage">同源修改storage</a></p>
<p id="changeResult"></p>
<script>
window.addEventListener('storage', function (e) {
let p = document.getElementById('changeResult');
p.innerHTML = `oldValue: ${e.oldValue}<br>newValue: ${e.newValue}<br>from: ${e.url}`;
}, false);
function addItem () {
let value = document.getElementById('tInput').value;
localStorage[value] = value;
}
function getItem () {
let v = document.getElementById('tInput').value;
console.log(localStorage[v], 'getItem');
}
function changeItem () {
let k = document.getElementById('changeInputKey').value;
let v = document.getElementById('changeInputValue').value;
let p = document.getElementById('changeResult');
p.innerHTML = `oldValue: ${localStorage[k]}<br>newValue: ${v}<br>from: this's page`;
localStorage.setItem(k, v);
}
</script>
</body>
</html>
storageChange.html(修改页面)
<!doctype html>
<html>
<head>
<meta charset="utf-8" >
<title>changeStorage</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0">
</head>
<body>
<span>key:</span>
<input id="changeInputKey" type="text" />
<span>value:</span>
<input id="changeInputValue" type="text" />
<button onclick="changeItem()">change</button>
<script>
function changeItem () {
let k = document.getElementById('changeInputKey').value;
let v = document.getElementById('changeInputValue').value;
localStorage[k] = v;
}
</script>
</body>
</html>
2. 监听当前页面 storage 变动
<!doctype html>
<html>
<head>
<meta charset="utf-8" >
<title>test storage</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0">
</head>
<body>
<input id="tInput" type="text" />
<button onclick="addItem()">add</button>
<button onclick="getItem()">get</button>
<br>
<p>页面修改 storage</p>
<span>修改的key</span>
<input id="changeInputKey" type="text" />
<span>修改的value</span>
<input id="changeInputValue" type="text" />
<button onclick="changeItem()">change</button>
<br>
<p id="changeResult"></p>
<script>
let originStorage = localStorage;
let sto = {
setItem: function (key, value) {
let setItemEvent = new Event('setItemEvent');
setItemEvent.key = key;
window.dispatchEvent(setItemEvent);
originStorage.setItem(key, value);
},
getItem: function (key) {
return originStorage.getItem(key);
}
}
window.addEventListener('setItemEvent', function (e) {
// console.log(e);
});
window.addEventListener('storage', function (e) {
let p = document.getElementById('changeResult');
p.innerHTML = `oldValue: ${e.oldValue}<br>newValue: ${e.newValue}<br>from: ${e.url}`;
}, false);
function addItem () {
let value = document.getElementById('tInput').value;
sto.setItem(value, value);
}
function getItem () {
let v = document.getElementById('tInput').value;
console.log(sto.getItem(v), 'getItem');
}
function changeItem () {
let k = document.getElementById('changeInputKey').value;
let v = document.getElementById('changeInputValue').value;
let p = document.getElementById('changeResult');
// localStorage.setItem(k, v);
p.innerHTML = `oldValue: ${sto.getItem(k)}<br>newValue: ${v}<br>from: this's page`;
sto.setItem(k, v);
}
</script>
</body>
</html>