首页 > 其他分享 >监听浏览器更新URL参数,实现伪SPA单页面应用

监听浏览器更新URL参数,实现伪SPA单页面应用

时间:2024-05-30 16:21:38浏览次数:23  
标签:浏览器 URL url window const SPA pushState history

在老的jqury项目中通常实现SPA一般都采用hash值变化来进行监听,但是有的项目中我们也想采用改变URL参数来进行监听,一般我们使用window.history.pushState方法来改变url参数;

为了在使用 window.history.pushStatewindow.history.replaceState 后能够检测到浏览器的后退按钮操作,可以通过监听 popstate 事件来处理浏览器导航历史变化。popstate 事件在用户点击浏览器的后退或前进按钮时触发。

说明:
1、监听浏览器地址URL的参数变化;
2、点击浏览器前进和后退按钮的时候也可触发监听事件;

 

下面是示例代码:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <button onclick="changeUrl()">改变URL参数</button>

    <script>
      /**
       * 改变url参数
       * 随便找个简单的例子2个参数p1和p2
       * */
      function changeUrl() {
        let random = Math.floor(Math.random() * 100);
        let newP = `p1=${random}&p2=${random * 2}`;
        updateUrlWithNewParams(newP);
      }

      // 注册修改 pushState 和 replaceState 以触发自定义事件
      (function (history) {
        const pushState = history.pushState;
        const replaceState = history.replaceState;

        history.pushState = function (state, title, url) {
          const result = pushState.apply(history, arguments);
          const urlChangeEvent = new Event(urlChangeEventType);
          window.dispatchEvent(urlChangeEvent);
          return result;
        };

        history.replaceState = function (state, title, url) {
          const result = replaceState.apply(history, arguments);
          const urlChangeEvent = new Event(urlChangeEventType);
          window.dispatchEvent(urlChangeEvent);
          return result;
        };
      })(window.history);
      // 自定义事件类型
      const urlChangeEventType = "urlChange";
      // 监听 popstate 事件以处理浏览器后退和前进操作
      window.addEventListener("popstate", function (event) {
        const urlChangeEvent = new Event(urlChangeEventType);
        window.dispatchEvent(urlChangeEvent);
      });
      // 监听自定义的 URL 变化事件
      window.addEventListener(urlChangeEventType, function (event) {
        // 在这里处理 URL 变化后的逻辑
        pageInit();
      });
      // 更新url参数
      function updateUrlWithNewParams(newParams) {
        // 获取当前URL
        let url = window.location.href;
        let baseUrl = url.split("?")[0]; // 基础URL
        let newParamsObj = new URLSearchParams(newParams); // 新的参数对象

        // 构造新的URL
        let newUrl = `${baseUrl}?${newParamsObj.toString()}`;

        // 使用history.pushState更新URL,不重新加载页面
        window.history.pushState({ path: newUrl }, "", newUrl);
      }

      function getUrlParams(url = window.location.href) {
        const params = {};
        // 使用 URL 构造函数解析 URL
        const urlObj = new URL(url);
        // 获取查询字符串
        const queryString = urlObj.search;
        // 使用 URLSearchParams 解析查询字符串
        const urlSearchParams = new URLSearchParams(queryString);

        // 遍历所有参数并添加到对象
        for (const [key, value] of urlSearchParams.entries()) {
          params[key] = value;
        }

        return params;
      }

      function pageInit() {
        alert("修改url了");
        console.log("新参数", getUrlParams());
      }
    </script>
  </body>
</html>

 

标签:浏览器,URL,url,window,const,SPA,pushState,history
From: https://www.cnblogs.com/tymyj/p/18222608

相关文章

  • Notes: Understanding the linux kernel Chapter 9 Process Address Space
    ProcessAddressSpaceWhenaUserModeprocessasksfordynamicmemory,itdoesn’tgetadditionalpageframes;instead,itgetstherighttouseanewrangeoflinearaddresses,whichbecomepartofitsaddressspace.Thisintervaliscalleda“memoryre......
  • SparkSQL编程-DataFrame
    SparkSession在老的版本中,SparkSQL提供两种SQL查询起始点:一个叫SQLContext,用于Spark自己提供的SQL查询;一个叫HiveContext,用于连接Hive的查询。从2.0开始,SparkSession作为Spark最新的SQL查询起始点,实质上是SQLContext和HiveContext的组合,所以在SQLContext......
  • SparkSQL概述
    为了给熟悉RDBMS(关系数据库管理系统)但又不理解MapReduce的技术人员提供快速上手的工具,hive应运而生,它是运行在Hadoop上的SQL-on-hadoop工具;但是MapReduce计算过程中大量的中间磁盘落地过程消耗了大量的I/O,运行效率低;sparksql则是采用内存存储可以减少大量的中间......
  • Spark的共享变量
    传递给Spark的函数,如map()或者filter()的判断条件函数,能够利用定义在函数之外的变量,但是集群中的每一个task都会得到变量的一个副本,并且task对变量进行的更新则不会被返回给driver.而Spark的两种共享变量:累加器(accumulator)和广播变量(broadcastvariable).累加器......
  • Springboot报class path resource [xxxxx.json] cannot be resolved to URL because i
    当Springboot解析resources文件下的json文件时,在本地环境好用,部署到服务器上找不到文件内容报错classpathresource[xxxxx.json]cannotberesolvedtoURLbecauseitdosenotexist问题排查(1)pom.xml文件配置<build><resources><resource><d......
  • Javascript:如何替换 urls 和 youtube urls,并将 urls 替换为锚标签,将 youtube urls 替
    如果字符串返回:str=``https://www.google.comhttp://google.comhttps://www.youtube.com/live/gNIQWYgf-0https://www.youtube.com/embed/3ul2LYG6j14?si=fgxYHjyt6zBmoYErhttps://youtu.be/75Dhfjf6hfjfj这还必须考虑到......
  • 【python007】读取csv文件url多进程下载图片数据(最近更新中)
    1.熟悉、梳理、总结项目研发实战中的Python开发日常使用中的问题、知识点等2.欢迎点赞、关注、批评、指正,互三走起来,小手动起来!3.欢迎点赞、关注、批评、指正,互三走起来,小手动起来!4.欢迎点赞、关注、批评、指正,互三走起来,小手动起来!......
  • spark sql导出数据为excel文件和csv文件
    一、利用to_csv函数导出数据为csv文件:df=spark.sql('''select*fromtable;''')df.toPandas().to_csv('table.csv',index=False)其中:index=False参数表示在保存时不包括行索引。二、利用to_excel函数导出数据为excel文件:df=spark.sql('''select*from......
  • spark sql中的FORMAT_NUMBER和ROUND函数
    一、例子:FORMAT_NUMBER(ROUND(value,2),'0.00')二、ROUND函数的作用:用于将数值字段舍入到指定的小数位数,如果未指定小数位数,则默认将数字舍入到最接近的整数。三、FORMAT_NUMBER函数的作用:用于将数字格式化为指定的格式,而不是进行舍入。四、两者的区别:如果小数点后面的数字,最......
  • spark sql中的几种数据库join
    一、连接类型:InnerJoin:内连接;FullOuterJoin:全外连接;LeftOuterJoin:左外连接;RightOuterJoin:右外连接;LeftSemiJoin:左半连接;LeftAntiJoin:左反连接;NaturalJoin:自然连接;Cross(orCartesian)Join:交叉(或笛卡尔)连接。二、crossjoin的例子:WITH......