跷跷板理论:每次用户访问网站,相当于创建了一个左侧朝上的跷跷板,跷跷板左边是A页面状态,右边是页面B状态,并且左边跷跷板上方会不断丢数据下来,当丢下来一个较重数据块(用户登录)是,跷跷板将会被翘起,并一直保持该状态
使用场景:控制页面初始化代码,使初始化代码在执行完初始化状态后失效
需求分析:比如在首页的一个span标签中存储着用户登录状态,每次页面更新js扫描着个span,用来判断用户是否登录,是否需要做初始化,
而用户一但登录,这段初始化js在执行完毕之后失效,
如果这样做,会出现什么问题呢
假设,通过登录控制方法进入页面A,后端传递的数据,可以支持初始化正常执行,完毕之后页面正常,之后进入页面B之后再通过按钮访问回到A页面,这时没有登录时传递的数据,页面继续执行初始化,将会失去用户的登录状态
而这种情况是我们不想看到的
我们希望页面A在初始化完成之后,之后的访问不再执行初始化
解决思路是这样的,通过设定一个哨兵变量
if (sessionStorage.getItem('number')==null) {
初始化代码
sessionStorage.setItem('number',2);
}
让页面每次进入时判断number变量的值,如果为null,则执行初始化
否则正常展示
那么在执行完毕之后,我们设置number的值为2,也可以是任意值,不为空就可,
这样就可以实现,
那么这其实是最简单的一种应用,这种方式最好的地方在于,
sessionStorage.setItem('number',2);
这句可以放在别处,因为如果直接放在if最后,如果我多次刷新页面A而不登录,那么之后再登录是,if中的语句将被跳过,初始化块执行了个寂寞,更好的方式是将控制if 的这段代码放在初始化执行过程中
例子
function myfun(){
if (sessionStorage.getItem('number')==null) {//判断是否需要初始化
sessionStorage.setItem('USER_NAME',document.getElementById("user").innerHTML);
}
//该语句有两种状态,1,初始化时,上面的if中语句存页面标签内容,该语句再读到,用于初始化
// 2,初始化完毕之后,USER_NAME变量将一直存在,这时只需要读就可以
var user = sessionStorage.getItem('USER_NAME');
// 提示登录
if(user==""){
//初始化内容
alert("需要登录");
document.getElementById('xtb1').setAttribute('href','#');
}else
{
//使初始化代码失效,
sessionStorage.setItem('number',2);
document.getElementById('xtb1').setAttribute('href','/myaccount');
alert("登录成功");
}
可以看到能将控制if执行的语句放到其他地方,来保证代码的健壮
这个问题到此结束,下面记录一些自己的问题,
在最开始时,我考虑将USER_NAME直接作为if的条件,但因为该变量存储的是页面标签内容,无法做准确的判断,而且页面标签内容一变,判断条件将直接失效,所以不得已只能做哨兵变量number