在JavaScript中删除URL中的片段w / out导致页面重新加载

背景:我有一个HTML页面,可以让你展开某些内容。 由于只有小部分的页面需要加载进行这种扩展,所以通过JavaScript完成,而不是通过指向新的URL / HTML页面。 然而,作为奖励,用户能够永久地固定到这样的扩展部分,即向其他人发送类似的URL

http://example.com/#foobar

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

现在的问题是:当用户在页面上closures这样的类别时,我想再次清空URL片段,即将http://example.com/#foobar变成http://example.com/来更新固定链接显示。 但是,使用parent.location.hash = ''会导致重新加载整个页面(例如,在Firefox 3中),这是我想避免的。 使用window.location.href = '/#'将不会触发页面重新加载,但在URL中留下一些看上去很前卫的“#”号。 那么在stream行的浏览器中有没有一种方法可以在不触发页面刷新的情况下JavaScript去除包含“#”符号的URL定位符?

正如其他人所提到的,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)); } 

由于您正在控制散列值上的操作,为什么不使用“#_”或“#default”的“无”的标记。

抱歉说,但如果清空location.hash没有完成任务,答案是否定的 – )

您可以使用shiny的新HTML5 window.history.pushStatereplaceState方法,如ASCIIcast 246:AJAX History State和GitHub博客中所述 。 这使您可以更改整个path(在同一个源主机中),而不仅仅是片段。 要试用此function, 请使用最近的浏览器浏览GitHub存储库 。

还有另一种select,而不是使用散列,你可以使用javascript: void(0); 例如: <a href="javascript:void(0);" class="open_div">Open Div</a> <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链接“#”或“javascript:void(0)”的哪个“href”值?

所以使用

parent.location.hash = ''第一

然后做

 window.location.href=window.location.href.slice(0, -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> 
 $(document).ready(function() { $(".lnk").click(function(e) { e.preventDefault(); $(this).attr("href", "stripped_url_via_desired_regex"); }); }); 

正如其他人所说,你不能这样做。 再加上……作为jQuery Ajaxy作者 – 我已经部署了完整的ajax网站多年 – 现在我可以保证没有terminal用户曾经抱怨过,或者甚至可能曾经注意到有这个哈希事情正在进行,只要它能够工作,他们就能得到他们所需要的东西。

一个合适的解决scheme是HTML5 PushState / ReplaceState / PopState ;-)不再需要fragement-identifier: https : //developer.mozilla.org/en/DOM/Manipulating_the_browser_history对于支持HTML5和HTML4的兼容项目HTML5状态function签出browserstate/History.html 🙂