js中的历史状态管理方法总结
原创
©著作权归作者所有:来自51CTO博客作者wx63fc582aa165f的原创作品,请联系作者获取转载授权,否则将追究法律责任
通过观看妙味视频以及看js高级程序设计对历史状态管理做一个小小的总结,方便以后查阅
我们知道浏览器上面有个“前进”和“后退”按钮,如果我们不做过多的设置,它们只有当我们打开了一个新页面的时候才会起作用,而在现代web应用中,用户每次操作不一定会打开一个全新的页面,因此“后退”和“前进”按钮也就失去了作用,导致用户很难在不同状态间切换。
要解决这个问题,有两种方法
1、hashchange事件(当url参数列表及URL中#后面的所有字符串发生变化时触发该事件):改变hash值来管理
看个例子(随机选彩票)
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>无标题文档</title>
<script>
window.onload = function(){
var oInput = document.getElementById('input1');
var oDiv = document.getElementById('div1');
var json = {};
oInput.onclick = function(){
var num = Math.random();//随机产生0-1的数字
var arr = randomNum(35,7);//随机生成7个1-35之间的数字
json[num] = arr;将数组存入json中
oDiv.innerHTML = arr;//将数组中的值添加到页面中
window.location.hash = num;//每次单击按钮时改变URL中#后面的数字
};
window.onhashchange = function(){//当URL中#后面的字符串改变时触发该事件
oDiv.innerHTML = json[window.location.hash.substring(1)];
};
function randomNum(iAll,iNow){
var arr = [];
var newArr = [];
for(var i=1;i<=iAll;i++){//生成从1-iAll的数字,并将其放入arr数组中
arr.push(i);
}
for(var i=0;i<iNow;i++){//从arr数组中随机选出iNow个数字并存入新的数组newArr中
newArr.push( arr.splice( Math.floor(Math.random()*arr.length) ,1) );
}
return newArr;//将这个新数组返回
}
};
</script>
</head>
<body>
<input type="button" value="随机选择" id="input1">
<div id="div1"></div>
</body>
</html>
2、history.pushState()方法:通过状态管理API,能够在不加载新页面的情况下改变浏览器的URL
注意:使用该方法:必须要在服务器下运行
pushState(),该方法可以接收三个参数:状态对象、新状态的标题、可选的相对URL
执行pushState()方法后,新的状态信息就会被加入历史状态栈,而浏览器地址栏也会变成新的相对URL。但是浏览器并不会真的向服务器发送请求,即使状态改变后查询location.href也会返回一个与地址栏相同的地址。注意:第二个参数目前没有浏览器实现,因此完全可以只传入一个空字符串,或者一个短标题也可以。而第一个参数则应该尽可能提供初始化页面状态所需的各种信息。
因为pushState()会创建新的历史状态,所以你会发现“后退”按钮也能使用了》按下“后退”按钮,会触发window对象的popstate事件。而popstate事件的事件对象有一个state属性,这个属性就包含着当初以第一个参数传递给pushState()状态的对象
注意:网址是虚假的,需在服务器指定对应页面,不然刷新找不到页面
下面看用pushState()方法实现随机选彩票功能
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>随机选彩票</title>
<script>
window.onload = function(){
var oInput = document.getElementById('input1');
var oDiv = document.getElementById('div1');
oInput.onclick = function(){
var arr = randomNum(35,7);
history.pushState(arr,'',arr);
oDiv.innerHTML = arr;
};
window.onpopstate = function(ev){//state是event对象下的属性
var ev = ev||event;
oDiv.innerHTML = ev.state;
};
function randomNum(iAll,iNow){
var arr = [];
var newArr = [];
for(var i=1;i<=iAll;i++){
arr.push(i);
}
for(var i=0;i<iNow;i++){
newArr.push( arr.splice( Math.floor(Math.random()*arr.length) ,1) );
}
return newArr;
}
};
</script>
</head>
<body>
<input type="button" value="随机选择" id="input1">
<div id="div1"></div>
</body>
</html>