原生JS路由实现页面跳转

简介: 写JS原生路由时可从以下几个方面入手 监听a标签,并给href里的url加锚点链接 一般情况下菜单栏的加载模式中,都是通过<a>中的href='/xxxx’来跳转到指定的页面,所以路由的第一步就是监听到此菜单栏中<a href='/xxx'>的点击事件,并在点击时通过event.preventDefault()阻止浏览器的默认行为。阻止默认行为后,咱们就可以通过#/index这种形式给拿到的url加锚 监听hashchange事件,并在监听被触发时加载对应的页面 通过hashchange函数来监听加了锚之后的url(即hash),监听到hash的变化后,我们可以拿到点击时的url,通过调用R

原生JS路由

原生JS路由学习地址

写JS原生路由时可从以下几个方面入手
  1. 监听a标签,并给href里的url加锚点链接
一般情况下菜单栏的加载模式中,都是通过<a>中的href='/xxxx'来跳转到指定的页面,所以路由的第一步就是监听到此菜单栏中<a

href='/xxx'>`的点击事件,并在点击时通过event.preventDefault()阻止浏览器的默认行为。阻止默认行为后,咱们就可以通过#/index这种形式给拿到的url加锚

  1. 监听hashchange事件,并在监听被触发时加载对应的页面
通过hashchange函数来监听加了锚之后的url(即hash),监听到hash的变化后,我们可以拿到点击时的url,通过调用Router(params)时传入的params参数来找到此文件的静态路径,然后传入到iframe
的 src中。
  1. 在Router调用时添加目标容器,添加首页加载
在这个例子中使用的内容容器是个iframe,所以我需要考虑多个iframe嵌套下的Loader目标(target)问题,当然,首页也是需要可以设置默认加载的。

代码示例:
1.html文件


<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <meta name="description">
  <title>Document</title>
  <style>
    @import url('https://fonts.googleapis.com/css?family=Montserrat:400,400i,700');
    a {
      text-decoration: none;
      background: white;
      border-radius: 10px;
      padding: .5em 1em;
      font-weight: bold;
    }
    body {
      display: grid;
      grid-template-columns: auto 1fr;
      min-height: 100vh;
      margin: 0;
      font-family: 'Montserrat';
    }
    nav {
      display: flex;
      flex-direction: column;
      background: #f1f1f1;
      padding: 3.2rem 1rem;
      gap: 1rem;
    }
    #root {
      padding: 2rem;
      max-width: min(75ch, 90%);
      margin-inline: auto;
    }
  </style>
</head>
<body>
  <nav>
    <a href="/">Home</a>
    <a href="/about">About Us</a>
    <a href="/services">Our Services</a>
    <a href="/contact">Contact Us</a>
  </nav>
  <div id="root"></div>

  <script src="app.js"></script>
</body>
</html>

2.app.js

const siteTitle = 'A Fabulous Company'

const routes = {
  404: {
    page: '/pages/404.html',
    title: '404 | ' + siteTitle,
    description: 'Page not found'
  },
  '/': {
    page: '/pages/home.html',
    title: 'Home | ' + siteTitle,
    description: 'Home Page'
  },
  '/about': {
    page: '/pages/about.html',
    title: 'About Us | ' + siteTitle,
    description: 'About Us'
  },
  '/services': {
    page: '/pages/services.html',
    title: 'Our Services | ' + siteTitle,
    description: 'Our Services'
  },
  '/contact': {
    page: '/pages/contact.html',
    title: 'Contact Us | ' + siteTitle,
    description: 'Contact Us'
  }
}

document.querySelector('nav').addEventListener('click', (e) => {
  if (e.target.matches('a')) {
    e.preventDefault()
    useRoute()
  }
})

const useRoute = (e) => {
  e = e || window.event
  e.preventDefault()
  window.history.pushState({page: window.location.pathname}, '', e.target.href)
  renderPage()
}

const renderPage = async () => {
  const location = window.location.pathname
  const route = routes[location] || routes[404]
  const response = await fetch(route.page)
  const data = await response.text()
  document.querySelector('#root').innerHTML = data
  document.title = route.title
  document.querySelector('meta[name="description"]')
    .setAttribute('content', route.description)
}

window.onpopstate = renderPage
window.useRoute = useRoute
renderPage()

(代码借鉴上面链接)

目录
相关文章
|
11天前
|
前端开发 API 开发者
Next.js 实战 (五):添加路由 Transition 过渡效果和 Loading 动画
这篇文章介绍了Framer Motion,一个为React设计的动画库,提供了声明式API处理动画和页面转换,适合创建响应式用户界面。文章包括首屏加载动画、路由加载Loading、路由进场和退场动画等主题,并提供了使用Framer Motion和next.js实现这些动画的示例代码。最后,文章总结了这些效果,并邀请读者探讨更好的实现方案。
|
5月前
|
JavaScript 前端开发 开发者
Vue.js 框架大揭秘:响应式系统、组件化与路由管理,震撼你的前端世界!
【8月更文挑战第27天】Vue.js是一款备受欢迎的前端JavaScript框架,以简洁、灵活和高效著称。本文将从三个方面深入探讨Vue.js:响应式系统、组件化及路由管理。响应式系统为Vue.js的核心特性,能自动追踪数据变动并更新视图。例如,通过简单示例代码展示其响应式特性:`{{ message }}`,当`message`值改变,页面随之自动更新。此外,Vue.js支持组件化设计,允许将复杂界面拆分为独立且可复用的组件,提高代码可维护性和扩展性。如创建一个包含标题与内容的简单组件,并在其他页面中重复利用。
92 3
|
2月前
|
缓存 前端开发 JavaScript
JavaScript前端路由的实现原理及其在单页应用中的重要性,涵盖前端路由概念、基本原理、常见实现方式
本文深入解析了JavaScript前端路由的实现原理及其在单页应用中的重要性,涵盖前端路由概念、基本原理、常见实现方式(Hash路由和History路由)、优点及挑战,并通过实际案例分析,帮助开发者更好地理解和应用这一关键技术,提升用户体验。
91 1
|
4月前
|
缓存 JavaScript 中间件
优化Express.js应用程序性能:缓存策略、请求压缩和路由匹配
在开发Express.js应用时,采用合理的缓存策略、请求压缩及优化路由匹配可大幅提升性能。本文介绍如何利用`express.static`实现缓存、`compression`中间件压缩响应数据,并通过精确匹配、模块化路由及参数化路由提高路由处理效率,从而打造高效应用。
214 16
|
3月前
|
JavaScript
Node.js 路由
10月更文挑战第5天
29 2
|
3月前
|
JavaScript 前端开发 API
前端技术分享:Vue.js 动态路由与守卫
【10月更文挑战第1天】前端技术分享:Vue.js 动态路由与守卫
|
3月前
|
资源调度 JavaScript UED
如何使用Vue.js实现单页应用的路由功能
【10月更文挑战第1天】如何使用Vue.js实现单页应用的路由功能
|
3月前
|
JavaScript 前端开发 UED
JavaScript 地址信息与页面跳转
JavaScript 地址信息与页面跳转
78 1
|
4月前
|
移动开发 前端开发 JavaScript
原生JavaScript+canvas实现五子棋游戏_值得一看
本文介绍了如何使用原生JavaScript和HTML5的Canvas API实现五子棋游戏,包括棋盘的绘制、棋子的生成和落子、以及判断胜负的逻辑,提供了详细的代码和注释。
55 0
原生JavaScript+canvas实现五子棋游戏_值得一看
|
3月前
|
JavaScript 前端开发 UED
JavaScript 地址信息与页面跳转
JavaScript 地址信息与页面跳转
51 0