46

背景:我有一个 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 中留下看起来不太好看的“#”符号。那么在流行的浏览器中是否有一种方法可以在不触发页面刷新的情况下删除包含“#”符号的 URL 锚点?

4

8 回答 8

53

正如其他人所提到的, 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));
}
于 2012-12-11T16:20:07.130 回答
14

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

于 2008-11-06T15:22:40.967 回答
4

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

于 2011-01-06T19:44:29.860 回答
1

还有另一种选择,而不是使用哈希,您可以使用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)”?

于 2011-01-05T09:29:51.700 回答
1

将此代码放在头部。

<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>
于 2016-01-07T16:52:09.857 回答
-1
$(document).ready(function() {
        $(".lnk").click(function(e) {
            e.preventDefault();
            $(this).attr("href", "stripped_url_via_desired_regex");
        });
    });
于 2008-11-06T15:28:42.297 回答
-1

所以使用

parent.location.hash = ''第一的

然后做

window.location.href=window.location.href.slice(0, -1);
于 2009-07-16T16:58:19.217 回答
-2

正如其他人所说,你不能这样做。另外......说真的,作为jQuery Ajaxy的作者——我已经部署了完整的 ajax 网站多年了——我可以保证没有最终用户曾经抱怨过,或者甚至可能注意到有这个散列的事情正在发生,用户不要’只要它有效并且他们得到他们想要的东西,就不会在乎。

一个合适的解决方案是 HTML5 PushState/ReplaceState/PopState ;-) 它不再需要片段标识符: https ://developer.mozilla.org/en/DOM/Manipulating_the_browser_history 对于支持此功能的 HTML5 和 HTML4 兼容项目HTML5 状态功能检查https://github.com/browserstate/History.js :-)

于 2011-01-05T09:58:20.450 回答