你可以使用哈希导航而不影响历史?

恐怕这可能是不可能的,但是有没有办法改变一个URL的哈希值, 而不会在浏览器的历史logging中留下条目,没有重新加载 ? 或者做同样的事情?

就具体情况而言,我正在开发一些基本的哈希导航:

//hash nav -- works with js-tabs var getHash = window.location.hash; var hashPref = "tab-"; function useHash(newHash) { //set js-tab according to hash newHash = newHash.replace('#'+hashPref, ''); $("#tabs li a[href='"+ newHash +"']").click(); } function setHash(newHash) { //set hash according to js-tab window.location.hash = hashPref + newHash; //THIS IS WHERE I would like to REPLACE the location.hash //without a history entry } // ... a lot of irrelavent tabs js and then.... //make tabs work $("#tabs.js-tabs a").live("click", function() { var showMe = $(this).attr("href"); $(showMe).show(); setHash(showMe); return false; }); //hash nav on ready .. if hash exists, execute if ( getHash ){ useHash(getHash); } 

很明显,使用jQuery。 这个想法是, 在这个特定的情况下 1)让用户回头看看每一个标签的变化可以有效地“打破后退button”堆积不必要的引用,和2)不保留哪些标签,他们当前正在刷新一个烦恼。

location.replace("#hash_value_here"); 直到我发现它不适用于IOS Chrome。 在这种情况下,使用:

 history.replaceState(undefined, undefined, "#hash_value") 

history.replaceState()的运行方式与history.pushState()完全相同,只是replaceState()修改了当前的历史logging,而不是创build一个新的历史logging。

记住要保持#或URL的最后部分将被改变。

 location.replace("#hash_value_here"); 

以上似乎做你以后的事情。

编辑:现在已经有几年了,浏览器已经发展了。

// @ Luxiyalu的答案是要走的路

老答案

我也认为这是不可能的(在这个时候)。 但是,如果你不打算使用它,为什么你需要改变散列值呢?

我相信我们为什么使用哈希值作为程序员的主要原因是让用户为我们的页面添加书签,或者在浏览器历史logging中保存一个状态。 如果你不想这样做,那就把状态保存在一个variables中,然后从那里开始工作。

我认为使用散列的理由是使用一个不受我们控制的值。 如果你不需要它,那么这可能意味着你拥有了一切可以控制的东西,所以把状态存储在一个variables中并且使用它。 (我喜欢重复自己)

我希望这能够帮到你。 也许有一个更容易解决您的问题。

更新:这个怎么样:

  1. 设置第一个散列,并确保它保存在浏览器历史logging中。
  2. 当一个新的选项卡被选中,做window.history.back(1) ,这将使历史从你的第一个初始散列回来。
  3. 现在你设置了新的散列,因此标签只会在历史logging中input一个条目。

您可能必须使用一些标志,以了解当前条目是否可以通过返回来“删除”,或者只是跳过第一步。 而且要确保,当你强制执行history.back时,你的加载方法“hash”不会执行。

您总是可以创build一个事件侦听器来捕获超链接上的单击事件,并在callback函数中放入e.preventDefault(),这将防止浏览器将其插入到历史logging中。

 history.replaceState(undefined, undefined, "#profileInfo") 

其中#profileInfo是您的ID。