使用hash和history实现前端历史状态切换,触发事件驱动函数来完成部分数据的加载(使用hash和history实现前端路由切换,含完整源码+注释)(代码片段)

勇敢*牛牛 勇敢*牛牛     2022-11-29     271

关键词:

根据loaction下的这个hash值变化,触发事件驱动函数来完成部分数据的加载

根据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历史状态记录

根据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>

hash和history的区别仅仅是#吗?

目前单页应用(SPA)越来越成为前端主流,单页应用一大特点就是使用前端路由,由前端来直接控制路由跳转逻辑,而不再由后端人员控制,这给了前端更多的自由。目前前端路由主要有两种实现方式:hash模式和history模式,下... 查看详情

前端路由实现(history)

HTML5history新增了两个API:history.pushState和history.replaceState两个API都接收三个参数:1.状态对象(stateobject):一个javascript对象,与用pushstate()方法创建的新历史记录条目关联。无论何时用户导航到新创建的状态,popstate事件都会被... 查看详情

hash和history的原理和区别

原理区别hash原理:hash通过监听浏览器的onhashchange()事件变化,查找对应的路由规则history原理:利用H5的history中新增的两个APIpushState()和replaceState()和一个事件onpopstate监听URL变化history模式利用了HTML5HistoryInterface中新增的pushState()... 查看详情

react学习之路由hashrouter和browserrouter(代码片段)

React路由有两种实现方式:HashRouter:利用hash实现路由切换BrowserRouter:利用h5Api实现路由切换1.1HashRouter利用hash实现路由切换<body><divid="root"></div><ahref="#/a">去/a</a><ahref="#/b">去/b</a></body><script>l... 查看详情

前端路由的实现——history的pushstate和replacestate用法(代码片段)

HTML5中history提供的pushState, replaceState这两个API。它们提供了操作浏览器历史栈的方法。pushState能够在不加载页面的情况下改变浏览器的URL。这个方法接受三个参数:状态对象,新状态的标题和可选的相对URL。history.pushState(data,... 查看详情

浅谈前端路由原理hash和history(代码片段)

浅谈前端路由原理hash和history🎹序言🎸一、前端路由原理1、SPA2、什么时候需要路由🎷二、Hash模式1、定义2、网页url组成部分(1)了解几个url的属性(2)演示3、hash的特点🎺三、History模式1、定义... 查看详情

vue-router中hash模式和history模式的关系

Vue-router中hash模式和history模式的关系在vue的路由配置中有mode选项最直观的区别就是在url中hash带了一个很丑的#而history是没有#的mode:"hash";mode:"history";hash模式和history模式的不同对于vue这类渐进式前端开发框架,为了... 查看详情

vue-两种路由模式hash和history

Vue为了构建 SPA(单页面应用),需要引入前端路由系统,这也就是Vue-Router存在的意义。前端路由的核心,就在于—— 改变视图的同时不会向后端发出请求。hash模式和history模式都属于浏览器自身的特性,Vue-Router只... 查看详情

浅谈前端路由原理hash和history(代码片段)

浅谈前端路由原理hash和history🎹序言🎸一、前端路由原理1、SPA2、什么时候需要路由🎷二、Hash模式1、定义2、网页url组成部分(1)了解几个url的属性(2)演示3、hash的特点🎺三、History模式1、定义... 查看详情

前端路由模式hash和history(代码片段)

hash模式hash模式的原理是依据window对象的onhashchange事件进行监听,它的特点是:虽然hash路径出现在URL中,但是不会出现在HTTP请求中,对后端完全没有影响,因此改变hash值不会重新加载页面。window.onhashchange=function(e)console.log(e);打... 查看详情

hash与history的区别

参考技术Ahash模式和history模式都属于浏览器自身的特性,Vue-Router只是利用了这两个特性(通过调用浏览器提供的接口)来实现前端路由。一般场景下,hash和history都可以,除非你更在意颜值,#符号夹杂在URL里看起来确实有些不... 查看详情

vue2.0路由进阶

一、路由的模式  第一种用history方式实现,HTML5使用window.history.pushState()实现路由的切换而不刷新页面。  第二种使用hash值的方式来实现。  vue2.0两种都可以使用只需要在配置路由时加上  mode:‘history/mode‘  vue2... 查看详情

vue-router是什么(代码片段)

路由就是用来跟后端服务器进行交互的一种方式,通过不同的路径,来请求不同的资源,请求不同的页面是路由的其中一种功能。vue-router是vue.js官方路由管理器。vue的单页应用是基于路由和组件的,路由用于设定访问路径,并... 查看详情

了解啥是hash路由和history路由

参考技术Ahash路由:监听url中hash的变化,然后渲染不同的内容,这种路由不向服务器发送请求,不需要服务端的支持;history路由:监听url中的路径变化,需要客户端和服务端共同的支持;我们一步步实现这两种路由,来深入理... 查看详情

vue路由的两种模式,hash与history

参考技术Avue路由的两种模式,hash与history   对于Vue这类渐进式前端开发框架,为了构建SPA(单页面应用),需要引入前端路由系统,这也就是Vue-router存在的意义。前端路由的核心,就在于———改变视图的同时不会... 查看详情

html5入门教程(八)history详解

参考技术AHTML5新添加了对历史的管理,用户可以通过”前进”和”后退”按钮进行历史页面的切换。这让一些不在新页面中打开的新页面前进后退自如,提高了用户体验。通过haschange事件,可以知道URL的参数什么时候发生了变化... 查看详情

vue-router中hash模式和history模式的区别

参考技术A小白回答:hash模式url带#号,history模式不带#号。大牛解答:形式上:hash模式url里面永远带着#号,开发当中默认使用这个模式。如果用户考虑url的规范那么就需要使用history模式,因为history模式没有#号,是个正常的url... 查看详情

vue-learning:37-router-目录(代码片段)

vue路由vue-router目录前端路由历史服务端渲染(SSR:serversiderender)客户端路由(clientsiderouting)前端路由实现原理hash模式:location.hash和hashChange事件history模式:history和popstate事件vue-routerconstrouter=newVueRouter(option)中的选项对象option路由器 查看详情