前端路由的实现(三) —— History的pushState和replaceState用法

HTML5中history提供的pushStatereplaceState这两个API。它们提供了操作浏览器历史栈的方法。

pushState能够在不加载页面的情况下改变浏览器的URL。这个方法接受三个参数:

状态对象新状态的标题可选的相对URL。

 history.pushState(data, null, ‘#/page=1‘);
    pushState接收3个参数,第一个参数为一个obj,表示浏览器的state属性;
    第二个参数是document.title的值,一般设定为`null`;
    第三个参数string,用以改变当前url

pushState方法在改变url的同时向浏览器历史栈中压入新的历史记录

接收url的参数为string类型,用以改变当前地址栏的url.需要注意的一点就是这个参数不能和跨域,即协议,域名,端口必须都是相同的,如果出现跨域的情况,即会提示:

Example:

其中 replaceState:

  replaceState接收的参数pushState相同,但是最终的效果是:地址栏url会根据接收的参数而变化,但是浏览器并未在当浏览历史栈中增加浏览器的历史记录,而是替换当前的浏览器历史记录。

通过pushStatereplaceState虽然能改变URL,但是不会主动触发浏览器reload

window对象还提供 popstate方法

这个方法用以监听浏览器在不同历史记录中进行切换,而触发相应的事件

在浏览器提供的history对象上还有goback方法,用以模拟用户点击浏览器的前进后退按钮。在某个web应用当中,比如点击了<a>标签,发生了页面的跳转。这时调用history.back()方法后页面回退,同时页面发生刷新,这时window.onpopstate无法监听这个事件。但是如果是通过pushState或者replaceState改变URL不发生浏览器刷新的话,再使用history.back()history.go(),这样popstate事件会被触发

输出如下:

注意:  通过pushState在url上添加?page=1可以通过location.search去获取search的内容。不过如果通过location.search去改变url的话是会主动触发浏览器reload的。

API大致了解了,那么这些方法可以运用到哪些地方呢?一个比较常用的场景是就在单页应用中,通过这些API完成前端的路由设计,利用pushStatereplaceState可以改变url同时浏览器不刷新,并且通过 popstate 监听浏览器历史记录的方式,完成一系列的异步动作。

简单的路由如下:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Document</title>
  <style>
    a {color: red;text-decoration: underline;}
  </style>
</head>
<body>
  <a data-href="/post">post</a>
  <a data-href="/login">login</a>
  <script>
       const Router = [];
       const addRoute = (path =‘‘, handle=() =>{}) => {
        let obj = {
          path,
          handle
        };
        Router.push(obj);
       }
       // 添加路由定义
       addRoute(‘/post‘, function(){
        // todo...
          alert(‘/post‘);
       })
       addRoute(‘/login‘, function(){
        // todo...
         alert(‘login‘);
       })
       // 路由处理
       const routeHandle = (path) => {
        for(var item of Router){
          if (item.path === path) {
            item.handle.apply(null, [path]);
            return true;
          }
        }
       }
       document.addEventListener(‘click‘, function(e) {
        let dataset = e.target.dataset;
        if(dataset) {
            if(routeHandle(dataset.href)) {
                var url = window.location.href;
                history.pushState({route: dataset.href}, null, oriUrl + dataset.href);
                //阻止默认行为
                return false;
                // e.preventDefault();
            }
        }
    })
  </script>
</body>
</html>

大致的实现思路就是,通过<a>添加路由信息,然后拦截<a>标签的默认行为,并与注册的路由信息进行匹配。若匹配成功调用对应的handle方法

原文地址:https://www.cnblogs.com/xuzhudong/p/8886752.html

时间: 2024-08-12 01:33:49

前端路由的实现(三) —— History的pushState和replaceState用法的相关文章

前端路由模式hash和history

hash模式hash模式的原理是依据window对象的onhashchange事件进行监听,它的特点是:虽然hash路径出现在URL中,但是不会出现在HTTP请求中,对后端完全没有影响,因此改变hash值不会重新加载页面. window.onhashchange = function(e){ console.log(e); } 打印出来的结果可以通过location.hash获得浏览器url路径中的#部分内容,上图是#bvc,如果想获取#后面的内容可通过location.hash.slice(1

前端路由的原理

什么是路由?简单的说,路由是根据不同的 url 地址展示不同的内容或页面 使用场景?前端路由更多用在单页应用上, 也就是SPA, 因为单页应用, 基本上都是前后端分离的, 后端自然也就不会给前端提供路由. 前端的路由和后端的路由在实现技术上不一样,但是原理都是一样的.在 HTML5 的 history API 出现之前,前端的路由都是通过 hash 来实现的,hash 能兼容低版本的浏览器. 两种实现前端路由的方式HTML5 History两个新增的API:history.pushState 和

Vue-两种路由模式 hash 和 history

Vue 为了构建 SPA(单页面应用),需要引入前端路由系统,这也就是 Vue-Router 存在的意义.前端路由的核心,就在于 —— 改变视图的同时不会向后端发出请求. hash 模式和 history 模式都属于浏览器自身的特性,Vue-Router 只是利用了这两个特性(通过调用浏览器提供的接口)来实现前端路由. Hash: History: 原文地址:https://www.cnblogs.com/yangchin9/p/10895721.html

前端路由hash、history原理

本文参考https://www.cnblogs.com/tugenhua0707/p/10859214.html 先来看下后端路由的实现方式: 1. 浏览器向服务器发出请求.2. 服务器监听到80端口,如果有请求过来,那么就解析url地址.3. 服务器根据客户端的路由配置,然后就返回相应的信息(比如html字符串.json数据或图片等).4. 浏览器根据数据包的 Content-Type来决定如何解析数据. 缺点: 每次路由切换的时候都需要去刷新页面,然后发出ajax请求,然后将请求数据返回回来

javascript基础修炼(6)——前端路由的基本原理

[造轮子]是笔者学习和理解一些较复杂的代码结构时的常用方法,它很慢,但是效果却胜过你读十几篇相关的文章.为已知的API方法自行编写实现,遇到自己无法复现的部分再有针对性地去查资料,最后当你再去学习官方代码的时候,就会明白这样做的价值,总有一天,你也将有能力写出大师级的代码. 一. 前端路由 现代前端开发中最流行的页面模型,莫过于SPA单页应用架构.单页面应用指的是应用只有一个主页面,通过动态替换DOM内容并同步修改url地址,来模拟多页应用的效果,切换页面的功能直接由前台脚本来完成,而不是由后端

vue-learning:38 - router - 前端路由的发展

前端路由的发展 参考博客 前端路由是什么东西? 什么是路由 在jQuery时代,我们使用<a href="https://www.example.com/example/home.html">实现页面切换. 其响应过程是这样的 1.浏览器发出请求 2.服务器监听到指定端口的请求,并解析url路径 3.浏览器根据数据包的Content-Type来决定如何解析数据 4.根据服务器的路由配置,返回相应信息(比如返回html文件的字串,也可以是 json 数据,图片等) 5.浏览器

vue-router之前端路由的学习总结

什么是路由 路由就是通过互联网把信息从源地址传输到目的地的活动 --维基百科 举例路由器: 路由器提供了两种机制:路由和转送 路由是决定数据包从来源到目的地的路径 转送将输入端的数据转移到合适的输出端 路由里有一个非常重要的概念叫路由表 本质上就是一个映射表,决定了数据包的指向 开发中路由的几个阶段 后端路由阶段 URL发送到服务器,服务区进行正则匹配,经过处理,生成HTML或者数据(html,css,js),返回给前端,完成一个IO操作(input:输入,output:输出) 前后端分离阶段

前端路由实现原理 - 王汉镇的博客

前端路由的方式有两种 history路由:history.pushState()+popState事件 hash路由:location.hash+hashchange事件 history路由 history API是HTML5新增的API,跟路由有关的两个API是 history.pushState()和history.repalceState() 这两个api都可以操作浏览器的历史记录,而且不会引起刷新.不过前者会向浏览器新增一条历史记录,而后者是直接替换当前的历史记录. 这两个api都接受三

Web开发中 前端路由 实现的几种方式和适用场景

浅析Web开发中前端路由实现的几种方式 主题 Web开发 故事从名叫Oliver的绿箭虾`说起,这位大虾酷爱社交网站,一天他打开了 Twitter ,从发过的tweets的选项卡一路切到followers选项卡,Oliver发现页面的内容变化了,URL也变化了,但为什么页面没有闪烁刷新呢?于是Oliver打开的网络监控器(没错,Oliver是个程序员),他惊讶地发现在切换选项卡时,只有几个XHR请求发生,但页面的URL却在对应着变化,这让Oliver不得不去思考这一机制的原因- 叙事体故事讲完,