104

恐怕这可能是不可能的,但是有没有一种方法可以更改 URL 的哈希值,而无需在浏览器的历史记录中留下条目无需重新加载?或者做同样的事情?

就细节而言,我正在开发一些基本的哈希导航,如下所示:

//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)如果他们点击刷新,则不保留他们当前所在的选项卡是烦恼。

4

4 回答 4

107

location.replace("#hash_value_here"); worked fine for me until I found that it doesn't work on IOS Chrome. In which case, use:

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

history.replaceState() operates exactly like history.pushState() except that replaceState() modifies the current history entry instead of creating a new one.

Remember to keep the # or the last part of the url will be altered.

于 2014-05-29T02:39:13.947 回答
103
location.replace("#hash_value_here"); 

以上似乎做了你所追求的。

于 2011-08-04T17:08:20.437 回答
5

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

@Luxiyalu的答案是要走的路

--旧答案--

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

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

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

我希望这能够帮到你。也许有一个更简单的解决方案来解决您的问题。

更新: 这个怎么样:

  1. 设置第一个哈希,并确保它保存在浏览器历史记录中。
  2. 当一个新选项卡被选中时, do window.history.back(1),这将使历史从你的第一个 init 哈希返回。
  3. 现在您设置了新的哈希,因此制表符只会在历史记录中创建一个条目。

您可能必须使用一些标志,以了解当前条目是否可以通过返回来“删除”,或者您是否只是跳过第一步。并且要确保,当您强制history.back.

于 2010-02-21T07:41:16.610 回答
-2

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

于 2013-06-13T15:01:27.103 回答