小发现之浅谈location.search与location.hash的问题

标题:小发现之浅谈location.search与location.hash的问题

背景介绍

location.search与location.hash是前端开发中常用的两个属性,它们分别用于获取当前url中带的查询参数和锚点参数。这两个属性的使用方式不同,而且在某些情况下会出现一些问题,需要特别注意。

location.search与location.hash的区别

location.search

location.search是获取当前url中的查询参数,格式为?key=value。当出现多个查询参数时,每个参数之间用&符号分隔开来。这个属性返回的值是一个字符串,不包含?符号。举个例子:

当前url:https://www.example.com/search?keyword=apple&category=fruit&page=2
则 location.search 的值为:keywork=apple&category=fruit&page=2

location.hash

location.hash是获取当前url中的锚点参数,格式为#value。锚点参数用于在网页中内部跳转定位,点击链接时可以滚动到相应位置。它不会触发页面刷新。举个例子:

当前url:https://www.example.com/about#contact
则 location.hash 的值为:#contact

使用注意事项

获取查询参数时注意转义问题

当使用location.search获取查询参数时,需要注意参数中可能包含特殊字符(如&、?、=等),这时就需要进行encodeURIComponent编码,否则可能会出现解析错误的问题。比如:

假设跳转到了如下url,其中keyword参数包含了&和=符号:
https://www.example.com/search?keyword=apple&banana=100g=red
则 location.search 的值为:?keyword=apple&banana=100g=red
显然这个值是不正确的,因为&和=符号既用来分隔参数,但也是参数内容中可能出现的字符。
正确的做法是先进行编码,再进行解析:
let params = location.search.substring(1);
let parsedParams = new URLSearchParams(params);
let keyword = decodeURIComponent(parsedParams.get('keyword'));

在锚点参数中使用中文

在锚点参数中使用中文时,需要使用encodeURI进行编码,否则浏览器可能会出现不同的解析结果:

假设跳转到了如下url,其中锚点参数为中文:
https://www.example.com/about#联系我们
则在某些浏览器中,location.hash的值为:#%E8%81%94%E7%B3%BB%E6%88%91%E4%BB%AC
而在另外一些浏览器中,location.hash的值为:#联系我们
为了解决这个问题,需要在跳转时先进行编码:
let anchor = encodeURI('联系我们');
window.location.href = `https://www.example.com/about#${anchor}`;

示例说明

示例1

假设我们需要在页面中显示当前url中的查询参数,可以使用如下代码:

<ul id="query-params"></ul>

<script>
  let params = location.search.substring(1);
  let parsedParams = new URLSearchParams(params);

  parsedParams.forEach((value, key) => {
    let li = document.createElement('li');
    li.textContent = `${key}: ${value}`;
    document.getElementById('query-params').appendChild(li);
  });
</script>

当跳转到https://www.example.com/search?keyword=apple&category=fruit&page=2时,会在页面中显示如下内容:

- keyword: apple
- category: fruit
- page: 2

示例2

假设我们需要在页面中实现跳转到不同章节的功能,当用户点击“目录”中的某个链接时,页面会自动滚动到相应的章节。可以使用如下代码:

<ul id="toc">
  <li><a href="#chapter1">第一章</a></li>
  <li><a href="#chapter2">第二章</a></li>
  <li><a href="#chapter3">第三章</a></li>
</ul>

<h1 id="chapter1">第一章</h1>
<p>这里是第一章的内容</p>

<h1 id="chapter2">第二章</h1>
<p>这里是第二章的内容</p>

<h1 id="chapter3">第三章</h1>
<p>这里是第三章的内容</p>

<script>
  let toc = document.getElementById('toc');
  toc.addEventListener('click', (e) => {
    e.preventDefault();
    let target = e.target.getAttribute('href');
    let anchor = encodeURI(target.substring(1));
    window.location.href = `https://www.example.com/book${target}`;
    window.location.reload();
    // 在加载完成后进行页面滚动
    window.addEventListener('load', () => {
      window.scrollTo({top: document.querySelector(target).offsetTop, behavior: 'smooth'});
    });
  });
</script>

在用户点击“目录”中的某个链接时,页面会跳转到对应的章节,并自动滚动到该章节的位置。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:小发现之浅谈location.search与location.hash的问题 - Python技术站

(0)
上一篇 2023年6月11日
下一篇 2023年6月11日

相关文章

  • webpack HappyPack实战详解

    webpack HappyPack实战详解 什么是 HappyPack HappyPack是一个webpack插件,可以将代码在多个子进程中并行编译,提高构建的速度。 HappyPack使用 使用步骤: 安装 HappyPack: npm install happypack -D 引入 HappyPack: js const HappyPack = requ…

    JavaScript 2023年5月28日
    00
  • es6新特性之 class 基本用法解析

    “es6新特性之 class 基本用法解析”是用于Javascript语言中的类定义机制。下面详细讲解class基本用法解析,包括类的定义、继承、静态方法、getters/setters等。 1.类定义 ES6的类定义机制为Javascript中引入了面向对象编程的思想,具有类似其他面向对象语言的类定义能力。通过这种方式,可以将代码分解为类,类似于函数定义的…

    JavaScript 2023年6月11日
    00
  • javascript图像处理—边缘梯度计算函数

    现在我来详细讲解一下“javascript图像处理—边缘梯度计算函数”的完整攻略。 1. 简介 这是一个用javascript实现的图像处理函数,主要用于计算图像的边缘梯度信息。梯度可以帮助我们检测出图像中物体的边缘,是图像处理中常用的一种方式。 2. 函数参数 该函数需要传入以下参数: imageData:待处理的图像数据,通常是通过canvas的getI…

    JavaScript 2023年5月28日
    00
  • IOS游戏开发之五子棋OC版

    《IOS游戏开发之五子棋OC版》是一篇很好的开发攻略,下面我将详细讲解这篇攻略的内容。 标题1 标题2 标题3 首先,这篇攻略中介绍了五子棋游戏的规则,包括如何在棋盘上下棋,以及如何判断胜负等。然后,文章介绍了如何通过Objective-C来实现五子棋游戏的逻辑,包括如何设计数据模型、如何处理用户的操作以及如何判断胜负等。 示例1:在代码实现方面,作者给出了…

    JavaScript 2023年6月11日
    00
  • 详解JavaScript事件循环

    详解JavaScript事件循环 在了解JavaScript事件循环之前,我们需要先了解几个概念。 概念 进程和线程 进程是一个程序在计算机内被执行的实例。 线程是在进程内独立执行的最小单元。 单线程和多线程 单线程指的是一个进程只有一个线程,多线程指的是一个进程有多个线程。 Javascript是一门单线程语言,无法同时执行多个任务,因此需要采用事件循环机…

    JavaScript 2023年5月18日
    00
  • JavaScript简单计算人的年龄示例

    下面我会详细讲解如何实现“JavaScript简单计算人的年龄示例”,主要步骤如下: 第一步:获取出生年份 要计算一个人的年龄,首先我们需要获取他的出生年份。在JavaScript中,我们可以通过 prompt()函数获取用户在弹出的对话框中输入的信息。代码如下所示: let birthYear = prompt(‘请输入你的出生年份’); 这里用 let …

    JavaScript 2023年5月28日
    00
  • 告诉你什么是javascript的回调函数

    下面是 “告诉你什么是javascript的回调函数”的完整攻略: 什么是回调函数? 回调函数(Callback Function)是一种将一个函数作为参数传递给另一个函数,并且执行这个函数的过程。回调函数在Javascript中经常被使用,特别是在事件处理程序中。 回调函数的语法 回调函数的语法非常简单。以下是一个函数接受一个回调函数作为参数的例子: fu…

    JavaScript 2023年5月27日
    00
  • JavaScript实现form表单的多文件上传

    使用 JavaScript 实现 form 表单的多文件上传,需要按照以下步骤进行: HTML 部分 在 HTML 中添加表单和 input 元素,其中 input 的 type 属性为 file,multiple 属性为 true,表示支持选择多个文件。例如: <form id="form_upload" method=&quot…

    JavaScript 2023年5月27日
    00
合作推广
合作推广
分享本页
返回顶部