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

时间:2010-02-21 06:29:21

标签: javascript jquery browser-history fragment-identifier browser-state

我担心它可能是impossible但有一种方法可以更改网址的哈希值,而不会在浏览器的历史记录中保留条目而无需重新加载< / STRONG>?或者做同等的事情?

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

//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)让用户回顾每个标签更改可以通过堆积不必要的引用来有效地“打破后退按钮”,以及2)不保留它们是哪个标签目前在,如果他们点击刷新是一个烦恼。

5 个答案:

答案 0 :(得分:94)

location.replace("#hash_value_here"); 

以上似乎就是你所追求的。

答案 1 :(得分:79)

location.replace("#hash_value_here");工作正常,直到我发现它无法在IOS Chrome上运行。在这种情况下,请使用:

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

history.replaceState()的运行方式与history.pushState()完全相同,只是replaceState()修改当前的历史记录条目而不是创建新的条目。

请记住保持#或网址的最后部分会被更改。

答案 2 :(得分:6)

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

@Luxiyalu的answer是要走的路

- 旧答案 -

我也认为这是不可能的(此时)。但是,如果您不打算使用它,为什么还需要更改哈希值呢?

我认为我们将哈希值用作程序员的主要原因是让用户为我们的页面添加书签,或者在浏览器历史记录中保存状态。如果你不想做任何这些,那么只需将状态保存在变量中,然后从那里开始工作。

我认为使用哈希的原因是使用不受我们控制的值。如果你不需要它,那么它可能意味着你拥有一切在你控制之下,所以只需将状态存储在变量中并使用它。 (我喜欢重复自己)

我希望这会帮助你。也许你的问题更容易解决。

<强>更新 怎么样:

  1. 设置第一个哈希,并确保它保存在浏览器历史记录中。
  2. 选择新标签后,执行window.history.back(1),这会使历史记录从您的第一个初始化哈希值开始。
  3. 现在您设置了新哈希,因此标签只会在历史记录中生成一个条目。
  4. 您可能必须使用一些标志,以了解当前条目是否可以通过返回“删除”,或者您是否只是跳过第一步。 并确保,当您强制history.back时,“哈希”的加载方法不会执行。

答案 3 :(得分:-1)

您始终可以创建一个事件侦听器来捕获超链接上的点击事件,并在回调函数中放置e.preventDefault(),这将阻止浏览器将其插入历史记录中。

答案 4 :(得分:-1)

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

#profileInfo 是您的ID。