关于 URL 中的哈希符号 (#)

1. URL 中哈希符号 (#) 的含义

URL 中的哈希符号 (#) 被用来作为网页中的 锚点 使用,锚点的含义就是页面中的某个特定的位置,这个位置可以被快速找到,很类似于在该位置抛了一个锚。

哈希符号 # 右侧的部分,是这个锚点的唯一标志,例如

http://www.example.com/index.html#section
  • 1

代表了页面 index.html 中存在一个锚点 section,浏览器会自动滚动页面到 section 所指定的位置

下面的例子是如何在 html 中创建一个锚点,首先创建一个超链接,指向该锚点

<a href="#section">锚点跳转</a>
  • 1

在创建锚点所在的位置,只需要创建一个 div 块,使其 id 为 section

<div id="section"></div>
  • 1

这样一来,在页面上点击 “锚点跳转” 时,页面将自动滚动到 id=”section” 的位置。同时,在 URL 后面会补充上 #section

2. http 请求中,# 及其右侧数据不会传递给服务器

URL 中的哈希符号 (#) 用来指示浏览器的操作,对于服务端来说一点用处都没有。所以浏览器(以及我验证过的 http 客户端)发出的 http 请求中是不会携带任何 # 及其右侧数据的。

当访问如下网址时,
·

https://stackoverflow.com/?key=#abc
  • 1

请求如下

可以看出只发送了 https://stackoverflow.com,而不包含 #abc 信息

3. 向服务端传递 # 符号

# 右侧任何的字符都会被当做是锚点的标识符,这也意味着这些数据不会被发送到服务端。但是有的时候如果我们想在 url 中向服务器传递 # 值,这时候需要将 # 编码为 %23,例如

https://stackoverflow.com/?key=%23abc
  • 1

这样服务器将接收到 #abc 作为 key 的值。

4. # 右侧的内容变化不会触发页面重新加载

改变哈希符号 # 右侧的内容,浏览器只会滚动到目标位置,并不会触发页面重新加载,也就是说不会发出任何网络请求。

5. # 右侧的内容变化将改变浏览器的历史记录

每次改变哈希符号 # 右侧的内容,浏览器的访问历史就会增加一条记录。我们可以用 “回退” 键返回之前的位置。

这对于 SPA(single page application) 应用尤为重要。可以在同一个页面中,使用不同的 # 值来表示不同的页面状态。

但这对 IE6 和 IE7 并不适用,当改变哈希符号 # 右侧的内容时,浏览记录并不会增加

6. onhashchange 事件

onhashchange 是 HTML 5 中定义的一个新的事件,当 # 值变化时将被触发。大多数的浏览器都支持这一事件,例如下面的代码,

  1. window.onhashchange = func
  2. <body onhashchange=”func();”>
  3. window.addEventListener(“hashchange”, func, false);

参考:The hash key(#) in the URL - Programmer Lib

在 React 实现二级路由需要使用 React Router 库,并且需要使用哈希路由。哈希路由使用 URL 的 # 符号来实现路由跳转,这样可以避免刷新页面时的数据丢失。以下是实现二级路由的步骤: 1. 安装 React Router 库:在终端使用 npm install react-router-dom 命令安装 React Router 库。 2. 引入 React Router 库:在需要使用路由的组件引入 React Router 库。 3. 创建路由组件:在路由组件使用 Route 组件设置二级路由的路径和对应的组件。 4. 设置路由跳转:在需要跳转到二级路由的组件,使用 Link 组件设置跳转路径。 5. 使用路由懒加载:在设置路由组件时,使用 React.lazy 和 Suspense 组件实现路由懒加载,可以提高页面加载速度。 以下是示例代码: ```javascript import React, { lazy, Suspense } from "react"; import { BrowserRouter as Router, Route, Link } from "react-router-dom"; const Home = lazy(() => import("./Home")); const About = lazy(() => import("./About")); function App() { return ( <Router> <div> <nav> <ul> <li> <Link to="/">Home</Link> </li> <li> <Link to="/about">About</Link> </li> </ul> </nav> <Suspense fallback={<div>Loading...</div>}> <Route exact path="/" component={Home} /> <Route path="/about" component={About} /> </Suspense> </div> </Router> ); } export default App; ``` 在上面的代码,Home 和 About 组件是二级路由的组件,使用 Route 组件设置了二级路由的路径和对应的组件。在需要跳转到二级路由的组件,使用 Link 组件设置跳转路径。使用 React.lazy 和 Suspense 组件实现了路由懒加载。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值