仅删除 URL 的最后一个哈希,该哈希是使用 window.location.hash 添加的

Posted

技术标签:

【中文标题】仅删除 URL 的最后一个哈希,该哈希是使用 window.location.hash 添加的【英文标题】:Remove only the last hash of the URL, which was added with window.location.hash 【发布时间】:2019-07-04 04:42:57 【问题描述】:

我有一个模态框的问题,它在打开时会在当前 url 中添加一个哈希(可能有其他哈希)

01

这段代码对我来说很好,但是当哈希被删除时会留下这个 "#"

window.location.hash = location.hash.replace(/#About/, '');

示例 当模式打开时: www.mywebsite.com/#products#About

当模态关闭时: www.mywebsite.com/#products#

我想得到什么: www.mywebsite.com/#products


02

也可以试试这个,它可以正常工作,但消除了所有以前的哈希

history.pushState("", document.title, window.location.pathname);

history.pushState("", document.title, window.location.pathname + window.location.search);

结果:

当模式打开时: www.mywebsite.com/#products#About

当模态关闭时: www.mywebsite.com(我不想删除以前的哈希)


这是我的代码:

$(".barMenuFooter a.buttonShowDetail").on('click', function()  
$(this).toggleClass('active');
if ($(this).hasClass("active")) 
    window.location.hash = location.hash + "#About";
    openAbout();    

 else 
    window.location.hash = location.hash.replace(/#About/, '');
    closeAbout();   
    
 );

我只想完全删除最后添加的哈希(不带#)而不重新加载页面。

【问题讨论】:

试试window.location.hash = window.location.hash.split('#').slice(0,-1).join('#')。看看有没有帮助 【参考方案1】:

您可以使用正则表达式在您的网址中查找最后一个“哈希”:

 > "site.com/#place1/#place2".replace(/\#$|\#[A-z0-9]*$/, "")
 'site.com/#place1/'

 > "site.com/#place1#".replace(/\#$|\#[A-z0-9]*$/, "")
 'site.com/#place1'

 > "site.com/#place1/#".replace(/\#$|\#[A-z0-9]*$/, "")
 'site.com/#place1/'

/\#$/ 这将匹配出现在字符串 (url) 末尾的最后一个哈希 (#)。

/\#[A-z0-9]*$/ 这将匹配出现在字符串(url)末尾的最后一个哈希(#)及其后的任何字符或数字。

【讨论】:

请注意,[A-z0-9] 不是匹配[A-Za-z0-9] 的好方法,因为它在 ASCII 规则下包含十进制范围 91..96 中的许多标点符号;在 EBCDIC 中甚至更不建议这样做,尽管这对您来说不太可能成为问题。

以上是关于仅删除 URL 的最后一个哈希,该哈希是使用 window.location.hash 添加的的主要内容,如果未能解决你的问题,请参考以下文章

如何删除除第一个之外的所有 URL 哈希?

在 Laravel Homestead 中使用 Vue.js 时从 URL 中删除 # 哈希

从 Vue JS + Laravel 中的 URL 中删除哈希

使用 JS/jQuery 从 URL 中删除哈希

如何使用 Selenium 打开带有哈希的 URL?

如何在不刷新页面的情况下使用 JavaScript 从 window.location (URL) 中删除哈希?