返回顶部
首页 > 资讯 > 前端开发 > JavaScript >如何制作自己的原生JavaScript路由
  • 858
分享到

如何制作自己的原生JavaScript路由

2024-04-02 19:04:59 858人浏览 八月长安
摘要

目录前言简介javascript 的 History api实现自己的原生js路由基于 History API 的 Vanilla JS 路由设置使“后退”和“前进”按钮起作用初始化

前言

当你想到路由时,通常会想到类似React之类的库。但实际上,这些库和框架仍然使用vanillaJavaScript。那么该怎么实现呢?

我希望这个“JavaScript路由教程”能够帮你了解如何用原生js写出自己的路由。

简介

我遇到了很多出于各种原因想要自己创建路由的人。既然你看到本文,那意味着你可能也是其中的一个!

最重要的是,使用vanillajsrouter可以减少你对框架的依赖。

只要你了解实现它所涉及的所有部分,就可以相对容易的在原生 JavaScript 中创建自己的路由。

以下是制作自己的JS router时要了解的关键事项:

1.原生 JS 路由的关键是location.pathname属性。

2.侦听 “popstate”事件以响应.pathname的更改。每当在浏览器的地址栏中输入新的 URL,但我们不想刷新页面时,就会发生这种情况,我们只是想通过加载新内容来刷新视图。

3.你可以选择将路由存储在routes[]数组中。

4.必须用JavaScript 正则表达式RegEx)才能解析 URL。

5.如果希望将路由集成到本机浏览器体系结构中,那么对history和history.pushState(JavaScript 的 History API)的基本了解至关重要。

首先,我们将处理 History API。

JavaScript 的 History API

我看过很多没有提到 JavaScript History API 的vanilla JS router教程。太糟糕了,因为单击浏览器的“后退”和“前进”按钮与浏览历史记录中的 URL 导航有关。如果没有 History API,就无法谈论路由。

1.history.back()与history.Go(-1)相同,或者当用户在浏览器中单击Back按钮时。你可以用任何一种方法达到相同的效果。

2.当用户按下浏览器的Forward按钮时,将执行history.forward(),它等效于history.go(1)”。

3.go()与.back()和forward()方法相似,不同之处在于你可以指定浏览器历史记录栈中要前进或后退的步数。 。

4.pushState()会将新状态推送到 History API。

5..length属性是会话历史记录中的元素数。

6..state属性用于查找状态,而无需侦听“ popstate”事件。

实现自己的原生JS路由

基于 History API 的 Vanilla JS 路由设置

先让我们仔细研究构建 URL 切换器所需的最少代码(而无需刷新页面),然后我会向你展示其的工作方式的 GIF 动图。


<html>
    <head>
        <title>Hello</title>
        <script type = "module">
            function select_tab(id) {
                // remove selected class from all buttons
                document.querySelectorAll(".route").forEach(item => item.classList.remove('selected'));
                // select clicked element (visually)
                document.querySelectorAll("#" + id).forEach(item => item.classList.add('selected'));
            }
            function load_content(id) {
                // Update text "Content loading for {id}..."
                // Of course, here you would do you content loading magic
                // Perhaps run Fetch API to update resources
                document.querySelector("#content").innerHTML = 'Content loading for /' + id + '...';
            }
            function push(event) {
                // Get id attribute of the box or button or link clicked
                let id = event.target.id;
                // Visually select the clicked button/tab/box
                select_tab(id);
                // Update Title in Window's Tab
                document.title = id;
                // Load content for this tab/page
                loadContent(id);
                // Finally push state change to the address bar
                window.history.pushState({id}, `${id}`, `/page/${id}`);
            }
            window.onload = event => {
                // Add history push() event when boxes are clicked
                window["home"].addEventListener("click", event => push(event))
                window["about"].addEventListener("click", event => push(event))
                window["gallery"].addEventListener("click", event => push(event))
                window["contact"].addEventListener("click", event => push(event))
                window["help"].addEventListener("click", event => push(event))
            }
            // Listen for PopStateEvent (Back or Forward buttons are clicked)
            window.addEventListener("popstate", event => {
                // Grab the history state id
                let stateId = event.state.id;
                // Show clicked id in console (just for fun)
                console.log("stateId = ", stateId);
                // Visually select the clicked button/tab/box
                select_tab(stateId);
                // Load content for this tab/page
                loadContent(id);
            });
        </script>
        <style>
            * { 
                font-family: Verdana;
                font-size: 18px;
            }
            #root { display: flex; flex-direction: row; }
            #content { display: flex;
                display: block;
                width: 800px;
                height: 250px;
                
                line-height: 250px;
                border: 2px solid #555;
                margin: 32px;
                text-align: center;
            }
            .route {
                cursor: pointer;
                justify-content: center;
                width: 150px;
                height: 50px;
                
                line-height: 50px;
                position: relative;
                border: 2px solid #555;
                background: white;
                text-align: center;
                margin: 16px;
            }
            .route.selected { background: yellow; }
        </style>
    </head>

    <body>

        <section id = "root">
            <section class = "route" id = "home">/home</section>
            <section class = "route" id = "about">/about</section>
            <section class = "route" id = "gallery">/gallery</section>
            <section class = "route" id = "contact">/contact</section>
            <section class = "route" id = "help">/help</section>
        </section>

        <main id = "content">Content loading...</main>
    
    </body>

</html>

核心是对的window.history.pushState({id}, ${id}, /page/${id});调用;

第一个参数是状态的唯一 ID,第二个是“标签标题”文本,第三个参数是你希望地址栏中要现实的路径。这就是使浏览器无需重新加载页面即可更改 URL 的原因。

结果。现在,每次我们单击按钮时,URL实际上都会在浏览器的地址栏中更改。内容框也会更新。

我们的原生 JS 路由开始运行了。请注意,每次单击按钮时,history.pushState 被触发。我们只需将存储在元素的 id 属性中的 clicked 元素的 id 传递给它即可:home,about,gallery等。它们应与你要导航到的实际页面一致。当然这不是存储页面名称的唯一方法,例如可以用 array [] 或其他任何方式。这就是本例中的操作方式。

当然我们还需要从服务器加载有关该位置的布局和资源的内容。这取决于你的程序。可以是任何东西。

使“后退”和“前进”按钮起作用

通过使用history.pushState,你将自动使Back和Forward按钮导航到上一个或下一个状态。这样做会产生popstate事件。这是你必须再次更新视图的部分。 (第一次是我们单击按钮时。)

但是由于该事件带有单击的id,因此单击Back或Forward时很容易刷新视图并重新加载内容。

我们在这里没有使用react或Vue,因此在我的源代码中load_content将负责直接在 DOM 中更新视图。此区域可能填充了你的 API 加载的某些内容。由于这只是“前端”示例,因此我无法向你展示太多内容。但这就是它在客户端上的工作方式。

初始化服务器端的路由负载

将它们放在一起还需要再执行一个步骤。在我的例子中,只用了router.html。当你第一次在 PWA 中加载此路由时,必须确保如果直接在地址栏中输入/page/home时,它可以工作。

到目前为止,我们仅从前端更改了路由器地址。假定每次你导航到出现在路由按钮上的 URL 时,实际上都会从服务器单独加载该 URL。

因此你有责任确保/page/about将路由器和页面的加载到应用程序的根视图中。它还应突出显示“current”按钮。

实施完毕后,你的路由就完成了。你如何选择重新加载#content元素中的内容完全取决于你自己和你的后端设计。

以上就是如何制作自己的原生JavaScript路由的详细内容,更多关于制作原生JavaScript路由的资料请关注编程网其它相关文章!

--结束END--

本文标题: 如何制作自己的原生JavaScript路由

本文链接: https://lsjlt.com/news/125125.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 如何制作自己的原生JavaScript路由
    目录前言简介JavaScript 的 History API实现自己的原生JS路由基于 History API 的 Vanilla JS 路由设置使“后退”和“前进”按钮起作用初始化...
    99+
    2024-04-02
  • 如何自己实现JavaScript的new操作符
    目录构造函数new 操作符自己实现一个 new构造函数 在介绍new之前,必须要知道什么是构造函数。 构造函数和普通函数在写法上没有任何区别,当一个函数通过new Fun()调用时,...
    99+
    2024-04-02
  • 如何保护自己的javascript代码
    现如今,JavaScript是广大开发者必不可少的编程语言之一。尽管JavaScript带来了高效、美观的网页体验,但也带来了漏洞和安全风险。黑客可以利用你的JavaScript代码进行攻击,从而入侵你的网站或者窃取用户的个人信息。因此如何...
    99+
    2023-05-14
  • 如何开发自己的javascript框架
    在当今的互联网时代中,JavaScript已经成为了开发前端应用程序的必备技能。而在开发Web应用的过程中,JavaScript框架则是无法避免的话题。因为它可以帮助我们更加高效地开发,更好地组织代码,提高代码的可重用性和可维护性。使用Ja...
    99+
    2023-05-17
  • 如何在Pycharm中制作自己的爬虫代码模板
    目录写作背景爬虫代码在 Pycharm 中设置代码模板写作背景 最近本菜鸡有几个网站想要爬,每个爬虫的代码不一样,但 有某种联系,可以抽出一部分通用的代码制成模板,减少代码工作量,于...
    99+
    2024-04-02
  • 如何在微信上制作自己的小程序卖东西
    在当今的数字化时代,微信小程序已成为电商行业的重要平台。本文将详细解析电商微信小程序的制作流程,帮助你了解从零到上线的过程。 一、前期准备 确定商城定位和目标群体:在制作电商微信小程序前,你需要明确商城的定位,如销售什么产品、面...
    99+
    2023-10-11
    微信小程序
  • thinkphp如何进行拦截路由的操作
    这篇文章主要介绍“thinkphp如何进行拦截路由的操作”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“thinkphp如何进行拦截路由的操作”文章能帮助大家解决问题。一、什么是路由拦截路由拦截是指对...
    99+
    2023-07-06
  • 如何使用JavaScript定义自己的ajax函数
    这篇文章将为大家详细讲解有关如何使用JavaScript定义自己的ajax函数,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。由于用原生js的方式发起的网络请求,都是以查询字符串的形式,提交给服务器的,用户...
    99+
    2023-06-21
  • Netty、MINA、Twisted中如何定制自己的协议
    这篇文章给大家分享的是有关Netty、MINA、Twisted中如何定制自己的协议的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。之前介绍了一些消息分割的方案,以及 MINA、Netty、Twisted 针对这些方...
    99+
    2023-06-03
  • 如何将 Gitee 作为自己的二级域名
    Gitee 是国内的一个开源代码托管平台,与 GitHub 类似,是程序员们常用的一个平台。很多开发者想要将自己的代码托管在 Gitee 平台上,同时又想将 Gitee 作为自己的二级域名,这样可以更方便地分享代码,让别人能够更快速地访问到...
    99+
    2023-10-22
  • 若依ruoyi——手把手教你制作自己的管理系统【三、代码生成】
    增删改查导一( ̄︶ ̄*)) 按钮换个色一((* ̄3 ̄)╭ ********* 专栏略长 ==== 爆肝万字 ==== 细节狂魔 ==== 请准备好一键三连 ********* 修改后的页面: 干干净净贼舒服一Ψ( ̄∀ ̄)Ψ——Ψ( ̄...
    99+
    2023-08-19
    前端 java 数据库
  • JavaScript如何控制Session的实现原理
    本篇内容主要讲解“JavaScript如何控制Session的实现原理”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“JavaScript如何控制Session的...
    99+
    2024-04-02
  • 如何在Gitee上操作找到自己的图床
    Gitee是一个知名的国内Git代码托管平台,对于开发者们来说,它的功能非常强大且易用。它不仅可以免费创建私有仓库,还可以免费创建免费的图床存储空间。因此,很多人都利用Gitee作为自己的图床来保存一些图片资源。但是,对于一些新手来说,在G...
    99+
    2023-10-22
  • 子进程如何在自己的目录上工作?
    php小编柚子在这篇文章中将为大家介绍子进程如何在自己的目录上工作。子进程是由父进程创建的,它们共享父进程的资源。在某些情况下,我们希望子进程能够在自己的目录上独立工作,而不是与父进程...
    99+
    2024-02-09
  • 如何使用SUSE Studio定制自己的Linux发行版
    今天小编给大家分享一下如何使用SUSE Studio定制自己的Linux发行版的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。...
    99+
    2023-06-27
  • 如何在Java和Django之间寻找自己的编程之路?
    在计算机编程领域,Java和Django都是非常流行的编程语言。Java是一种广泛应用于企业级应用和互联网应用的编程语言,而Django则是一种流行的Python Web框架,主要用于创建Web应用程序。 如果你正在寻找自己的编程之路,那么...
    99+
    2023-10-25
    django path 编程算法
  • 如何在Go语言中实现路由的版本控制
    如何在Go语言中实现路由的版本控制随着软件的迭代更新,特别是在Web开发过程中,版本控制已经成为了一个非常重要的问题。在Go语言中,我们可以通过一些简单的方法来实现路由的版本控制。本文将会介绍如何在Go中实现路由的版本控制,并且提供一些代码...
    99+
    2023-12-17
    Go语言 路由 版本控制
  • linux如何控制通向网络‘192.168.0.0/16’的静态路由
    ...
    99+
    2024-04-02
  • Python 数组和 JavaScript 框架:如何选择适合自己的?
    随着计算机科学的发展,人们对于各种编程语言和框架的需求也越来越多样化。Python 和 JavaScript 是两种非常流行的编程语言,它们分别拥有自己的数组和框架。但如何选择适合自己的呢? Python 数组 Python 是一种高级编...
    99+
    2023-10-28
    数组 javascript 框架
  • 租用日本服务器如何选择适合自己的线路
    选择适合自己的日本服务器线路,可以根据以下几点来进行选择: 速度和稳定性:选择一个速度快且稳定的线路,可以提高网站访问的体验和稳...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作