hash路由、history路由

news2025/1/26 17:10:51

hash路由

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <style>
      html,
      body {
        height: 100%;
      }
      ul {
        list-style: none;
        width: 15%;
        border: 1px solid #000;
        margin: 0;
        height: 100%;
        padding: 0;
        float: left;
      }
      ul > li {
        height: 50px;
        line-height: 50px;
        text-align: center;
      }
      ul > li > a {
        text-decoration: none;
        color: #000;
        display: block;
        width: 100%;
        height: 100%;
      }
      #content {
        width: 84%;
        float: left;
        height: 100%;
        border: 1px solid #000;
      }
    </style>
  </head>
  <body>
    <ul>
      <li id="login"><a href="#login">登录</a></li>
      <li id="register"><a href="#register">注册</a></li>
      <li id="userlist"><a href="#userlist">用户列表</a></li>
      <li id="adduser"><a href="#adduser">添加新用户</a></li>
    </ul>
    <div id="content"></div>
    <script>
      // 网页的路由分为两种,一种叫做hash路由,一种叫做History路由

      var obj = {
        login: ` <form>
                    <label>用户名:</label><input type="text" name="user"><br>
                    <label>密码:</label><input type="password" name="password" autocomplete><br>
                    <button type="submit">登录</button>
                    <button type="reset">重置</button>
                </form>`,
        register: `<form>
                        <label>用户名:</label><input type="text" name="user"><br>
                        <label>密码:</label><input type="password" name="password" autocomplete><br>
                        <label>电话号码:</label><input type="text" name="tel"><br>
                        <label>邮箱:</label><input type="text" name="email"><br>
                        <button type="submit">注册</button>
                        <button type="reset">重置</button>
                 </form>`,
        userlist: ` <table>
                <thead>
                        <tr>
                            <th>姓名</th>
                            <th>密码</th>
                            <th>电话</th>
                            <th>邮箱</th>
                        </tr>
                </thead>
                <tbody>
                    <tr>
                        <td>张三</td>
                        <td>123123</td>
                        <td>18363781824</td>
                        <td>18363781824@qq.com</td>
                    </tr>
                    <tr>
                        <td>李四</td>
                        <td>asdasd</td>
                        <td>18638493022</td>
                        <td>18638493022@qq.com</td>
                    </tr>
                    <tr>
                        <td>王五</td>
                        <td>sfwwer</td>
                        <td>18618273742</td>
                        <td>18618273742@qq.com</td>
                    </tr>
                </tbody>
                </table>`,
        adduser: `<form>
                        <label>用户名:</label><input type="text" name="user"><br>
                        <label>密码:</label><input type="password" name="password" autocomplete><br>
                        <label>电话号码:</label><input type="text" name="tel"><br>
                        <label>邮箱:</label><input type="text" name="email"><br>
                        <button type="submit">添加用户</button>
                        <button type="reset">重置</button>
                    </form>`,
      };

      var content, prevLi;
      init();

      function init() {
        // 当hash改变时
        window.onhashchange = hashHandler;
        content = document.getElementById('content');
        //   如果当前地址中有hash,则直接执行hashHandler,就会获取hash,填充内容改变li背景色
        if (location.hash) {
          hashHandler();
        } else {
          // 如果没有hash给当前地址后面添加一个hash默认是login
          location.href += '#login';
        }
      }

      function hashHandler() {
        var name = location.hash.slice(1);
        content.innerHTML = obj[name];
        changeLi(name);
      }

      function changeLi(name) {
        // 如果上一次存储的li是真值,有值,就把上一次存储的li背景色换为白色
        if (prevLi) {
          prevLi.style.backgroundColor = '#FFF';
        }
        // 根据传入name获取当前点击的li
        var li = document.getElementById(name);
        // 将这个li存储给prevli,就是本次点击的li,下次点击时就可以用来判断上次点击是谁
        prevLi = li;
        // 将本次点击li设置背景色为灰色
        li.style.backgroundColor = '#ccc';
      }
    </script>
  </body>
</html>

history路由

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <style>
      html,
      body {
        height: 100%;
      }
      ul {
        list-style: none;
        width: 15%;
        border: 1px solid #000;
        margin: 0;
        height: 100%;
        padding: 0;
        float: left;
      }
      ul > li {
        height: 50px;
        line-height: 50px;
        text-align: center;
      }

      #content {
        width: 84%;
        float: left;
        height: 100%;
        border: 1px solid #000;
      }
      .active{
        background-color: #ccc;
      }
    </style>
  </head>
  <body>
    <ul>
      <li id="login">登录</li>
      <li id="register">注册</li>
      <li id="userlist">用户列表</li>
      <li id="adduser">添加新用户</li>
    </ul>
    <div id="content"></div>
    <script>
      var obj = {
        login: ` <form>
                    <label>用户名:</label><input type="text" name="user"><br>
                    <label>密码:</label><input type="password" name="password" autocomplete><br>
                    <button type="submit">登录</button>
                    <button type="reset">重置</button>
                </form>`,
        register: `<form>
                        <label>用户名:</label><input type="text" name="user"><br>
                        <label>密码:</label><input type="password" name="password" autocomplete><br>
                        <label>电话号码:</label><input type="text" name="tel"><br>
                        <label>邮箱:</label><input type="text" name="email"><br>
                        <button type="submit">注册</button>
                        <button type="reset">重置</button>
                 </form>`,
        userlist: ` <table>
                <thead>
                        <tr>
                            <th>姓名</th>
                            <th>密码</th>
                            <th>电话</th>
                            <th>邮箱</th>
                        </tr>
                </thead>
                <tbody>
                    <tr>
                        <td>张三</td>
                        <td>123123</td>
                        <td>18363781824</td>
                        <td>18363781824@qq.com</td>
                    </tr>
                    <tr>
                        <td>李四</td>
                        <td>asdasd</td>
                        <td>18638493022</td>
                        <td>18638493022@qq.com</td>
                    </tr>
                    <tr>
                        <td>王五</td>
                        <td>sfwwer</td>
                        <td>18618273742</td>
                        <td>18618273742@qq.com</td>
                    </tr>
                </tbody>
                </table>`,
        adduser: `<form>
                        <label>用户名:</label><input type="text" name="user"><br>
                        <label>密码:</label><input type="password" name="password" autocomplete><br>
                        <label>电话号码:</label><input type="text" name="tel"><br>
                        <label>邮箱:</label><input type="text" name="email"><br>
                        <button type="submit">添加用户</button>
                        <button type="reset">重置</button>
                    </form>`,
      };

      var lis,content;
      init();
      function init(){
        lis=document.getElementsByTagName("li");
        content=document.getElementById("content");
        window.onpopstate=popstateHandler;
        for(var i=0;i<lis.length;i++){
            lis[i].onclick=clickHandler;
        }
        // if(history.state){
        //     popstateHandler();
        // }else{
        //     // 当第一次进入时没有历史记录,这时候,可以将当前的历史记录替换为login
        //     history.replaceState("login","login");
        //     // 并且执行popstateHandler用来根据当前的History.state改变效果
        //     popstateHandler();
        // }
        if(!history.state){
            history.replaceState("login","login");
        }
        popstateHandler();
      }

      function clickHandler(){
         var name=this.id;
         content.innerHTML=obj[name];
         history.pushState(name,name)
         changeLi(name)
      }
      function popstateHandler(){
        // console.log(history.state)//获取存储历史中的name
        content.innerHTML=obj[history.state];
        changeLi(history.state);
      }

      function changeLi(name){
        // 根据名字获取到对应的li
        var li=document.getElementById(name);
        // 根据类名获取元素的列表,多个同一个类名的li
         var prevLi=document.getElementsByClassName("active")[0];
        // 如果上一次添加active的li存在,将它的class设置为""
         if(prevLi) prevLi.className="";
        //  设置当前li的class为active
         li.className="active";
      }
    </script>
  </body>
</html>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2282901.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

unity 粒子系统实现碰撞检测(collision)且使粒子不受力

需求&#xff1a;通过碰撞检测的方式&#xff0c;获得粒子碰撞到的物体&#xff0c;并且碰撞之后&#xff0c;粒子的运动方向&#xff0c;旋转等物理性质都保持不变 为什么不用trigger&#xff1f;因为trigger虽然不会使粒子受力&#xff0c;但是在触发回调函数中&#xff0c;…

金融级分布式数据库如何优化?PawSQL发布OceanBase专项调优指南

前言 OceanBase数据库作为国产自主可控的分布式数据库&#xff0c;在金融、电商、政务等领域得到广泛应用&#xff0c;优化OceanBase数据库的查询性能变得愈发重要。PawSQL为OceanBase数据库提供了全方位的SQL性能优化支持&#xff0c;助力用户充分发挥OceanBase数据库的性能潜…

Anaconda安装及使用

文章目录 Anaconda安装关于PyTorch的安装和使用Frequently Asked Questions 在PyCharm中使用PyTorchapex库的安装 声明&#xff1a;以下内容均是根据个人经验总结&#xff0c;可能存在不合理之处&#xff0c;烦请指正。 Anaconda安装 打开Anaconda Prompt 输入&#xff1a;cond…

Prometheus+Grafana监控minio对象存储

1. 安装 MinIO 步骤 1&#xff1a;下载 MinIO 二进制文件 wget https://dl.min.io/server/minio/release/linux-amd64/miniochmod x miniosudo mv minio /usr/local/bin/ 步骤 2&#xff1a;创建数据目录 sudo mkdir -p /data/miniosudo chown -R $USER:$USER /data/minio …

使用Cline+deepseek实现VsCode自动化编程

不知道大家有没有听说过cursor这个工具&#xff0c;类似于AIVsCode的结合体&#xff0c;只要绑定chatgpt、claude等大模型API&#xff0c;就可以实现对话式自助编程&#xff0c;简单闲聊几句便可开发一个软件应用。 但cursor受限于外网&#xff0c;国内用户玩不了&#xff0c;…

[云讷科技]Kerloud Falcon四旋翼飞车虚拟仿真空间发布

虚拟仿真环境作为一个独立的专有软件包提供给我们的客户&#xff0c;用于帮助用户在实际测试之前验证自身的代码&#xff0c;并通过在仿真引擎中添加新的场景来探索新的飞行驾驶功能。 环境要求 由于环境依赖关系&#xff0c;虚拟仿真只能运行在装有Ubuntu 18.04的Intel-64位…

前缀和——连续数组

一.题目描述 525. 连续数组 - 力扣&#xff08;LeetCode&#xff09; 二.题目解析 让我们找到一个最长的数组&#xff0c;里面的0&#xff0c;1个数是相等的。 这道题依旧不能用滑动窗口解决&#xff0c;因为找到满足的之后&#xff0c;需要继续遍历。 我们可以对数组进行转…

QT 通过ODBC连接数据库的好方法:

效果图&#xff1a; PWD使用自己的&#xff0c;我的这是自己的&#xff0c;所以你用不了。 以下是格式。 // 1. 设置数据库连接 QSqlDatabase db QSqlDatabase::addDatabase("QODBC");// 建立和QMYSQL数据库的连接 // 设置数据库连接名称&#xff08;DSN&am…

数字MIC PDM接口

在音频采样中&#xff0c;我们经常会用到PCM&#xff0c;PDM这种方式&#xff0c;它们之间也是有一些区别的。 &#xff11;&#xff1a;PDM 工作原理&#xff1a; PDM使用远高于PCM采样率的时钟采样调制模拟分量&#xff0c;每次采样结果只有1位输出&#xff08;0或1&…

SpringBoot--基本使用(配置、整合SpringMVC、Druid、Mybatis、基础特性)

这里写目录标题 一.介绍1.为什么依赖不需要写版本&#xff1f;2.启动器(Starter)是何方神圣&#xff1f;3.SpringBootApplication注解的功效&#xff1f;4.启动源码5.如何学好SpringBoot 二.SpringBoot3配置文件2.1属性配置文件使用2.2 YAML配置文件使用2.3 YAML配置文件使用2.…

vim如何设置显示空白符

:set list 显示空白符 示例&#xff1a; :set nolist 不显示空白符 示例&#xff1a; &#xff08;vim如何使设置显示空白符永久生效&#xff1a;vim如何使相关设置永久生效-CSDN博客&#xff09;

常用集合-数据结构-MySql

目录 java核心&#xff1a; 常用集合与数据结构: 单例集合: 双列集合: 线程安全的集合: ConcurrentHashMap集合: HashTable集合: CopyOnWriteArrayList集合: CopyOnWriteArraySet集合: ConcurrentLinkedQueue队列: ConcurrentSkipListMap和ConcurrentSkipListSet&…

Android BitmapShader简洁实现马赛克,Kotlin(二)

Android BitmapShader简洁实现马赛克&#xff0c;Kotlin&#xff08;二&#xff09; 这一篇 Android BitmapShader简洁实现马赛克&#xff0c;Kotlin&#xff08;一&#xff09;-CSDN博客 遗留一个问题&#xff0c;xml定义的MyView为wrap_content的宽高&#xff0c;如果改成其…

HarmonyOS基于ArkTS卡片服务

卡片服务 前言 Form Kit&#xff08;卡片开发框架&#xff09;提供了一种在桌面、锁屏等系统入口嵌入显示应用信息的开发框架和API&#xff0c;可以将应用内用户关注的重要信息或常用操作抽取到服务卡片&#xff08;以下简称“卡片”&#xff09;上&#xff0c;通过将卡片添加…

缓存之美:万文详解 Caffeine 实现原理(上)

由于社区最大字数限制&#xff0c;本文章将分为两篇&#xff0c;第二篇文章为缓存之美&#xff1a;万文详解 Caffeine 实现原理&#xff08;下&#xff09; 大家好&#xff0c;我是 方圆。文章将采用“总-分-总”的结构对配置固定大小元素驱逐策略的 Caffeine 缓存进行介绍&…

C# 多线程同步(Mutex | Semaphore)

Mutex: 用于保护临界区&#xff0c;确保同一时间只有一个线程能够访问共享资源&#xff1b; Semaphore: 允许同时有多个线程访问共享资源&#xff0c;但会限制并发访问的数量。 Mutex运行输出 Semaphore运行输出 namespace SyncThreadDemo {internal class Program{static stri…

C++从入门到实战(二)C++命名空间

C从入门到实战&#xff08;二&#xff09;C命名空间 前言一、C的第一个程序二、命名空间&#xff08;一&#xff09;为什么需要命名空间&#xff08;二&#xff09;定义命名空间&#xff08;三&#xff09;使用命名空间1.通过命名空间限定符&#xff1a;2.使用 using 声明&…

广西螺蛳粉:舌尖上的美食传奇

广西螺蛳粉:舌尖上的美食传奇 在广西壮族自治区,有一种小吃以其独特的酸辣鲜香和丰富的历史文化底蕴,成为了无数食客心中的美食传奇——这就是广西螺蛳粉。 一、历史渊源 螺蛳粉最早出现于20世纪70年代末的柳州市,是柳州人民对美食的创新与智慧的结晶。早在40多年前,大量的螺…

基于本地事务表+MQ实现分布式事务

基于本地事务表MQ实现分布式事务 引言1、原理2、本地消息表优缺点3、代码实现3.1、代码执行流程3.2、项目结构3.3、项目源码 引言 本地消息表的方案最初由ebay的工程师提出&#xff0c;核心思想是将分布式事务拆分成本地事务进行处理。本地消息表实现最终一致性。本文主要学习…

Java 大视界 -- Java 大数据中的知识图谱构建与应用(62)

&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎来到 青云交的博客&#xff01;能与诸位在此相逢&#xff0c;我倍感荣幸。在这飞速更迭的时代&#xff0c;我们都渴望一方心灵净土&#xff0c;而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识&#xff0c;也…