根据loaction下的这个hash值变化,触发事件驱动函数

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
ul{
list-style: none;
margin: 0;
padding: 0;
}
li{
float: left;
width: 120px;
height: 30px;
text-align: center;
line-height: 30px;
border: 1px solid #000;
border-left: none;
}
li:first-child
{
border-left: 1px solid #000;
}
.clear::after
{
content: "";
clear: both;
visibility: hidden;
display: block;
height: 0;
overflow: hidden;
}
div{
width: 1000px;
height: 400px;
border: 1px solid #000;
margin-top: 10px;
}
a{
text-decoration: none;
color: #000;
display: block;
width: 100%;
height: 100%;
}
</style>
</head>
<body>
<ul class="clear">
<li id="vegetable"><a href="#vegetable">蔬菜</a></li>
<li id="fruit"><a href="#fruit">水果</a></li>
<li id="meat"><a href="#meat">禽肉</a></li>
<li id="oils"><a href="#oils">粮油</a></li>
</ul>
<div id="div1"></div>
<script>
var data={
vegetable:["大白菜","青菜","白菜","茭白","莲花白","胡萝卜"],
fruit:["苹果","香蕉","菠萝","鸭梨","西瓜","荔枝"],
meat:["鸭肉","牛肉","猪肉","羊肉","鸡肉","鱼肉"],
oils:["绿豆","大米","花生油","菜籽油","橄榄油","大豆"]
}
// 初始化
init();
var div,prev;
function init(){
// 哈希被修改时,触发事件函数
// 多次修改多次重新触发执行函数
window.onhashchange = hashChangeHandler;
div = document.getElementById('div1');
// 判断地址栏有没有哈希地址
if(!location.href.includes('#'))
location.href += "#vegetable"
console.log(location.hash.slice(1));
// changePrev(document.getElementById(location.hash.slice(1)));
// hashChangeHandler();
}
function hashChangeHandler(){
// 每次触发时可以获取哈希值#……
// console.log(location.hash);
var temp = location.hash.slice(1)
var arr = data[location.hash.slice(1)]
// console.log(arr);
// console.log(location.hash.slice(1));
div.innerHTML = arr.join(',')
// 这里使用和上面使用的效果一样
changePrev(document.getElementById(location.hash.slice(1)));
}
function changePrev(elem){
if(prev){
prev.style.backgroundColor= "white"
}
prev = elem;
// 然后给这个标签加上样式
prev.style.backgroundColor = 'pink'
}
</script>
</body>
</html>
根据history.state记录,更新数据渲染
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
ul{
list-style: none;
margin: 0;
padding: 0;
}
li{
float: left;
width: 120px;
height: 30px;
text-align: center;
line-height: 30px;
border: 1px solid #000;
border-left: none;
}
li:first-child
{
border-left: 1px solid #000;
}
.clear::after
{
content: "";
clear: both;
visibility: hidden;
display: block;
height: 0;
overflow: hidden;
}
div{
width: 1000px;
height: 400px;
border: 1px solid #000;
margin-top: 10px;
}
</style>
</head>
<body>
<ul class="clear">
<li id="vegetable">蔬菜</li>
<li id="fruit">水果</li>
<li id="meat">禽肉</li>
<li id="oils">粮油</li>
</ul>
<div id="div1"></div>
<script>
var data={
vegetable:["大白菜","青菜","白菜","茭白","莲花白","胡萝卜"],
fruit:["苹果","香蕉","菠萝","鸭梨","西瓜","荔枝"],
meat:["鸭肉","牛肉","猪肉","羊肉","鸡肉","鱼肉"],
oils:["绿豆","大米","花生油","菜籽油","橄榄油","大豆"]
}
var lis,div,prev;
init();
function init(){
lis = Array.from(document.getElementsByTagName('li'))
// 添加一个history历史监测
window.onpopstate = popstateHandler;
div = document.getElementById('div1')
// 给每一个li添加点击事件
for (let index = 0; index < lis.length; index++) {
lis[index].onclick = clickHandler;
}
// 如果第一次历史状态为空,那么给所谓默认的第一个历史状态添加一个历史状态
var li = history.state? document.getElementById(history.state):lis[0]
history.replaceState(li.id,li.id)
resetData(li)
// resetData(lis[0])
// 将历史记录上的第一次null换为lis[0].id,
// history.replaceState(lis[0].id,lis[0].id)
}
function clickHandler(){
history.pushState(this.id,this.id)
resetData(this)
}
function resetData(elem){
div.innerHTML = data[elem.id]
changePrev(elem)
}
function changePrev(elem){
if(prev){
prev.style.backgroundColor = 'white'
}
prev = elem;
prev.style.backgroundColor = 'pink'
}
function popstateHandler(){
resetData(document.getElementById(history.state))
// console.log(history.state);
}
</script>
</body>
</html>