Web Storage实现页面计数器,其中,sessionStorage和localStorage显示的计数不一样,请看详细讲解。
html代码:
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>sessionStorage与localStorage区别</title> </head> <link href="css/css.css" type="text/css" rel="stylesheet"> <body> <div class="mr-cont"> <h1 align="center">计数器</h1> <p class="msg" id="msg_1"> </p> <p class="form_item"> <label for="">要保存的数据:</label> <input type="text" name="text-1" value="" id="text-1"/> </p> <p class="form_item"> <input type="button" name="btn-1" value="session保存" id="btn-1"/> <input type="button" name="btn-2" value="session读取" id="btn-2"/> </p> <p class="form_item"> <input type="button" name="btn-3" value="local保存" id="btn-3"/> <input type="button" name="btn-4" value="local读取" id="btn-4"/> </p> <p class="count_wrap"> session计数:<span class="count" id='session_count'></span> local计数:<span class="count" id='local_count'></span></p> </div> <script src="js/js.js"></script> </body> </html>
js代码:
// JavaScript Document
function getE(ele){ //自定义一个getE()函数
return document.getElementById(ele); //返回并调用document对象的getElementById方法输出变量
}
var text_1 = getE('text-1'), //声明变量并为其赋值
mag = getE('msg_1'),
btn_1 = getE('btn-1'),
btn_2 = getE('btn-2'),
btn_3 = getE('btn-3'),
btn_4 = getE('btn-4');
btn_1.onclick = saveSessionStorage;
btn_2.onclick = loadSessionStorage;
btn_3.onclick = saveLocalStorage;
btn_4.onclick = loadLocalStorage;
function saveSessionStorage(){
sessionStorage.setItem('msg',text_1.value + ' session');
}
function loadSessionStorage(){
mag.innerHTML = sessionStorage.getItem('msg');
}
function saveLocalStorage(){
localStorage.setItem('msg',text_1.value + ' local');
}
function loadLocalStorage(){
mag.innerHTML = localStorage.getItem('msg');
}
//记录页面次数
var local_count = localStorage.getItem('a_count')?localStorage.getItem('a_count'):0;
getE('local_count').innerHTML = local_count;
localStorage.setItem('a_count',+local_count+1);
var session_count = sessionStorage.getItem('a_count')?sessionStorage.getItem('a_count'):0;
getE('session_count').innerHTML = session_count;
sessionStorage.setItem('a_count',+session_count+1);css代码:
@charset "utf-8";
/* CSS Document */
.mr-cont{
width: 800px;
margin: 0 auto;
border: 1px solid #f00;
}
.mr-cont>p{
margin-left: 200px;
}这是关于Web Storage实现页面计数器的完整代码讲解。我将逐行解释HTML和JavaScript代码,并详细说明为什么session计数和local计数表现不同。
HTML代码逐行讲解
<!DOCTYPE html>
声明文档类型:告诉浏览器这是一个HTML5文档,确保浏览器以标准模式渲染页面。
<html> <head> <meta charset="utf-8" /> <title>sessionStorage与localStorage区别</title> </head>
HTML结构开始:设置文档字符编码为UTF-8,页面标题为"sessionStorage与localStorage区别"。
<link href="css/css.css" type="text/css" rel="stylesheet">
引入外部样式表:链接CSS文件用于页面样式美化(虽然未提供具体样式内容)。
<body> <div class="mr-cont"> <h1 align="center">计数器</h1>
页面主体:创建一个容器div,标题为"计数器",居中对齐。
<p class="msg" id="msg_1"> </p>
消息显示区域:一个空段落,id为"msg_1",用于显示从存储中读取的数据。
<p class="form_item"> <label for="">要保存的数据:</label> <input type="text" name="text-1" value="" id="text-1"/> </p>
输入框区域:文本输入框,用户可以输入要保存的数据,id为"text-1"。
<p class="form_item"> <input type="button" name="btn-1" value="session保存" id="btn-1"/> <input type="button" name="btn-2" value="session读取" id="btn-2"/> </p>
session操作按钮:两个按钮分别用于保存数据到sessionStorage和从sessionStorage读取数据。
<p class="form_item"> <input type="button" name="btn-3" value="local保存" id="btn-3"/> <input type="button" name="btn-4" value="local读取" id="btn-4"/> </p>
local操作按钮:两个按钮分别用于保存数据到localStorage和从localStorage读取数据。
<p class="count_wrap"> session计数:<span class="count" id='session_count'></span> local计数:<span class="count" id='local_count'></span></p>
计数器显示区域:显示session计数和local计数的数值,两个span元素分别用于显示对应的计数。
<script src="js/js.js"></script>
引入JavaScript文件:链接外部的JS文件,包含所有交互逻辑。
JavaScript代码逐行讲解
// JavaScript Document
function getE(ele){ //自定义一个getE()函数
return document.getElementById(ele); //返回并调用document对象的getElementById方法输出变量
}定义getE函数:这是一个简化DOM元素获取的辅助函数,通过id获取页面元素,减少重复代码。
var text_1 = getE('text-1'), //声明变量并为其赋值
mag = getE('msg_1'),
btn_1 = getE('btn-1'),
btn_2 = getE('btn-2'),
btn_3 = getE('btn-3'),
btn_4 = getE('btn-4');获取DOM元素:一次性获取页面中所有需要用到的元素,提高代码执行效率。
btn_1.onclick = saveSessionStorage; btn_2.onclick = loadSessionStorage; btn_3.onclick = saveLocalStorage; btn_4.onclick = loadLocalStorage;
绑定点击事件:为四个按钮分别绑定对应的处理函数,当用户点击按钮时执行相应的存储或读取操作。
function saveSessionStorage(){
sessionStorage.setItem('msg',text_1.value + ' session');
}session保存函数:将用户在输入框中输入的内容加上" session"后缀,以键名'msg'存储到sessionStorage中。
function loadSessionStorage(){
mag.innerHTML = sessionStorage.getItem('msg');
}session读取函数:从sessionStorage中读取键名为'msg'的数据,并显示在id为'msg_1'的元素中。
function saveLocalStorage(){
localStorage.setItem('msg',text_1.value + ' local');
}local保存函数:将用户输入的内容加上" local"后缀,以键名'msg'存储到localStorage中。
function loadLocalStorage(){
mag.innerHTML = localStorage.getItem('msg');
}local读取函数:从localStorage中读取键名为'msg'的数据,并显示在id为'msg_1'的元素中。
//记录页面次数
var local_count = localStorage.getItem('a_count')?localStorage.getItem('a_count'):0;
getE('local_count').innerHTML = local_count;
localStorage.setItem('a_count',+local_count+1);local计数器逻辑:
第1行:检查localStorage中是否已有键名为'a_count'的数据,如果有则获取其值,否则初始化为0
第2行:将获取到的计数值显示在local计数器的span元素中
第3行:将计数值加1后重新存储到localStorage中
var session_count = sessionStorage.getItem('a_count')?sessionStorage.getItem('a_count'):0;
getE('session_count').innerHTML = session_count;
sessionStorage.setItem('a_count',+session_count+1);session计数器逻辑:
第1行:检查sessionStorage中是否已有键名为'a_count'的数据,如果有则获取其值,否则初始化为0
第2行:将获取到的计数值显示在session计数器的span元素中
第3行:将计数值加1后重新存储到sessionStorage中
为什么session计数和local计数不一样?
核心区别:
1. 生命周期不同
localStorage:数据永久存储,除非用户手动清除浏览器数据或通过代码删除,否则数据会一直存在。即使关闭浏览器、重启电脑,数据仍然保留。
sessionStorage:数据仅在当前会话(session)中有效。当用户关闭当前浏览器标签页或窗口时,数据会被清除。
2. 计数器表现差异
当页面首次加载时,两者的初始值都是0,然后各自加1,都显示为1。
但当你刷新页面时:
local计数:由于localStorage数据永久保存,刷新时会读取到上次存储的值(1),然后加1变为2,显示2
session计数:刷新页面时,sessionStorage数据仍然在当前会话中存在,所以也会读取到上次的值(1),加1变为2,显示2
关键差异场景:
当你关闭浏览器标签页后重新打开页面时:
local计数:会继续累加,因为数据永久保存在localStorage中
session计数:会重置为1,因为sessionStorage随着标签页关闭而被清除了
当你复制标签页时:
local计数:新标签页会继续使用同一个localStorage数据
session计数:新标签页会有独立的sessionStorage,计数从1开始
实际演示效果:
假设你进行了以下操作序列:
首次打开页面:两个计数都显示为1
刷新页面:两个计数都显示为2
关闭标签页后重新打开:local计数显示为3,session计数显示为1
再刷新一次:local计数显示为4,session计数显示为2
这就是为什么session计数和local计数不一样的根本原因——它们的数据存储生命周期不同,导致在不同的使用场景下会有不同的累加行为。