使用 JavaScript 删除 URL 中的片段,不会导致页面重新加载

IT技术 javascript html url fragment-identifier
2021-03-17 01:43:59

背景:我有一个 HTML 页面,可以让您扩展某些内容。由于这种扩展只需要加载页面的一小部分,它是通过 JavaScript 完成的,而不是通过定向到新的 URL/HTML 页面。但是,作为奖励,用户可以永久链接到此类扩展部分,即向其他人发送类似的 URL

http://example.com/#foobar

并立即为该其他用户打开“foobar”类别。这可以使用 parent.location.hash = 'foobar',所以这部分很好。

现在的问题是:当用户在页面上关闭这样一个类别时,我想再次清空URL片段,即把http://example.com/#foobar变成http://example.com/来更新永久链接显示. 但是,这样做parent.location.hash = ''会导致整个页面重新加载(例如在 Firefox 3 中),我想避免这种情况。使用window.location.href = '/#'不会触发页面重新加载,但会在 URL 中留下看起来有些不美观的“#”符号。那么在流行的浏览器中是否有一种方法可以在不触发页面刷新的情况下通过 JavaScript 删除包含“#”符号的 URL 锚点?

6个回答

正如其他人提到的,HTML5中的replaceState可用于删除 URL 片段。

下面是一个例子:

// remove fragment as much as it can go without adding an entry in browser history:
window.location.replace("#");

// slice off the remaining '#' in HTML5:    
if (typeof window.history.replaceState == 'function') {
  history.replaceState({}, '', window.location.href.slice(0, -1));
}
现场解答。我现在正在使用这个
2021-04-28 01:43:59
坚硬的。我很欣赏检测到删除 # 的能力,但向后兼容。
2021-05-05 01:43:59

既然您正在控制对哈希值的操作,为什么不只使用表示“无”的标记,例如“#_”或“#default”。

我认为这是一个值得考虑的想法。
2021-05-09 01:43:59
是的,您也可以使用空白锚点,因此 URL 最终为example.com/#这几乎是完美的,但我认为它最终也会让一些访问者看起来有点困惑。理想情况下,甚至不应该有那个哈希字符显示......
2021-05-19 01:43:59
明显地。您的脚本应该在散列中没有任何内容的情况下运行。
2021-05-20 01:43:59

您可以使用闪亮的新 HTML5window.history.pushStatereplaceState方法,如ASCIIcasts 246:AJAX 历史状态GitHub 博客 中所述这使您可以更改整个路径(在同一源主机内)而不仅仅是片段。要试用此功能,使用最近的浏览器浏览GitHub 存储库

还有另一种选择而不是使用哈希,您可以使用javascript: void(0); 示例:<a href="javascript:void(0);" class="open_div">Open Div</a>

我想这也取决于您何时需要这种链接,因此您最好检查以下链接:

如何使用它:http : //www.brightcherry.co.uk/scribbles/2010/04/25/javascript-how-to-remove-the-trailing-hash-in-a-url/ 或检查辩论什么在这里更好:我应该为 JavaScript 链接使用哪个“href”值,“#”还是“javascript:void(0)”?

将此代码放在 head 部分。

<script type="text/javascript">
    var uri = window.location.toString();
    if (uri.indexOf("?") > 0) {
        var clean_uri = uri.substring(0, uri.indexOf("?"));
        window.history.replaceState({}, document.title, clean_uri);
    }
</script>